文档章节

FFmpeg数据结构彻底分析——AVIOContext

zhangyujsj
 zhangyujsj
发布于 2014/12/16 22:40
字数 985
阅读 184
收藏 0
/**
 * Bytestream IO Context.   字节流的IO上下文
 * New fields can be added to the end with minor version bumps.
 * Removal, reordering and changes to existing fields require a major
 * version bump.
 * sizeof(AVIOContext) must not be used outside libav*.
 *
 * @note None of the function pointers in AVIOContext should be called
 *       directly, they should only be set by the client application
 *       when implementing custom I/O. Normally these are set to the任何一个AVIOContext中的函数指针都不应该被直接调用,他们仅仅应该当实现定制IO时被客户程序设置
 *       function pointers specified in avio_alloc_context()  通常这些被设置为在avio_alloc_context()函数中指定的函数指针
 */
typedef struct AVIOContext {
    /**
     * A class for private options.
     *
     * If this AVIOContext is created by avio_open2(), av_class is set and
     * passes the options down to protocols.
     *
     * If this AVIOContext is manually allocated, then av_class may be set by
     * the caller.
     *
     * warning -- this field can be NULL, be sure to not pass this AVIOContext
     * to any av_opt_* functions in that case.
     */
    const AVClass *av_class;  //如果AVIOContext是用avio_open2()创建的,那么av_class被设置并且传递这些参数给协议;如果是手动分配的,那么av_class由调用者去设置
    unsigned char *buffer;  /**< Start of the buffer. */缓冲区的起始地址
    int buffer_size;        /**< Maximum buffer size */最大的缓冲区大小
    unsigned char *buf_ptr; /**< Current position in the buffer */缓冲区中的当前位置
    unsigned char *buf_end; /**< End of the data, may be less than   //数据的结束地址,如果读函数放回的数据比请求的数据少(例如那些没有更多数据可以接收的流),那么结束地址可能小于buffer+buffer_size这个地址,
                                 buffer+buffer_size if the read function returned
                                 less data than requested, e.g. for streams where
                                 no more data has been received yet. */
    void *opaque;           /**< A private pointer, passed to the read/write/seek/...//一个私有指针,传递给读写定位函数等的
                                 functions. */
     int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);//读packet的函数指针
    int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);//写packet的函数指针
    int64_t (*seek)(void *opaque, int64_t offset, int whence);//定位函数的指针
    int64_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 */ //如果遇到eof,为真
     int write_flag;         /**< true if open for writing */ //如果写打开,为真
    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 *///包含错误代码,没错误时为0
    /**
     * Pause or resume playback for network streaming protocols - e.g. MMS.
     */
    int (*read_pause)(void *opaque, int pause);//网络流式协议的暂停和继续回放函数
    /**
     * Seek to a given timestamp in stream with the specified stream_index.
     * Needed for some network streaming protocols which don't support seeking
     * to byte position.
     */
     int64_t (*read_seek)(void *opaque, int stream_index,
                         int64_t timestamp, int flags);//用给定的stream_index参数定位到一个流中的给定的时间戳,对于一些不支持定位到字节位置的流式协议非常必需
    /**
     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
     */
     int seekable;//AVIO_SEEKABLE_标志的组合或者不可以seek时为0

    /**
     * max filesize, used to limit allocations
     * This field is internal to libavformat and access from outside is not allowed.
     */
     int64_t maxsize;//最大的文件大小,用于限制分配,libavformat库内部使用,禁止外部使用

    /**
     * avio_read and avio_write should if possible be satisfied directly
     * instead of going through a buffer, and avio_seek will always
     * call the underlying seek function directly.
     */
     int direct; //avio_read()以及avio_write()直接读取而不是到缓冲区去

    /**
     * Bytes read statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int64_t bytes_read; //统计的读取的字节数,libavformat库内部使用,禁止外部使用

    /**
     * seek statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int seek_count;//统计的定位的计数,libavformat库内部使用,禁止外部使用

    /**
     * writeout statistic
     * This field is internal to libavformat and access from outside is not allowed.
     */
     int writeout_count; //统计的写出数,libavformat库内部使用,禁止外部使用

    /**
     * Original buffer size
     * used internally after probing and ensure seekback to reset the buffer size
     * This field is internal to libavformat and access from outside is not allowed.
     */
    int orig_buffer_size;//原始缓冲区大小,用于在探测之后确保回退以重置缓冲区大小,libavformat库内部使用,禁止外部使用
} AVIOContext;

© 著作权归作者所有

zhangyujsj
粉丝 24
博文 358
码字总数 224241
作品 0
广州
私信 提问
FFmpeg命令行工具学习(五):FFmpeg 编解码 API 分析

在上一篇文章 FFmpeg命令行工具学习(四):FFmpeg API 介绍与通用 API 分析 中,我们简单的讲解了一下FFmpeg 的API基本概念,并分析了一下通用API,本文我们将分析 FFmpeg 在编解码时使用的A...

灰色飘零
2018/07/20
0
0
最新FFmpeg音视频核心技术精讲与实战(完整版)

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

L272339
01/06
0
0
2018FFmpeg音视频核心技术精讲与实战(已完结)目前最新

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

聂友华
2018/12/18
0
0
FFmpeg音视频核心技术精讲与实战(最新分享)

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

qq_38704763
2018/12/06
0
0
最新FFmpeg音视频核心技术精讲与实战分享

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

weixin_43746183
2018/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx+tomcat配置https

1、nginx配置https和【proxy_set_header X-Forwarded-Proto $scheme;】 2、java代码: String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServe......

perofu
18分钟前
4
0
必看的Linux系统新手进阶老手心得

不知道从什么时候起,linux这个话题变得越来越普及,成为大家经常讨论的话题。无论在网络上还是实际生活中,竟然很多人都在纠结学习linux的问题。网络上给的答案千千万万,而却还有很多人踌躇...

Linux就该这么学
21分钟前
4
0
Spring Boot 配置元数据指南

1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的。但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot Configuration Proces...

liululee
25分钟前
3
0
foreach查找子类

$list = $menu_model -> menu_list();$parent_list = [];foreach ($list as $v){ if ($v['pid'] == 0) { $parent = $v; foreach ($list as $v1) ......

小小小壮
36分钟前
3
0
基于 HTML5 Canvas 实现的 TP-LINK 电信拓扑设备面板

前言 今天我们以真实的 TP-LINK 设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动。 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink_20170511/index.h...

htdaydayup
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部