FFmpeg总结(七)AV系列结构体之AVIOContext

AVIOContext结构体位于libavformat/avio.h下:

AVIOContext的描述:

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

AVIOContext的成员变量:

typedef struct AVIOContext {
     // 一个私有类选项
     // 如果AVIOContext被创建通过avio_open2()函数,av_class可以通过设置的协议选项设置
     // 如果AVIOContext被创建通过avio_alloc_conext(),av_class被调用者设置
    const AVClass *av_class;
    unsigned char *buffer;  // 起始buffer
    int buffer_size;        // 最大buffer大小
    unsigned char *buf_ptr; // 当前buffer中的position
    // 1、指向buffer数据尾部的指针
    // 2、如果read的data返回小于data实际需要的,
    // 它将小于buffer+buffer_size的大小,如streams没有更多数据接受了
    unsigned char *buf_end;
    void *opaque;           // 一个私有容器,通过read/write/seek操作
    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);
    int64_t pos;            // 文件中当前buffer的position
    int must_flush;         // 如果下一次seek要flush操作,返回true
    int eof_reached;        // 如果出现EOF(资源无更多读取),返回true
    int write_flag;         // 打开文件正在write的标识
    int max_packet_size;
    unsigned long checksum;
    unsigned char *checksum_ptr;
    unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
    int error;              /**< contains the error code or 0 if no error happened */
    // 网络流协议pause或resume playback时,如MMS
    int (*read_pause)(void *opaque, int pause);
    // seek到给定的时间戳,一些网络流协议不支持seek到对应位置,如直播流
    int64_t (*read_seek)(void *opaque, int stream_index,
                         int64_t timestamp, int flags);
    // 是否能seek,通过AVIO_SEEKABLE标识,当stream不能seek时
    int seekable;

    // 最大文件大小,被用于限制所分配的空间时
    int64_t maxsize;

    // avio_read 及avio_write应满足直接读写,而不是通过一个缓冲区,avio_seek将被直接调用,当seek操作时。
    int direct;

     // 字节读取数据
    int64_t bytes_read;

    // seek读取数据
    int seek_count;

    //字节写入数据
    int writeout_count;

    //原始buffer大小
    int orig_buffer_size;

    int short_seek_threshold;

     //分离用‘,’的可用协议集
    const char *protocol_whitelist;

    //分离用‘,’的不可用协议集
    const char *protocol_blacklist;

    // 代替write_packet的回调函数
    int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size,
                           enum AVIODataMarkerType type, int64_t time);

    int ignore_boundary_point;

    enum AVIODataMarkerType current_type;
    int64_t last_time;
} AVIOContext;

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

/*
 * The following shows the relationship between buffer, buf_ptr, buf_end, buf_size,
 * and pos, when reading and when writing (since AVIOContext is used for both):
 *
 **********************************************************************************
 *                                   READING
 **********************************************************************************
 *
 *                            |              buffer_size              |
 *                            |---------------------------------------|
 *                            |                                       |
 *
 *                         buffer          buf_ptr       buf_end
 *                            +---------------+-----------------------+
 *                            |/ / / / / / / /|/ / / / / / /|         |
 *  read buffer:              |/ / consumed / | to be read /|         |
 *                            |/ / / / / / / /|/ / / / / / /|         |
 *                            +---------------+-----------------------+
 *
 *                                                         pos
 *              +-------------------------------------------+-----------------+
 *  input file: |                                           |                 |
 *              +-------------------------------------------+-----------------+
 *
 *
 **********************************************************************************
 *                                   WRITING
 **********************************************************************************
 *
 *                                          |          buffer_size          |
 *                                          |-------------------------------|
 *                                          |                               |
 *
 *                                       buffer              buf_ptr     buf_end
 *                                          +-------------------+-----------+
 *                                          |/ / / / / / / / / /|           |
 *  write buffer:                           | / to be flushed / |           |
 *                                          |/ / / / / / / / / /|           |
 *                                          +-------------------+-----------+
 *
 *                                         pos
 *               +--------------------------+-----------------------------------+
 *  output file: |                          |                                   |
 *               +--------------------------+-----------------------------------+
 *
 */
