ffmpeg 基本数据结构和对象(一): AVPacket、AVPicture、AVFrame

来源:http://blog.csdn.net/chance_yin/article/details/16817957

一、AVPacket

[cpp] view plaincopy

  1. /**
  2. * AVPacket 作为解码器的输入 或 编码器的输出。
  3. * 当作为解码器的输入时,它由demuxer生成,然后传递给解码器
  4. * 当作为编码器的输出时,由编码器生成,然后传递给muxer
  5. * 在视频中,AVPacket 只能包含不大于1帧的内容,而视频的1帧可能要包含在多个AVPacket中,AVPacket < AVFrame
  6. *
  7. *
  8. * AVPacket 是ffmpeg中少数的几个公共ABI,它只能被libavcodec和libformat在栈上分配
  9. *
  10. * The side data is always allocated with av_malloc() and is freed in
  11. * av_free_packet().
  12. */
  13. typedef struct AVPacket {
  14. /**
  15. * packet的内存空间来自于一个叫做“引用计数缓冲区”的地方,这个指针就指向一块引用计数缓冲区
  16. */
  17. AVBufferRef *buf;
  18. /**
  19. * 显示时间戳 单位是 AVStream->time_base units
  20. */
  21. int64_t pts;
  22. /**
  23. * 解压时间戳,在这个时刻该包需要被解码
  24. */
  25. int64_t dts;
  26. uint8_t *data;
  27. int   size;
  28. int   stream_index;
  29. /**
  30. * A combination of AV_PKT_FLAG values
  31. */
  32. int   flags;
  33. /**
  34. * 存放额外的包信息
  35. */
  36. struct {
  37. uint8_t *data;
  38. int      size;
  39. enum AVPacketSideDataType type;
  40. } *side_data;
  41. int side_data_elems;
  42. /**
  43. * 这个包的时间长度 in AVStream->time_base units, 设置0 表示未知.
  44. * duration = next_pts - this_pts i.
  45. */
  46. int   duration;
  47. int64_t pos;                            ///< 在数据流中的字节偏移量, -1 if unknown
  48. int64_t convergence_duration;
  49. } AVPacket;

二、AVPicture

[cpp] view plaincopy

  1. typedef struct AVPicture {
  2. uint8_t *data[AV_NUM_DATA_POINTERS];    ///< pointers to the image data planes
  3. int linesize[AV_NUM_DATA_POINTERS];     ///< number of bytes per line
  4. }

三、AVFrame

