AVIOContext结构体位于libavformat/avio.h下:
AV系列结构体之AVIOContext - 图1

AVIOContext的描述:

是字节流IO上下文, AVIOContext不能直接被函数指针调用,应当在应用程序实现自定义IO时,通常是通过avio_alloc_conext()函数进行设置函数指针。

AVIOContext的成员变量:

  1. typedef struct AVIOContext {
  2. // 一个私有类选项
  3. // 如果AVIOContext被创建通过avio_open2()函数,av_class可以通过设置的协议选项设置
  4. // 如果AVIOContext被创建通过avio_alloc_conext(),av_class被调用者设置
  5. const AVClass *av_class;
  6. unsigned char *buffer; // 起始buffer
  7. int buffer_size; // 最大buffer大小
  8. unsigned char *buf_ptr; // 当前buffer中的position
  9. // 1、指向buffer数据尾部的指针
  10. // 2、如果read的data返回小于data实际需要的,
  11. // 它将小于buffer+buffer_size的大小,如streams没有更多数据接受了
  12. unsigned char *buf_end;
  13. void *opaque; // 一个私有容器,通过read/write/seek操作
  14. int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
  15. int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
  16. int64_t (*seek)(void *opaque, int64_t offset, int whence);
  17. int64_t pos; // 文件中当前buffer的position
  18. int must_flush; // 如果下一次seek要flush操作,返回true
  19. int eof_reached; // 如果出现EOF(资源无更多读取),返回true
  20. int write_flag; // 打开文件正在write的标识
  21. int max_packet_size;
  22. unsigned long checksum;
  23. unsigned char *checksum_ptr;
  24. unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
  25. int error; /**< contains the error code or 0 if no error happened */
  26. // 网络流协议pause或resume playback时,如MMS
  27. int (*read_pause)(void *opaque, int pause);
  28. // seek到给定的时间戳,一些网络流协议不支持seek到对应位置,如直播流
  29. int64_t (*read_seek)(void *opaque, int stream_index,
  30. int64_t timestamp, int flags);
  31. // 是否能seek,通过AVIO_SEEKABLE标识,当stream不能seek时
  32. int seekable;
  33. // 最大文件大小,被用于限制所分配的空间时
  34. int64_t maxsize;
  35. // avio_read 及avio_write应满足直接读写,而不是通过一个缓冲区,avio_seek将被直接调用,当seek操作时。
  36. int direct;
  37. // 字节读取数据
  38. int64_t bytes_read;
  39. // seek读取数据
  40. int seek_count;
  41. //字节写入数据
  42. int writeout_count;
  43. //原始buffer大小
  44. int orig_buffer_size;
  45. int short_seek_threshold;
  46. //分离用‘,’的可用协议集
  47. const char *protocol_whitelist;
  48. //分离用‘,’的不可用协议集
  49. const char *protocol_blacklist;
  50. // 代替write_packet的回调函数
  51. int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size,
  52. enum AVIODataMarkerType type, int64_t time);
  53. int ignore_boundary_point;
  54. enum AVIODataMarkerType current_type;
  55. int64_t last_time;
  56. } AVIOContext;

AVIOContext读写时,buffer,buf_ptr,buf_end,buf_size及pos之间的关系

  1. /*
  2. * The following shows the relationship between buffer, buf_ptr, buf_end, buf_size,
  3. * and pos, when reading and when writing (since AVIOContext is used for both):
  4. *
  5. **********************************************************************************
  6. * READING
  7. **********************************************************************************
  8. *
  9. * | buffer_size |
  10. * |---------------------------------------|
  11. * | |
  12. *
  13. * buffer buf_ptr buf_end
  14. * +---------------+-----------------------+
  15. * |/ / / / / / / /|/ / / / / / /| |
  16. * read buffer: |/ / consumed / | to be read /| |
  17. * |/ / / / / / / /|/ / / / / / /| |
  18. * +---------------+-----------------------+
  19. *
  20. * pos
  21. * +-------------------------------------------+-----------------+
  22. * input file: | | |
  23. * +-------------------------------------------+-----------------+
  24. *
  25. *
  26. **********************************************************************************
  27. * WRITING
  28. **********************************************************************************
  29. *
  30. * | buffer_size |
  31. * |-------------------------------|
  32. * | |
  33. *
  34. * buffer buf_ptr buf_end
  35. * +-------------------+-----------+
  36. * |/ / / / / / / / / /| |
  37. * write buffer: | / to be flushed / | |
  38. * |/ / / / / / / / / /| |
  39. * +-------------------+-----------+
  40. *
  41. * pos
  42. * +--------------------------+-----------------------------------+
  43. * output file: | | |
  44. * +--------------------------+-----------------------------------+
  45. *
  46. */

如约智惠.png