You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.7 KiB
119 lines
3.7 KiB
#ifndef AVIO_H
|
|
#define AVIO_H
|
|
|
|
/*
|
|
** 文件读写模块定义的数据结构和函数声明
|
|
*/
|
|
|
|
#define URL_EOF (-1)
|
|
|
|
typedef int64_t offset_t;
|
|
|
|
/* 文件访问的权限的定义 */
|
|
#define URL_RDONLY 0
|
|
#define URL_WRONLY 1
|
|
#define URL_RDWR 2
|
|
|
|
/*
|
|
** URL上下文:表示一个输入(文件或者套接字流 )
|
|
** URLContext 结构表示程序运行的当前广义文件协议使用的上下文,着重于所有广义文件协议共有的
|
|
** 属性(并且是在程序运行时才能确定其值)和关联其他结构的字段
|
|
*/
|
|
typedef struct URLContext
|
|
{
|
|
// 具体的协议
|
|
struct URLProtocol *prot;
|
|
int flags;
|
|
int max_packet_size; // if non zero, the stream is packetized with this max packet size
|
|
void *priv_data; // 对于file,则是一个文件句柄,如果是其他的协议,就可能是其他东西
|
|
char filename[1]; // specified filename
|
|
} URLContext;
|
|
|
|
/*
|
|
** URL协议(针对文件或者套接字流的操作)
|
|
** URLProtocol 定义广义的文件协议,着重于功能函数
|
|
** 一种广义的文件协议对应一个 URLProtocol 结构,
|
|
** 本例删掉了 pipe,udp,tcp等输入协议,仅保留一个 file 协议
|
|
*/
|
|
typedef struct URLProtocol
|
|
{
|
|
const char *name;
|
|
int(*url_open)(URLContext *h, const char *filename, int flags);
|
|
int(*url_read)(URLContext *h, unsigned char *buf, int size);
|
|
int(*url_write)(URLContext *h, unsigned char *buf, int size);
|
|
offset_t(*url_seek)(URLContext *h, offset_t pos, int whence);
|
|
int(*url_close)(URLContext *h);
|
|
struct URLProtocol *next;
|
|
} URLProtocol;
|
|
|
|
/*
|
|
** 广义上的,带缓冲的文件
|
|
*/
|
|
typedef struct ByteIOContext
|
|
{
|
|
// 数据缓冲区
|
|
unsigned char *buffer;
|
|
// 缓冲区大小
|
|
int buffer_size;
|
|
// 有效的字节范围
|
|
unsigned char *buf_ptr, *buf_end;
|
|
// 其他
|
|
void *opaque;
|
|
// 读取数据
|
|
int (*read_buf)(void *opaque, uint8_t *buf, int buf_size);
|
|
// 写入数据
|
|
int (*write_buf)(void *opaque, uint8_t *buf, int buf_size);
|
|
// 调整buffer指针
|
|
offset_t(*seek)(void *opaque, offset_t offset, int whence);
|
|
// 位置
|
|
offset_t pos; // position in the file of the current buffer
|
|
// 是不是必须要刷新
|
|
int must_flush; // true if the next seek should flush
|
|
// 是否到达文件尾部
|
|
int eof_reached; // true if eof reached
|
|
// 是否可写
|
|
int write_flag; // true if open for writing
|
|
// 最大的数据包的大小
|
|
int max_packet_size;
|
|
// 错误码
|
|
int error; // contains the error code or 0 if no error happened
|
|
} ByteIOContext;
|
|
|
|
int url_open(URLContext **h, const char *filename, int flags);
|
|
int url_read(URLContext *h, unsigned char *buf, int size);
|
|
int url_write(URLContext *h, unsigned char *buf, int size);
|
|
offset_t url_seek(URLContext *h, offset_t pos, int whence);
|
|
int url_close(URLContext *h);
|
|
int url_get_max_packet_size(URLContext *h);
|
|
|
|
int register_protocol(URLProtocol *protocol);
|
|
|
|
int init_put_byte(ByteIOContext *s,
|
|
unsigned char *buffer,
|
|
int buffer_size,
|
|
int write_flag,
|
|
void *opaque,
|
|
int(*read_buf)(void *opaque, uint8_t *buf, int buf_size),
|
|
int(*write_buf)(void *opaque, uint8_t *buf, int buf_size),
|
|
offset_t(*seek)(void *opaque, offset_t offset, int whence));
|
|
|
|
offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
|
|
void url_fskip(ByteIOContext *s, offset_t offset);
|
|
offset_t url_ftell(ByteIOContext *s);
|
|
offset_t url_fsize(ByteIOContext *s);
|
|
int url_feof(ByteIOContext *s);
|
|
int url_ferror(ByteIOContext *s);
|
|
|
|
int url_fread(ByteIOContext *s, unsigned char *buf, int size); // get_buffer
|
|
int get_byte(ByteIOContext *s);
|
|
unsigned int get_le32(ByteIOContext *s);
|
|
unsigned int get_le16(ByteIOContext *s);
|
|
|
|
int url_setbufsize(ByteIOContext *s, int buf_size);
|
|
int url_fopen(ByteIOContext *s, const char *filename, int flags);
|
|
int url_fclose(ByteIOContext *s);
|
|
|
|
int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags);
|
|
int url_close_buf(ByteIOContext *s);
|
|
|
|
#endif
|
|
|