[cpp] view plaincopy

    1. /**
    2. * AVFrame表示解码过后的一个数据帧
    3. *
    4. * AVFrame 通过使用 av_frame_alloc()来创建. 这个函数只是创建了AVFrame结构本身,在结构
    5. * 中定义的指向其他内存块的缓冲区指针要用其他方法来分配
    6. * 使用 av_frame_free()来释放AVFrame.
    7. *
    8. */
    9. typedef struct AVFrame {
    10. #define AV_NUM_DATA_POINTERS 8
    11. /**
    12. * pointer to the picture/channel planes.
    13. */
    14. uint8_t *data[AV_NUM_DATA_POINTERS];
    15. /**
    16. * For video, size in bytes of each picture line.
    17. * For audio, size in bytes of each plane.
    18. */
    19. int linesize[AV_NUM_DATA_POINTERS];
    20. /**
    21. * pointers to the data planes/channels.
    22. */
    23. uint8_t **extended_data;
    24. /**
    25. * width and height of the video frame
    26. */
    27. int width, height;
    28. /**
    29. * number of audio samples (per channel) described by this frame
    30. */
    31. int nb_samples;
    32. /**
    33. * format of the frame, -1 if unknown or unset
    34. */
    35. int format;
    36. /**
    37. * 1 -> keyframe, 0-> not
    38. */
    39. int key_frame;
    40. /**
    41. * Picture type of the frame.
    42. */
    43. enum AVPictureType pict_type;
    44. /**
    45. * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
    46. */
    47. AVRational sample_aspect_ratio;
    48. /**
    49. * Presentation timestamp in time_base units (time when frame should be shown to user).
    50. */
    51. int64_t pts;
    52. /**
    53. * PTS copied from the AVPacket that was decoded to produce this frame.
    54. */
    55. int64_t pkt_pts;
    56. /**
    57. * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isnt used)
    58. * This is also the Presentation time of this AVFrame calculated from
    59. * only AVPacket.dts values without pts values.
    60. */
    61. int64_t pkt_dts;
    62. /**
    63. * picture number in bitstream order
    64. */
    65. int coded_picture_number;
    66. /**
    67. * picture number in display order
    68. */
    69. int display_picture_number;
    70. /**
    71. * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
    72. */
    73. int quality;
    74. /**
    75. * for some private data of the user
    76. */
    77. void *opaque;
    78. /**
    79. * error
    80. */
    81. uint64_t error[AV_NUM_DATA_POINTERS];
    82. /**
    83. * When decoding, this signals how much the picture must be delayed.
    84. * extra_delay = repeat_pict / (2*fps)
    85. */
    86. int repeat_pict;
    87. /**
    88. * The content of the picture is interlaced.
    89. */
    90. int interlaced_frame;
    91. /**
    92. * If the content is interlaced, is top field displayed first.
    93. */
    94. int top_field_first;
    95. /**
    96. * Tell user application that palette has changed from previous frame.
    97. */
    98. int palette_has_changed;
    99. /**
    100. * Sample rate of the audio data.
    101. */
    102. int sample_rate;
    103. /**
    104. * Channel layout of the audio data.
    105. */
    106. uint64_t channel_layout;
    107. /**
    108. * 指向这个帧要用到的AVBuffer中的数据缓冲区.
    109. *
    110. * 一般每个图像位面(就时data[0],data[1] data[2])只有一个指向AVBuffer的缓冲区, so for video this array
    111. * always contains all the references. For planar audio with more than
    112. * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
    113. * this array. Then the extra AVBufferRef pointers are stored in the
    114. * extended_buf array.
    115. */
    116. AVBufferRef *buf[AV_NUM_DATA_POINTERS];
    117. /**
    118. * For planar audio which requires more than AV_NUM_DATA_POINTERS
    119. * AVBufferRef pointers, this array will hold all the references which
    120. * cannot fit into AVFrame.buf.
    121. */
    122. AVBufferRef **extended_buf;
    123. /**
    124. * Number of elements in extended_buf.
    125. */
    126. int        nb_extended_buf;
    127. AVFrameSideData **side_data;
    128. int            nb_side_data;
    129. /**
    130. * 可能因为解码错误,数据帧Frame会成为无效的帧,下面的结构就是当数据帧无效时使用的
    131. */
    132. #define AV_FRAME_FLAG_CORRUPT       (1 << 0)
    133. /**
    134. * Frame flags, a combination of AV_FRAME_FLAG_*
    135. */
    136. int flags;
    137. int64_t best_effort_timestamp;
    138. int64_t pkt_pos;
    139. int64_t pkt_duration;
    140. AVDictionary *metadata;
    141. int decode_error_flags;
    142. #define FF_DECODE_ERROR_INVALID_BITSTREAM   1
    143. #define FF_DECODE_ERROR_MISSING_REFERENCE   2
    144. int channels;
    145. int pkt_size;
    146. enum AVColorSpace colorspace;
    147. enum AVColorRange color_range;
    148. /**
    149. * Not to be accessed directly from outside libavutil
    150. */
    151. AVBufferRef *qp_table_buf;
    152. } AVFrame;
时间: 2024-10-22 11:03:23

ffmpeg 基本数据结构和对象(一): AVPacket、AVPicture、AVFrame的相关文章

[转载] ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame

一.AVPacket [cpp]view plain copy /** * AVPacket 作为解码器的输入 或 编码器的输出. * 当作为解码器的输入时,它由demuxer生成,然后传递给解码器 * 当作为编码器的输出时,由编码器生成,然后传递给muxer * 在视频中,AVPacket 只能包含不大于1帧的内容,而视频的1帧可能要包含在多个AVPacket中,AVPacket < AVFrame * * * AVPacket 是ffmpeg中少数的几个公共ABI,它只能被libavcode

[redis读书笔记] 第一部分 数据结构与对象 对象以及总结

- 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis的键值对中,键必然是用字符串对象实现的,所以我们一般说的列表键,指的是字符串键+列表值. - 但是redis并没用这些数据结构直接实现redis的键值数据库,而是基于这些数据结构有一个对象系统,这个系统包括:字符串对象,列表对象,哈希对象,集合对象和有序集合对象,每一种对象都可能用到一到多种基本的数

Redis 一、数据结构与对象--五大数据类型的底层结构实现

redis上手比较简单,但是它的底层实现原理一直很让人着迷.具体来说的话,它是怎么做到如此高的效率的?阅读Redis设计与实现这本书,可以很好的理解Redis的五种基本类型:String,List,Hash,Set,ZSet是如何在底层实现的.还可以了解Redis的其他机制的原理.我们现在来看看Redis中的基本的数据结构吧. 简单动态字符串 Redis的简单动态字符串,通常被用来存储字符串值,几乎所有的字符串类型都是SDS的.另外,SDS还常被用作缓冲区(buffer):AOF模块中的AOF缓

ES6 set和map数据结构对对象数组去重简单实现

自从有了es6的set数据结构,数组的去重可以简单用一行代码实现,比如下面的方式 let arr = [1, 2, 2, 3, 4] function unique (arr) { return [...new Set(arr)] } console.log(unique(arr)) // [1, 2, 3, 4] 但是当数组的项不再是简单的数据类型时,比如是对象时,这种方法就会导致错误,比如下面的结果 let arr = [ { name: 'a', num: 1}, { name: 'b',

Redis 基础数据结构与对象

Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象.列表对象.哈希对象.集合对象和有序结合对象共5种类型的对象. 1 简单动态字符串 redis自定义了简单动态字符串数据结构(sds),并将其作为默认字符串表示. struct sdshdr { unsigned int len; unsigned int free; char buf[

[redis读书笔记] 第一部分 数据结构与对象 对象特性

一 类型检查和多态    类型检查,即有的命令是只针对特定类型的,如果类型不对,就会报错,此处的类型,是指的键类型,即robj.type.下面为有类型检查的命令: 对于某一种类型,redis下底层的实现(编码类型 robj.encoding)可以是不同的,比如字符串键可以是ziplist或者linklist,那么可以想象,redis需要支持对命令的多态,无论编码类型是什么,都能得到正确的结果,  二 内存回收: robj.refcount用于内存回收,创建新的robj时,refcount为1,对

第一部分 数据结构与对象 跳跃表

下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://kenby.iteye.com/blog/1187303,为防止源地址丢失,故拷贝一份放在这里,望作者原谅. ---------------转载开始----------------- 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等. 想象一下,给

《Redis设计与实现》[第一部分]数据结构与对象-C源码阅读(一)

一.简单动态字符串SDS 关键字:空间预分配,惰性空间释放,二进制安全 C字符串不易更改,所以Redis中把C字符串用在一些无须对字符串值进行修改的地方,作为字符串字面量(String literal),比如打印日志: redisLog(REDIS_WARING, "Redis is now ready to exit, bye bye-"); 在Redis数据库中,包含字符串的键值对在底层都是由SDS实现的. SDS还被用作缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户

FFmpeg的常见结构体

小程之前介绍过FFmpeg的帧的结构(AVPacket跟AVFrame),帧会在一些流程中使用到. 除了帧结构,FFmpeg还有其它一些结构会在流程中使用到. FFmpeg还有哪些常见的结构呢?先来看一下这个截图: 这张图中的主角,是AVFormatContext.AVFormatContext,是FFmpeg的基本结构之一,对应于封装格式(或容器格式). 围绕FFmpeg的"格式场景",本文介绍FFmpeg常见的数据结构. 按照上图,小程依次介绍图中的几个结构体. (一)AVCode