时间: 2024-10-21 10:15:45

FFmpeg总结(七)AV系列结构体之AVIOContext的相关文章

FFmpeg总结(六)AV系列结构体之AVPacket

AVPacket位置:libavcodec/avcodec.h下: AVPacket: 通常通过demuxer导出的data packet作为解码器的input data 或是收到来自编码器的data packet,通过muxer进入输出的output data 看如下图,更易理解: 对于视频来说,它通常应该包含一个压缩的帧,对于音频,可能包含多个压缩帧,允许编码器输出为空的packet,没有压缩数据,只包含数据(如一些更新参数的编码) AVPacket 是FFmpeg中为数不多的结构体,它的s

FFmpeg总结(五)AV系列结构体之AVCodec、AVCodecParameters、AVCodecParser、AVCodecParserContext、AVCodecDescriptor

AVCodec: 编解码器结构体 位于libavcodec/avcodec.h中 typedef struct AVCodec { const char *name; // codec的名字,保持全局唯一,标识名 const char *long_name; // codec的名字,全名 enum AVMediaType type; // Media类型,是视频,音频,还是字幕 enum AVCodecID id; int capabilities; // codec的容量,参考 AV_CODE

FFmpeg总结(三)AV系列结构体之AVCodecContext

位置: 描述:主要扩展API的结构体 New fields can be added to the end with minor version bumps. Removal, reordering and changes to existing fields require a major version bump. You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user applicat

Fmpeg总结(二)AV系列结构体之AVFrame

位于libavutil下frame.h文件中 这个结构体用来描述解码出音视频数据. AVFrame必须使用av_frame_alloc分配(). AVFrame必须与av_frame_free释放(). AVFrame通常分配一次,然后重复使用多次,不同的数据(如一个AVFrame持有来自解码器的frames.)在再次使用时,av_frame_unref()将自由持有的任何之前的帧引用并重置它变成初始态. 一个AVFrame所描述的数据通常是通过参考AVBuffer API计算.内部的buffe

FFmpeg中几个重要结构体的意义

AVCodec是存储编解码器信息的结构体,特指一个特定的解码器,比如H264编码器的名字,ID,支持的视频格式,支持的采样率等: AVCodecContext是一个描述编解码器采用的具体参数,比如采用的是那种编码器(H264或MPEG等),采用的采样率,声道数等: AVPacket是存储编码后的数据信息的结构体(This structure stores compressed data.),可以理解为编码后等待被传输的数据包: AVFrame是存储解码数据相关信息的结构体(This struct

FFMPEG关键结构体

// FFMPEG关键结构体:// 转载 http://blog.csdn.net/leixiaohua1020/article/details/14214577// 2016.2.26 AVFrame(位于avcodec.h)结构体一般用于存储原始数据.===============================================================================下面看几个主要变量的作用(在这里考虑解码的情况):uint8_t *data[AV_N

FFmpeg 结构体学习(七): AVIOContext 分析

在上文FFmpeg 结构体学习(六): AVCodecContext 分析我们学习了AVCodec结构体的相关内容.本文,我们将讲述一下AVIOContext. AVIOContext是FFMPEG管理输入输出数据的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVIOContext的定义的结构体源码(位于libavformat/avio.h): /** * Bytestream IO Context. * New fields can be a

FFmpeg 常用结构体

0.FFmpeg 中最关键的结构体之间的关系 FFmpeg 中结构体很多.最关键的结构体可以分成以下几类: 1)解协议(http, rtsp, rtmp, mms) AVIOContext,URLProtocol,URLContext 主要存储视音频使用的协议的类型以及状态.URLProtocol 存储输入视音频使用的封装格式.每种协议都对应一个 URLProtocol 结构.(注意:FFmpeg 中文件也被当做一种协议 "file") 2)解封装(flv, avi, rmvb, mp

FFmpeg源码简单分析:结构体成员管理系统-AVOption

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常