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
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
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