ffmepg框架阅读之三:AVIOContext的标准初始化

来源:互联网 发布:微信业务域名是什么 编辑:程序博客网 时间:2024/06/05 11:24
对于AVIOContext的初始化,ffmpeg提供给用户的接口是函数AVIOContext *avio_alloc_context(                  unsigned char *buffer,                  int buffer_size,                  int write_flag,                  void *opaque,                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),

                  int64_t (*seek)(void *opaque, int64_t offset, int whence));

当需要自定义AVIOContext的时候,可以使用该函数,通过自己的参数。下面贴出源代码。

AVIOContext *avio_alloc_context(                  unsigned char *buffer,                  int buffer_size,                  int write_flag,                  void *opaque,                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),                  int64_t (*seek)(void *opaque, int64_t offset, int whence)){    //分配内存空间 并初始化为0    AVIOContext *s = av_mallocz(sizeof(AVIOContext));    if (!s)        return NULL;    //给s赋值    ffio_init_context(s, buffer, buffer_size, write_flag, opaque,                  read_packet, write_packet, seek);    return s;}
贴出ffio_init_context代码

int ffio_init_context(AVIOContext *s,                  unsigned char *buffer,                  int buffer_size,                  int write_flag,                  void *opaque,                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),                  int64_t (*seek)(void *opaque, int64_t offset, int whence)){    //这几个buffer和size是缓存数据吗?    s->buffer = buffer;    s->buffer_size = buffer_size;    s->buf_ptr = buffer;        s->opaque = opaque;    //用户数据 调用read write seek时输入参数    //读写模式下 buf_end的不同设置    url_resetbuf(s, write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ);    /*     static int url_resetbuf(AVIOContext *s, int flags)     {     assert(flags == AVIO_FLAG_WRITE || flags == AVIO_FLAG_READ);          if (flags & AVIO_FLAG_WRITE) {  //写模式     s->buf_end = s->buffer + s->buffer_size;     s->write_flag = 1;     } else {                        //读模式     s->buf_end = s->buffer;     s->write_flag = 0;     }     return 0;     }     */    s->write_packet = write_packet;    s->read_packet = read_packet;    s->seek = seek;    s->pos = 0;    s->must_flush = 0;    s->eof_reached = 0;    s->error = 0;#if FF_API_OLD_AVIO    s->is_streamed = 0;#endif    s->seekable = AVIO_SEEKABLE_NORMAL;    s->max_packet_size = 0;    s->update_checksum= NULL;    if(!read_packet && !write_flag){        s->pos = buffer_size;        s->buf_end = s->buffer + buffer_size;    }    s->read_pause = NULL;    s->read_seek  = NULL;    return 0;}