FFMPEG结构体分析:AVFrame(解码后的数据)

https://blog.csdn.net/jxcr1984/article/details/52766524

本文转自: http://blog.csdn.net/leixiaohua1020/article/details/14214577

  1. /*

  2.  

    *雷霄骅

  3.  

    *[email protected]

  4.  

    *中国传媒大学/数字电视技术

  5.  

    */

  6.  

    /**

  7.  

    * Audio Video Frame.

  8.  

    * New fields can be added to the end of AVFRAME with minor version

  9.  

    * bumps. Similarly fields that are marked as to be only accessed by

  10.  

    * av_opt_ptr() can be reordered. This allows 2 forks to add fields

  11.  

    * without breaking compatibility with each other.

  12.  

    * Removal, reordering and changes in the remaining cases require

  13.  

    * a major version bump.

  14.  

    * sizeof(AVFrame) must not be used outside libavcodec.

  15.  

    */

  16.  

    typedef struct AVFrame {

  17.  

    #define AV_NUM_DATA_POINTERS 8

  18.  

    /**图像数据

  19.  

    * pointer to the picture/channel planes.

  20.  

    * This might be different from the first allocated byte

  21.  

    * - encoding: Set by user

  22.  

    * - decoding: set by AVCodecContext.get_buffer()

  23.  

    */

  24.  

    uint8_t *data[AV_NUM_DATA_POINTERS];

  25.  

  26.  

    /**

  27.  

    * Size, in bytes, of the data for each picture/channel plane.

  28.  

    *

  29.  

    * For audio, only linesize[0] may be set. For planar audio, each channel

  30.  

    * plane must be the same size.

  31.  

    *

  32.  

    * - encoding: Set by user

  33.  

    * - decoding: set by AVCodecContext.get_buffer()

  34.  

    */

  35.  

    int linesize[AV_NUM_DATA_POINTERS];

  36.  

  37.  

    /**

  38.  

    * pointers to the data planes/channels.

  39.  

    *

  40.  

    * For video, this should simply point to data[].

  41.  

    *

  42.  

    * For planar audio, each channel has a separate data pointer, and

  43.  

    * linesize[0] contains the size of each channel buffer.

  44.  

    * For packed audio, there is just one data pointer, and linesize[0]

  45.  

    * contains the total size of the buffer for all channels.

  46.  

    *

  47.  

    * Note: Both data and extended_data will always be set by get_buffer(),

  48.  

    * but for planar audio with more channels that can fit in data,

  49.  

    * extended_data must be used by the decoder in order to access all

  50.  

    * channels.

  51.  

    *

  52.  

    * encoding: unused

  53.  

    * decoding: set by AVCodecContext.get_buffer()

  54.  

    */

  55.  

    uint8_t **extended_data;

  56.  

  57.  

    /**宽高

  58.  

    * width and height of the video frame

  59.  

    * - encoding: unused

  60.  

    * - decoding: Read by user.

  61.  

    */

  62.  

    int width, height;

  63.  

  64.  

    /**

  65.  

    * number of audio samples (per channel) described by this frame

  66.  

    * - encoding: Set by user

  67.  

    * - decoding: Set by libavcodec

  68.  

    */

  69.  

    int nb_samples;

  70.  

  71.  

    /**

  72.  

    * format of the frame, -1 if unknown or unset

  73.  

    * Values correspond to enum AVPixelFormat for video frames,

  74.  

    * enum AVSampleFormat for audio)

  75.  

    * - encoding: unused

  76.  

    * - decoding: Read by user.

  77.  

    */

  78.  

    int format;

  79.  

  80.  

    /**是否是关键帧

  81.  

    * 1 -> keyframe, 0-> not

  82.  

    * - encoding: Set by libavcodec.

  83.  

    * - decoding: Set by libavcodec.

  84.  

    */

  85.  

    int key_frame;

  86.  

  87.  

    /**帧类型(I,B,P)

  88.  

    * Picture type of the frame, see ?_TYPE below.

  89.  

    * - encoding: Set by libavcodec. for coded_picture (and set by user for input).

  90.  

    * - decoding: Set by libavcodec.

  91.  

    */

  92.  

    enum AVPictureType pict_type;

  93.  

  94.  

    /**

  95.  

    * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer.

  96.  

    * This isn‘t used by libavcodec unless the default get/release_buffer() is used.

  97.  

    * - encoding:

  98.  

    * - decoding:

  99.  

    */

  100.  

    uint8_t *base[AV_NUM_DATA_POINTERS];

  101.  

  102.  

    /**

  103.  

    * sample aspect ratio for the video frame, 0/1 if unknown/unspecified

  104.  

    * - encoding: unused

  105.  

    * - decoding: Read by user.

  106.  

    */

  107.  

    AVRational sample_aspect_ratio;

  108.  

  109.  

    /**

  110.  

    * presentation timestamp in time_base units (time when frame should be shown to user)

  111.  

    * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.

  112.  

    * - encoding: MUST be set by user.

  113.  

    * - decoding: Set by libavcodec.

  114.  

    */

  115.  

    int64_t pts;

  116.  

  117.  

    /**

  118.  

    * reordered pts from the last AVPacket that has been input into the decoder

  119.  

    * - encoding: unused

  120.  

    * - decoding: Read by user.

  121.  

    */

  122.  

    int64_t pkt_pts;

  123.  

  124.  

    /**

  125.  

    * dts from the last AVPacket that has been input into the decoder

  126.  

    * - encoding: unused

  127.  

    * - decoding: Read by user.

  128.  

    */

  129.  

    int64_t pkt_dts;

  130.  

  131.  

    /**

  132.  

    * picture number in bitstream order

  133.  

    * - encoding: set by

  134.  

    * - decoding: Set by libavcodec.

  135.  

    */

  136.  

    int coded_picture_number;

  137.  

    /**

  138.  

    * picture number in display order

  139.  

    * - encoding: set by

  140.  

    * - decoding: Set by libavcodec.

  141.  

    */

  142.  

    int display_picture_number;

  143.  

  144.  

    /**

  145.  

    * quality (between 1 (good) and FF_LAMBDA_MAX (bad))

  146.  

    * - encoding: Set by libavcodec. for coded_picture (and set by user for input).

  147.  

    * - decoding: Set by libavcodec.

  148.  

    */

  149.  

    int quality;

  150.  

  151.  

    /**

  152.  

    * is this picture used as reference

  153.  

    * The values for this are the same as the MpegEncContext.picture_structure

  154.  

    * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.

  155.  

    * Set to 4 for delayed, non-reference frames.

  156.  

    * - encoding: unused

  157.  

    * - decoding: Set by libavcodec. (before get_buffer() call)).

  158.  

    */

  159.  

    int reference;

  160.  

  161.  

    /**QP表

  162.  

    * QP table

  163.  

    * - encoding: unused

  164.  

    * - decoding: Set by libavcodec.

  165.  

    */

  166.  

    int8_t *qscale_table;

  167.  

    /**

  168.  

    * QP store stride

  169.  

    * - encoding: unused

  170.  

    * - decoding: Set by libavcodec.

  171.  

    */

  172.  

    int qstride;

  173.  

  174.  

    /**

  175.  

    *

  176.  

    */

  177.  

    int qscale_type;

  178.  

  179.  

    /**跳过宏块表

  180.  

    * mbskip_table[mb]>=1 if MB didn‘t change

  181.  

    * stride= mb_width = (width+15)>>4

  182.  

    * - encoding: unused

  183.  

    * - decoding: Set by libavcodec.

  184.  

    */

  185.  

    uint8_t *mbskip_table;

  186.  

  187.  

    /**运动矢量表

  188.  

    * motion vector table

  189.  

    * @code

  190.  

    * example:

  191.  

    * int mv_sample_log2= 4 - motion_subsample_log2;

  192.  

    * int mb_width= (width+15)>>4;

  193.  

    * int mv_stride= (mb_width << mv_sample_log2) + 1;

  194.  

    * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];

  195.  

    * @endcode

  196.  

    * - encoding: Set by user.

  197.  

    * - decoding: Set by libavcodec.

  198.  

    */

  199.  

    int16_t (*motion_val[2])[2];

  200.  

  201.  

    /**宏块类型表

  202.  

    * macroblock type table

  203.  

    * mb_type_base + mb_width + 2

  204.  

    * - encoding: Set by user.

  205.  

    * - decoding: Set by libavcodec.

  206.  

    */

  207.  

    uint32_t *mb_type;

  208.  

  209.  

    /**DCT系数

  210.  

    * DCT coefficients

  211.  

    * - encoding: unused

  212.  

    * - decoding: Set by libavcodec.

  213.  

    */

  214.  

    short *dct_coeff;

  215.  

  216.  

    /**参考帧列表

  217.  

    * motion reference frame index

  218.  

    * the order in which these are stored can depend on the codec.

  219.  

    * - encoding: Set by user.

  220.  

    * - decoding: Set by libavcodec.

  221.  

    */

  222.  

    int8_t *ref_index[2];

  223.  

  224.  

    /**

  225.  

    * for some private data of the user

  226.  

    * - encoding: unused

  227.  

    * - decoding: Set by user.

  228.  

    */

  229.  

    void *opaque;

  230.  

  231.  

    /**

  232.  

    * error

  233.  

    * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.

  234.  

    * - decoding: unused

  235.  

    */

  236.  

    uint64_t error[AV_NUM_DATA_POINTERS];

  237.  

  238.  

    /**

  239.  

    * type of the buffer (to keep track of who has to deallocate data[*])

  240.  

    * - encoding: Set by the one who allocates it.

  241.  

    * - decoding: Set by the one who allocates it.

  242.  

    * Note: User allocated (direct rendering) & internal buffers cannot coexist currently.

  243.  

    */

  244.  

    int type;

  245.  

  246.  

    /**

  247.  

    * When decoding, this signals how much the picture must be delayed.

  248.  

    * extra_delay = repeat_pict / (2*fps)

  249.  

    * - encoding: unused

  250.  

    * - decoding: Set by libavcodec.

  251.  

    */

  252.  

    int repeat_pict;

  253.  

  254.  

    /**

  255.  

    * The content of the picture is interlaced.

  256.  

    * - encoding: Set by user.

  257.  

    * - decoding: Set by libavcodec. (default 0)

  258.  

    */

  259.  

    int interlaced_frame;

  260.  

  261.  

    /**

  262.  

    * If the content is interlaced, is top field displayed first.

  263.  

    * - encoding: Set by user.

  264.  

    * - decoding: Set by libavcodec.

  265.  

    */

  266.  

    int top_field_first;

  267.  

  268.  

    /**

  269.  

    * Tell user application that palette has changed from previous frame.

  270.  

    * - encoding: ??? (no palette-enabled encoder yet)

  271.  

    * - decoding: Set by libavcodec. (default 0).

  272.  

    */

  273.  

    int palette_has_changed;

  274.  

  275.  

    /**

  276.  

    * codec suggestion on buffer type if != 0

  277.  

    * - encoding: unused

  278.  

    * - decoding: Set by libavcodec. (before get_buffer() call)).

  279.  

    */

  280.  

    int buffer_hints;

  281.  

  282.  

    /**

  283.  

    * Pan scan.

  284.  

    * - encoding: Set by user.

  285.  

    * - decoding: Set by libavcodec.

  286.  

    */

  287.  

    AVPanScan *pan_scan;

  288.  

  289.  

    /**

  290.  

    * reordered opaque 64bit (generally an integer or a double precision float

  291.  

    * PTS but can be anything).

  292.  

    * The user sets AVCodecContext.reordered_opaque to represent the input at

  293.  

    * that time,

  294.  

    * the decoder reorders values as needed and sets AVFrame.reordered_opaque

  295.  

    * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque

  296.  

    * @deprecated in favor of pkt_pts

  297.  

    * - encoding: unused

  298.  

    * - decoding: Read by user.

  299.  

    */

  300.  

    int64_t reordered_opaque;

  301.  

  302.  

    /**

  303.  

    * hardware accelerator private data (FFmpeg-allocated)

  304.  

    * - encoding: unused

  305.  

    * - decoding: Set by libavcodec

  306.  

    */

  307.  

    void *hwaccel_picture_private;

  308.  

  309.  

    /**

  310.  

    * the AVCodecContext which ff_thread_get_buffer() was last called on

  311.  

    * - encoding: Set by libavcodec.

  312.  

    * - decoding: Set by libavcodec.

  313.  

    */

  314.  

    struct AVCodecContext *owner;

  315.  

  316.  

    /**

  317.  

    * used by multithreading to store frame-specific info

  318.  

    * - encoding: Set by libavcodec.

  319.  

    * - decoding: Set by libavcodec.

  320.  

    */

  321.  

    void *thread_opaque;

  322.  

  323.  

    /**

  324.  

    * log2 of the size of the block which a single vector in motion_val represents:

  325.  

    * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)

  326.  

    * - encoding: unused

  327.  

    * - decoding: Set by libavcodec.

  328.  

    */

  329.  

    uint8_t motion_subsample_log2;

  330.  

  331.  

    /**(音频)采样率

  332.  

    * Sample rate of the audio data.

  333.  

    *

  334.  

    * - encoding: unused

  335.  

    * - decoding: read by user

  336.  

    */

  337.  

    int sample_rate;

  338.  

  339.  

    /**

  340.  

    * Channel layout of the audio data.

  341.  

    *

  342.  

    * - encoding: unused

  343.  

    * - decoding: read by user.

  344.  

    */

  345.  

    uint64_t channel_layout;

  346.  

  347.  

    /**

  348.  

    * frame timestamp estimated using various heuristics, in stream time base

  349.  

    * Code outside libavcodec should access this field using:

  350.  

    * av_frame_get_best_effort_timestamp(frame)

  351.  

    * - encoding: unused

  352.  

    * - decoding: set by libavcodec, read by user.

  353.  

    */

  354.  

    int64_t best_effort_timestamp;

  355.  

  356.  

    /**

  357.  

    * reordered pos from the last AVPacket that has been input into the decoder

  358.  

    * Code outside libavcodec should access this field using:

  359.  

    * av_frame_get_pkt_pos(frame)

  360.  

    * - encoding: unused

  361.  

    * - decoding: Read by user.

  362.  

    */

  363.  

    int64_t pkt_pos;

  364.  

  365.  

    /**

  366.  

    * duration of the corresponding packet, expressed in

  367.  

    * AVStream->time_base units, 0 if unknown.

  368.  

    * Code outside libavcodec should access this field using:

  369.  

    * av_frame_get_pkt_duration(frame)

  370.  

    * - encoding: unused

  371.  

    * - decoding: Read by user.

  372.  

    */

  373.  

    int64_t pkt_duration;

  374.  

  375.  

    /**

  376.  

    * metadata.

  377.  

    * Code outside libavcodec should access this field using:

  378.  

    * av_frame_get_metadata(frame)

  379.  

    * - encoding: Set by user.

  380.  

    * - decoding: Set by libavcodec.

  381.  

    */

  382.  

    AVDictionary *metadata;

  383.  

  384.  

    /**

  385.  

    * decode error flags of the frame, set to a combination of

  386.  

    * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there

  387.  

    * were errors during the decoding.

  388.  

    * Code outside libavcodec should access this field using:

  389.  

    * av_frame_get_decode_error_flags(frame)

  390.  

    * - encoding: unused

  391.  

    * - decoding: set by libavcodec, read by user.

  392.  

    */

  393.  

    int decode_error_flags;

  394.  

    #define FF_DECODE_ERROR_INVALID_BITSTREAM 1

  395.  

    #define FF_DECODE_ERROR_MISSING_REFERENCE 2

  396.  

  397.  

    /**

  398.  

    * number of audio channels, only used for audio.

  399.  

    * Code outside libavcodec should access this field using:

  400.  

    * av_frame_get_channels(frame)

  401.  

    * - encoding: unused

  402.  

    * - decoding: Read by user.

  403.  

    */

  404.  

    int64_t channels;

  405.  

    } AVFrame;

