zoukankan      html  css  js  c++  java
  • ffmpeg常用数据结构一

    整体结构图:

     

     附:

    聚合(Aggregation) : 表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体

     

    依赖(Dependency):对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类

    AVCodecContext

    这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息,如下列出了部分比较重要的域:

    typedef  struct  AVCodecContext {

        ......

        /**

         * some codecs need / can use extradata like Huffman tables.

         * mjpeg: Huffman tables

         * rv10: additional flags

         * mpeg4: global headers (they can be in the bitstream or here)

         * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger

         * than extradata_size to avoid prolems if it is read with the bitstream reader.

         * The bytewise contents of extradata must not depend on the architecture or CPU endianness.

         * - encoding: Set/allocated/freed by libavcodec.

         * - decoding: Set/allocated/freed by user.

         */

        uint8_t *extradata;

    intextradata_size;

        /**

         * This is the fundamental unit of time (in seconds) in terms

         * of which frame timestamps are represented. For fixed-fps content,

         * timebase should be 1/framerate and timestamp increments should be

         * identically 1.

         * - encoding: MUST be set by user.

         * - decoding: Set by libavcodec.

         */

    AVRationaltime_base;

        /* video only */

        /**

         * picture width / height.

         * - encoding: MUST be set by user.

         * - decoding: Set by libavcodec.

         * Note: For compatibility it is possible to set this instead of

         * coded_width/height before decoding.

         */

    int width, height;

        ......

        /* audio only */

    intsample_rate; ///< samples per second

    int channels;    ///< number of audio channels

        /**

         * audio sample format

         * - encoding: Set by user.

         * - decoding: Set by libavcodec.

         */

    enumSampleFormatsample_fmt;  ///< sample format

        /* The following data should not be initialized. */

        /**

         * Samples per packet, initialized when calling 'init'.

         */

    intframe_size;

    intframe_number;   ///< audio or video frame number

        ......

        char codec_name[32];

    enumAVMediaTypecodec_type; /* see AVMEDIA_TYPE_xxx */

    enumCodecIDcodec_id; /* see CODEC_ID_xxx */

        /**

         * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').

         * This is used to work around some encoder bugs.

         * A demuxer should set this to what is stored in the field used to identify the codec.

         * If there are multiple such fields in a container then the demuxer should choose the one

         * which maximizes the information about the used codec.

         * If the codec tag field in a container is larger then 32 bits then the demuxer should

         * remap the longer ID to 32 bits with a table or other structure. Alternatively a new

         * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated

         * first.

         * - encoding: Set by user, if not then the default based on codec_id will be used.

         * - decoding: Set by user, will be converted to uppercase by libavcodec during init.

         */

        unsigned intcodec_tag;           

        ......

        /**

         * Size of the frame reordering buffer in the decoder.

         * For MPEG-2 it is 1 IPB or 0 low delay IP.

         * - encoding: Set by libavcodec.

         * - decoding: Set by libavcodec.

         */

    inthas_b_frames;

        /**

         * number of bytes per packet if constant and known or 0

         * Used by some WAV based audio codecs.

         */

    intblock_align;

        ......

        /**

         * bits per sample/pixel from the demuxer (needed for huffyuv).

         * - encoding: Set by libavcodec.

         * - decoding: Set by user.

         */

    intbits_per_coded_sample; 

         ......

    } AVCodecContext;

    如果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 avformat_open_input和avformat_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要域的释义如下:

    1.   extradata/extradata_size:这个buffer中存放了解码器可能会用到的额外信息在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。

    2.   time_base

    3.   width/height:视频的宽和高。

    4.   sample_rate/channels:音频的采样率和信道数目。

    5.   sample_fmt: 音频的原始采样格式。

    6.   codec_name/codec_type/codec_id/codec_tag编解码器的信息

  • 相关阅读:
    C语言结构体+公用体+枚举训练
    TIFF图像文件格式详解
    Professional CUDA C Programming的代码实例1.1
    C语言数组强化训练
    C语言字符数组与字符串
    文件操作
    MATLAB 与Modelsim之间对测试系统的联合仿真
    FFT实现逆FFT
    眼图——概念与测量(摘记)
    《我的心曾悲伤七次》卡里·纪伯伦
  • 原文地址:https://www.cnblogs.com/elesos/p/2990563.html
Copyright © 2011-2022 走看看