zoukankan      html  css  js  c++  java
  • ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame

    一、AVPacket

    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

    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

    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;  

    from:http://blog.csdn.net/chance_yin/article/details/16817957

  • 相关阅读:
    阐述:SIP协议是什么
    【SIP协议】学习初学笔记
    【协议学习】SIP基本场景分析
    电话的前世今生
    深入浅出SIP协议
    QVariant类及QVariant与自定义数据类型转换的方法
    Qt中如何根据类名来实例化对象
    模板的全特化与偏特化
    为什么c++中,有时可以用类名直接访问非静态成员函数?
    C++引用详解
  • 原文地址:https://www.cnblogs.com/lidabo/p/9013811.html
Copyright © 2011-2022 走看看