AVFrame结构体为解码后的数据,一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对于音频来说就是PCM),此外还包括一些相关的数据。

如:解码的时候存储了宏块类型表,QP表,运行矢量表等数据。编码的时候也存储了相关的数据。因此在使用FFMPEG进行码流分析的时候,AVFrame是一个很重要的结构体。

uint8_t *data[AV_NUM_DATA_POINTERS]: 解码后原始数据

int linesize[AV_NUM_DATA_PONITERS]: data中"一行"数据的大小。注:未必就是图像的宽,一般大于图像的宽

int width, height: 视频帧宽和高(1920*1080)

int nb_samples: 音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个

int format: 解码后原始数据型(YUV420, YUV422, RGB24...)

int key_frame: 是否为关键帧

enum AVPictureType pict_type: 帧类型(I,B,P...)

AVRational sample_aspect_ratio: 宽高比(16:9, 4:3...)

int64_t pts: 显示时间戳

int coded_picture_number: 编码帧序号

int display_picture_number: 显示帧序号

int8_t *qscale_table: QP表

uint8_t *mbskip_table: 跳过宏块表

int16_t (*motion_val[2])[2]: 运行矢量表

uint32_t *mb_type: 宏块类型表

short *dct_coeff: DCT系数

int8_t *ref_index[2]: 运动估计参考帧列表

