位于libavutil下frame.h文件中

  • 这个结构体用来描述解码出音视频数据。
  • AVFrame必须使用av_frame_alloc分配()。
  • AVFrame必须与av_frame_free释放()。
  • AVFrame通常分配一次,然后重复使用多次,不同的数据(如一个AVFrame持有来自解码器的frames。)在再次使用时,av_frame_unref()将自由持有的任何之前的帧引用并重置它变成初始态。
  • 一个AVFrame所描述的数据通常是通过参考AVBuffer API计算。内部的buffer引用存储在AVFrame.buf /AVFrame.extended_buf。
  • AVFrame将用于引用计数,当至少一个引用被set时,如果AVFrame.buf[0] != NULL, 每个单个数据至少包含一个AVFrame.buf /AVFrame.extended_buf.可能会有一个缓冲的数据,或一个单独的缓冲对每个plane, 或介于两者之间的任何东西。
  • sizeof(AVFrame)不是一个public的API,因此新的成员将被添加到末尾。同样字段标记为只访问av_opt_ptr()可以重新排序

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8/*** pointer to the picture/channel planes.* This might be different from the first allocated byte** Some decoders access areas outside 0,0 - width,height, please* see avcodec_align_dimensions2(). Some filters and swscale can read* up to 16 bytes beyond the planes, if these filters are to be used,* then 16 extra bytes must be allocated.** NOTE: Except for hwaccel formats, pointers not needed by the format* MUST be set to NULL.*/uint8_t *data[AV_NUM_DATA_POINTERS];/*** For video, size in bytes of each picture line.* For audio, size in bytes of each plane.** For audio, only linesize[0] may be set. For planar audio, each channel* plane must be the same size.** For video the linesizes should be multiples of the CPUs alignment* preference, this is 16 or 32 for modern desktop CPUs.* Some code requires such alignment other code can be slower without* correct alignment, for yet other it makes no difference.** @note The linesize may be larger than the size of usable data -- there* may be extra padding present for performance reasons.*/int linesize[AV_NUM_DATA_POINTERS];/*** pointers to the data planes/channels.** For video, this should simply point to data[].** For planar audio, each channel has a separate data pointer, and* linesize[0] contains the size of each channel buffer.* For packed audio, there is just one data pointer, and linesize[0]* contains the total size of the buffer for all channels.** Note: Both data and extended_data should always be set in a valid frame,* but for planar audio with more channels that can fit in data,* extended_data must be used in order to access all channels.*/uint8_t **extended_data;/*** width and height of the video frame*/int width, height;/*** number of audio samples (per channel) described by this frame*/int nb_samples;/*** format of the frame, -1 if unknown or unset* Values correspond to enum AVPixelFormat for video frames,* enum AVSampleFormat for audio)*/int format;/*** 1 -> keyframe, 0-> not*/int key_frame;/*** Picture type of the frame.*/enum AVPictureType pict_type;/*** Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.*/AVRational sample_aspect_ratio;/*** Presentation timestamp in time_base units (time when frame should be shown to user).*/int64_t pts;/*** PTS copied from the AVPacket that was decoded to produce this frame.*/int64_t pkt_pts;/*** DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used)* This is also the Presentation time of this AVFrame calculated from* only AVPacket.dts values without pts values.*/int64_t pkt_dts;/*** picture number in bitstream order*/int coded_picture_number;/*** picture number in display order*/int display_picture_number;/*** quality (between 1 (good) and FF_LAMBDA_MAX (bad))*/int quality;/*** for some private data of the user*/void *opaque;#if FF_API_ERROR_FRAME/*** @deprecated unused*/attribute_deprecateduint64_t error[AV_NUM_DATA_POINTERS];
#endif/*** When decoding, this signals how much the picture must be delayed.* extra_delay = repeat_pict / (2*fps)*/int repeat_pict;/*** The content of the picture is interlaced.*/int interlaced_frame;/*** If the content is interlaced, is top field displayed first.*/int top_field_first;/*** Tell user application that palette has changed from previous frame.*/int palette_has_changed;/*** reordered opaque 64 bits (generally an integer or a double precision float* PTS but can be anything).* The user sets AVCodecContext.reordered_opaque to represent the input at* that time,* the decoder reorders values as needed and sets AVFrame.reordered_opaque* to exactly one of the values provided by the user through AVCodecContext.reordered_opaque* @deprecated in favor of pkt_pts*/int64_t reordered_opaque;/*** Sample rate of the audio data.*/int sample_rate;/*** Channel layout of the audio data.*/uint64_t channel_layout;/*** AVBuffer references backing the data for this frame. If all elements of* this array are NULL, then this frame is not reference counted. This array* must be filled contiguously -- if buf[i] is non-NULL then buf[j] must* also be non-NULL for all j < i.** There may be at most one AVBuffer per data plane, so for video this array* always contains all the references. For planar audio with more than* AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in* this array. Then the extra AVBufferRef pointers are stored in the* extended_buf array.*/AVBufferRef *buf[AV_NUM_DATA_POINTERS];/*** For planar audio which requires more than AV_NUM_DATA_POINTERS* AVBufferRef pointers, this array will hold all the references which* cannot fit into AVFrame.buf.** Note that this is different from AVFrame.extended_data, which always* contains all the pointers. This array only contains the extra pointers,* which cannot fit into AVFrame.buf.** This array is always allocated using av_malloc() by whoever constructs* the frame. It is freed in av_frame_unref().*/AVBufferRef **extended_buf;/*** Number of elements in extended_buf.*/int        nb_extended_buf;AVFrameSideData **side_data;int            nb_side_data;/*** @defgroup lavu_frame_flags AV_FRAME_FLAGS* Flags describing additional frame properties.** @{*//*** The frame data may be corrupted, e.g. due to decoding errors.*/
#define AV_FRAME_FLAG_CORRUPT       (1 << 0)
/*** @}*//*** Frame flags, a combination of @ref lavu_frame_flags*/int flags;/*** MPEG vs JPEG YUV range.* It must be accessed using av_frame_get_color_range() and* av_frame_set_color_range().* - encoding: Set by user* - decoding: Set by libavcodec*/enum AVColorRange color_range;enum AVColorPrimaries color_primaries;enum AVColorTransferCharacteristic color_trc;/*** YUV colorspace type.* It must be accessed using av_frame_get_colorspace() and* av_frame_set_colorspace().* - encoding: Set by user* - decoding: Set by libavcodec*/enum AVColorSpace colorspace;enum AVChromaLocation chroma_location;/*** frame timestamp estimated using various heuristics, in stream time base* Code outside libavutil should access this field using:* av_frame_get_best_effort_timestamp(frame)* - encoding: unused* - decoding: set by libavcodec, read by user.*/int64_t best_effort_timestamp;/*** reordered pos from the last AVPacket that has been input into the decoder* Code outside libavutil should access this field using:* av_frame_get_pkt_pos(frame)* - encoding: unused* - decoding: Read by user.*/int64_t pkt_pos;/*** duration of the corresponding packet, expressed in* AVStream->time_base units, 0 if unknown.* Code outside libavutil should access this field using:* av_frame_get_pkt_duration(frame)* - encoding: unused* - decoding: Read by user.*/int64_t pkt_duration;/*** metadata.* Code outside libavutil should access this field using:* av_frame_get_metadata(frame)* - encoding: Set by user.* - decoding: Set by libavcodec.*/AVDictionary *metadata;/*** decode error flags of the frame, set to a combination of* FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there* were errors during the decoding.* Code outside libavutil should access this field using:* av_frame_get_decode_error_flags(frame)* - encoding: unused* - decoding: set by libavcodec, read by user.*/int decode_error_flags;
#define FF_DECODE_ERROR_INVALID_BITSTREAM   1
#define FF_DECODE_ERROR_MISSING_REFERENCE   2/*** number of audio channels, only used for audio.* Code outside libavutil should access this field using:* av_frame_get_channels(frame)* - encoding: unused* - decoding: Read by user.*/int channels;/*** size of the corresponding packet containing the compressed* frame. It must be accessed using av_frame_get_pkt_size() and* av_frame_set_pkt_size().* It is set to a negative value if unknown.* - encoding: unused* - decoding: set by libavcodec, read by user.*/int pkt_size;#if FF_API_FRAME_QP/*** QP table* Not to be accessed directly from outside libavutil*/attribute_deprecatedint8_t *qscale_table;/*** QP store stride* Not to be accessed directly from outside libavutil*/attribute_deprecatedint qstride;attribute_deprecatedint qscale_type;/*** Not to be accessed directly from outside libavutil*/AVBufferRef *qp_table_buf;
#endif/*** For hwaccel-format frames, this should be a reference to the* AVHWFramesContext describing the frame.*/AVBufferRef *hw_frames_ctx;
} AVFrame;
  • uint8_t *data[AV_NUM_DATA_POINTERS]:指针数组,存放YUV数据的地方。如图所示,一般占用前3个指针,分别指向Y,U,V数据。

    • 对于packed格式的数据(例如RGB24),会存到data[0]里面。
      对于planar格式的数据(例如YUV420P),则会分开成data[0],data[1],data[2]…(YUV420P中data[0]存Y,data[1]存U,data[2]存V)
  • int linesize[AV_NUM_DATA_POINTERS]:图像各个分量数据在此结构体中的的宽度。注意这并不是图像的宽度。在此例子中图像的尺寸为672X272,而亮度分量的宽度为704,应该是图像宽度经过64对齐后的结果。
  • uint8_t **extended_data:指向了图像数据。
  • int width, height:图像的宽高。
  • int nb_samples:此帧音频的点数。
  • int format:像素类型(视频),样点类型(音频)
  • int key_frame:是否关键帧,此例中为视频的第一帧,当然是关键帧了。
  • enum AVPictureType pict_type:图像类型,I,P,B等,同样,第一帧是I帧。
  • AVRational sample_aspect_ratio:像素的宽高比,注意不是图像的。
  • int64_t pts,pkt_pts,pkt_dts:和时间戳有关的变量,以后会详细介绍。
  • int coded_picture_number:编码顺序的图像num。
  • int display_picture_number:播放顺序的图像num。
  • int interlaced_frame:图像是否是隔行的。
  • int top_field_first:图像的top field first变量。
  • int64_t pkt_duration:对应packet的显示时长。
  • int pkt_size:对应packet的尺寸。
  • int8_t *qscale_table:据推测是存放qp(量化参数)的数组
  • AVBufferRef *qp_table_buf:成员data指向qscale_table。

