ffmpeg重要结构体之HEVCContext和HEVCFrame


HEVCContext和HEVCFrame是ffmpeg的HEVC解码中非常重要的结构体。

首先来看下HEVCContext,定义位于libavcodec\Hevc.h中。代码如下:

typedef struct HEVCContext {
    const AVClass *c;  // needed by private avoptions
    AVCodecContext *avctx;

    struct HEVCContext  *sList[MAX_NB_THREADS];

    HEVCLocalContext    *HEVClcList[MAX_NB_THREADS];
    HEVCLocalContext    *HEVClc;

    uint8_t             threads_type;
    uint8_t             threads_number;

    int                 width;
    int                 height;

    uint8_t *cabac_state;

    /** 1 if the independent slice segment header was successfully parsed */
    uint8_t slice_initialized;

    AVFrame *frame;
    AVFrame *output_frame;
    uint8_t *sao_pixel_buffer_h[3];
    uint8_t *sao_pixel_buffer_v[3];

    HEVCParamSets ps;

    AVBufferPool *tab_mvf_pool;
    AVBufferPool *rpl_tab_pool;

    ///< candidate references for the current frame
    RefPicList rps[5];

    SliceHeader sh;
    SAOParams *sao;
    DBParams *deblock;
    enum NALUnitType nal_unit_type;
    int temporal_id;  ///< temporal_id_plus1 - 1
    HEVCFrame *ref;
    HEVCFrame DPB[32];
    int poc;
    int pocTid0;
    int slice_idx; ///< number of the slice being currently decoded
    int eos;       ///< current packet contains an EOS/EOB NAL
    int last_eos;  ///< last packet contains an EOS/EOB NAL
    int max_ra;
    int bs_width;
    int bs_height;

    int is_decoded;
    int no_rasl_output_flag;

    HEVCPredContext hpc;
    HEVCDSPContext hevcdsp;
    VideoDSPContext vdsp;
    BswapDSPContext bdsp;
    int8_t *qp_y_tab;
    uint8_t *horizontal_bs;
    uint8_t *vertical_bs;

    int32_t *tab_slice_address;

    //  CU
    uint8_t *skip_flag;
    uint8_t *tab_ct_depth;
    // PU
    uint8_t *tab_ipm;

    uint8_t *cbf_luma; // cbf_luma of colocated TU
    uint8_t *is_pcm;

    // CTB-level flags affecting loop filter operation
    uint8_t *filter_slice_edges;

    /** used on BE to byteswap the lines for checksumming */
    uint8_t *checksum_buf;
    int      checksum_buf_size;

    /**
     * Sequence counters for decoded and output frames, so that old
     * frames are output first after a POC reset
     */
    uint16_t seq_decode;
    uint16_t seq_output;

    int enable_parallel_tiles;
    int wpp_err;

    const uint8_t *data;

    HEVCPacket pkt;
    // type of the first VCL NAL of the current frame
    enum NALUnitType first_nal_type;

    // for checking the frame checksums
    struct AVMD5 *md5_ctx;
    uint8_t       md5[3][16];
    uint8_t is_md5;

    uint8_t context_initialized;
    uint8_t is_nalff;       ///< this flag is != 0 if bitstream is encapsulated
                            ///< as a format defined in 14496-15
    int apply_defdispwin;

    int active_seq_parameter_set_id;

    int nal_length_size;    ///< Number of bytes used for nal length (1, 2 or 4)
    int nuh_layer_id;

    /** frame packing arrangement variables */
    int sei_frame_packing_present;
    int frame_packing_arrangement_type;
    int content_interpretation_type;
    int quincunx_subsampling;

    /** display orientation */
    int sei_display_orientation_present;
    int sei_anticlockwise_rotation;
    int sei_hflip, sei_vflip;

    int picture_struct;
} HEVCContext;

简要介绍其中的解码相关的重要成员:

AVCodecContext *avctx:对应的codec上下文。

int width,height:图像宽高。

uint8_t *cabac_state:cabac的状态,算数编码相关。

uint8_t slice_initialized:根据注释,当解码到independent slice segment header时,置为1。

AVFrame *frame,*output_frame:图像存储结构体。

uint8_t *sao_pixel_buffer_h[3],sao_pixel_buffer_v[3]:SAO相关。

HEVCParamSets ps:HEVC参数集。成员包括存储VPS,SPS和PPS的buffer,和当前激活的VPS,SPS和PPS。

AVBufferPool *tab_mvf_pool:运动向量相关的buffer pool。

AVBufferPool *rpl_tab_pool:reference picture list的buffer pool。

RefPicList rps[5]:5个refPicList的candidate表格,在rps计算中使用。

SliceHeader sh:slice header结构体,存储slice header的信息。

SAOParams *sao:SAO的相关参数。

DBParams *deblock:Deblock的相关参数。

enum NALUnitType nal_unit_type:当前NAL的类型。

HEVCFrame *ref:存放参考帧,有待进一步的研究。

HEVCFrame DPB[32]:DecodePicBuffer。

int poc:picture order count

HEVCPredContext hpc:帧内预测上下文,包含intra pred的相关函数,之后会详细分析。

HEVCDSPContext hevcdsp:编解码计算上下文,包括变换,差值,滤波,SAO等的相关函数。

int8_t *qp_y_tab:存放亮度QP

uint8_t *horizontal_bs,*vertical_bs:水平和垂直方向的滤波强度。

int32_t *tab_slice_address:slice地址。

uint8_t *skip_flag:CU是否skip。

uint8_t *tab_ct_depth:CU的depth。

uint8_t *tab_ipm:存放intra pred mode

HEVCPacket pkt:存放packet信息的结构体,其中包含成员HEVCNAL *nals,存放packet中所有的nalu的信息。

enum NALUnitType first_nal_type:当前帧的第一个nal的类型。


结构体HECVFrame位于位于libavcodec\Hevc.h中。代码如下:

typedef struct HEVCFrame {
    AVFrame *frame;
    ThreadFrame tf;
    MvField *tab_mvf;
    RefPicList *refPicList;
    RefPicListTab **rpl_tab;
    int ctb_count;
    int poc;
    struct HEVCFrame *collocated_ref;

    HEVCWindow window;

    AVBufferRef *tab_mvf_buf;
    AVBufferRef *rpl_tab_buf;
    AVBufferRef *rpl_buf;

    AVBufferRef *hwaccel_priv_buf;
    void *hwaccel_picture_private;

    /**
     * A sequence counter, so that old frames are output first
     * after a POC reset
     */
    uint16_t sequence;

    /**
     * A combination of HEVC_FRAME_FLAG_*
     */
    uint8_t flags;
} HEVCFrame;

其中的解码相关的重要成员有:

MvField *tab_mvf:运动向量的tab

RefPicList *refPicList:备选参考帧的list

RefPicListTab **rpl_tab:备选参考帧的tab,(一个tab含有list0,list1)

int ctb_count:coding tree block的计数。

struct HEVCFrame *collocated_ref:collocated的参考帧

int poc:当前帧的poc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章