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
 | |
| 
 |