FFmpeg总结(二)AV系列结构体之AVFrame相关推荐

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

    位置: 描述:主要扩展API的结构体 New fields can be added to the end with minor version bumps. Removal, reordering ...

  2. 《零基础看得懂的C语言入门教程 》——(十二)原来结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一 ...

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

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  4. FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  5. ZZULI-1184 平面点排序(二)(结构体专题)

    1184: 平面点排序(二)(结构体专题) Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 1291   Solved: 630 Submit Sta ...

  6. zzulioj:1196: 数星星(二)(结构体专题)

    1196: 数星星(二)(结构体专题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2993 解决: 964 [状态] [讨论版] [提交] [命题人:外部导入] 题目描述 一天,小明坐 ...

  7. c++如何定义二维数组结构体_原来数组还可以这么玩(宏把数组玩坏了)

    点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 想起青春追寻的昨天,你也是曾经追风的少年. 文 章 导 读 今天给小伙伴们介绍下用宏对数组值进行分类使用的方式,比较大的程序中的寄存器经常会这 ...

  8. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法:struct 结构体名{成员列表;};切记切记有分号!说明:成员列表就是指你要保存哪些类型的数据.注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类型.因为类型 ...

  9. C++学习笔记之二:通过结构体来理解类

    如果我们熟悉C中的结构体的话,理解C++中的类是很容易的.在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数.我们先来看一下C++中的结构体和类的异同之处:   ...

  10. FFMPEG中最关键的结构体之间的关系

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

最新文章

  1. 总是感觉时间不够用?程序员如何管理时间?
  2. JAVA基础7-封装(1)
  3. #1045 无法登录 MySQL 服务器 phpmyadmin
  4. pandas DataFrame(5)-合并DataFrame与Series
  5. 实习日记7.13-7.14
  6. 腾讯大佬教我的工作方法(非常有效!)
  7. 如何定义开发完成?(Definition of Done)
  8. Linux操作系统的性能将主要取决于,大学计算机基础试题题库及复习资料
  9. Nginx 之一:编译安装nginx 1.8.1 及配置
  10. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮
  11. kali linux 2017 中文,Kali Linux 2017.3 发布,带来已升级的内核和新工具
  12. gem install XXX报错
  13. Hibernate Criteria 条件查询
  14. Halcon软件和license下载
  15. eeglab新建电极位置并保存为文件
  16. Xpose 建立新工程
  17. 通过阿里P9代考这件事,聊聊职级
  18. 实战:无线wifi密码破解与路由器入侵
  19. 网络安全学习(渗透测试方法论,web架构安全分析,信息收集)
  20. html开发android,使用HTML5开发Android本地应用(一)

热门文章

  1. 抓取Js动态生成数据且以滚动页面方式分页的网页
  2. 何川L3管理课_模块5_给评价
  3. KITTI激光雷达点云解析与图像反投影
  4. 企业与市场_自动驾驶相关公司-技术发展
  5. 高等数学复习笔记(四)- 零点问题与微分不等式
  6. python 网页转pdf
  7. Spring Cloud之Swagger集群搭建
  8. 数据库已关闭。请指定主机身份证明以访问数据库重新启动和诊断工具
  9. 在记录异常日志的时候包含源代码文件名和行号等信息
  10. Objective-C 三大要素