int interlaced_frame: 是否是隔行扫描

uint8_t motion_subsample_log2: 一个宏块中的运行矢量采样个数,取log的

原文地址:https://www.cnblogs.com/jukan/p/9258922.html

时间: 2024-10-29 19:06:31

FFMPEG结构体分析:AVFrame(解码后的数据)的相关文章

FFmpeg: AVPacket 结构体分析

AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长,所在媒体流的索引等.对于视频来说,AVPacket通常包含一个压缩的Frame,而音频(Audio)则有可能包含多个压缩的Frame.并且,一个Packet有可能是空的,不包含任何压缩数据,只含有side data(side data,容器提供的关于Packet的一些附加信息.例如,在编码结束的时

FFmpeg 结构体学习(五): AVCodec 分析

在上文FFmpeg 结构体学习(四): AVFrame 分析我们学习了AVStream结构体的相关内容.本文,我们将讲述一下AVCodec. AVCodec是存储编解码器信息的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVFrame的定义的结构体源码(位于libavcodec/avcodec.h): /* 雷霄骅 * 中国传媒大学/数字电视技术 * [email protected] * */ /** * AVCodec. */ typede

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

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

FFmpeg 结构体学习(二): AVStream 分析

在上文FFmpeg 结构体学习(一): AVFormatContext 分析我们学习了AVFormatContext结构体的相关内容.本文,我们将讲述一下AVStream. AVStream是存储每一个视频/音频流信息的结构体.下面我们来分析一下该结构体里重要变量的含义和作用. 一.源码整理 首先我们先看一下结构体AVStream的定义的结构体源码(位于libavformat/avformat.h): /** * Stream structure. * New fields can be add

ffmpeg结构体SpecifierOpt说明文档

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的.FFmpeg具体介绍见:百度百科.FFmpeg官方主页:FFmpeg.org. 这里面涉及到一个重要的结构体:SpecifierOpt.很遗憾,除了官方文档,我没有找到很有价值的分析文章,如果各位

FFmpeg结构体彻底分析——AVCodecContext

/** * main external API structure. * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bump. * Please use AVOptions (av_opt* / av_set/get*()) to access these fi

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

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

AVPicture结构体分析

/** * Picture data structure. * * Up to four components can be stored into it, the last component is * alpha. */ typedef struct AVPicture { uint8_t *data[AV_NUM_DATA_POINTERS]; ///< pointers to the image data planes int linesize[AV_NUM_DATA_POINTERS]

转 kobject结构体分析

转载自:http://blog.csdn.net/zhoujiaxq/article/details/7646050 未知作者,以及源地址 ,敬请谅解. kobject是组成设备device.驱动driver.总线bus.class的基本结构. 如果把前者看成基类,则后者均为它的派生产物. device.driver.bus.class构成了设备模型,而kobject内嵌于其中,将这些设备模型的部件组织起来,并形成了sysfs文件系统.kobject就是device.driver.bus.cla