x264_t 結構體維護著CODEC的諸多重要信息
?
其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀,其類型已經確定;next是尚未確定類型的幀;unused用于回收不使用的frame結構體以備今后再次使用。
struct x264_t?????????????????????????????????
{
??? /* cpu capabilities */
??? unsigned int?? cpu;
??? /* bitstream output */
??? struct
??? {
??????? int???????? i_nal;???????? //定義一個網絡提取層//
??????? x264_nal_t? nal[3];???????? /* for now 3 is enought */
??????? int???????? i_bitstream;??? /* size of p_bitstream */
??????? uint8_t???? *p_bitstream;?? /* will hold data for all nal */
??????? bs_t??????? bs;
??? } out;
??? /* encoder parameters */
??? x264_param_t??? param;
??? /* frame number/poc (TODO: rework that for B-frame) */
??? int???????????? i_frame;??????????? //一個指示和控制幀編碼過程的結構
??? int???????????? i_poc;
??? int???????????? i_frame_offset; /* decoding only */
??? int???????????? i_frame_num;??? /* decoding only*/
??? int???????????? i_poc_msb;????? /* decoding only */
??? int???????????? i_poc_lsb;????? /* decoding only */
??? /* We use only one SPS and one PPS */
??? x264_sps_t????? sps_array[32];
??? x264_sps_t????? *sps;
??? x264_pps_t????? pps_array[256];
??? x264_pps_t????? *pps;
??? int???????????? i_idr_pic_id;
??? /* Slice header */
??? x264_slice_header_t sh;
??? /*cabac context */
??? x264_cabac_t??? cabac;
??? /*current picture being encoded */
??? x264_picture_t? *picture;
??? /*bframe handling (only encoding for now) */
??? x264_frame_t??? *bframe_current[X264_BFRAME_MAX]; /* store the sequence of b frame being encoded */
??? x264_frame_t??? *frame_next[X264_BFRAME_MAX+1];?? /* store the next sequence of frames to be encoded */這個是定義下一個幀,但不一定是B幀
??? x264_frame_t??? *frame_unused[X264_BFRAME_MAX+1]; /* store unused frames */
??? /*frame being reconstructed */
??? x264_frame_t??? *fdec;
??? /*Current MB DCT coeffs */
??? struct
??? {
??????? DECLARE_ALIGNED( int, luma16×16_dc[16], 16 );
??????? DECLARE_ALIGNED( int, chroma_dc[2][4], 16 );//色度
??????? struct
??????? {
??????????? DECLARE_ALIGNED( int, residual_ac[15], 16 );
??????????? DECLARE_ALIGNED( int, luma4×4[16], 16 );
??????? } block[16+8];16*8的宏快的取用情況
??? } dct;離散余弦變換
??? /* MBtable and cache for current frame/mb */
??? struct
??? {
??????? /*Strides */
??????? int???? i_mb_stride;
?
??????? /*Current index */
??????? int???? i_mb_x;
??????? int???? i_mb_y;
??????? int???? i_mb_xy;
??????? unsigned int i_neighbour;
??????? /* mb table */
??????? int8_t? *type;????????????????????? /*mb type */
??????? int8_t? *qp;??????????????????????? /* mb qp */
??????? int16_t *cbp;?????? ???????????????? /* mbcbp: 0×0?: luma, 0x?0: chroma, 0×100: luma dc, 0×0200 and 0×0400: chroma
dc? (all set for PCM)*/
??????? int8_t? (*intra4×4_pred_mode)[7];?? /* intra4×4 predmode. for non I4×4 set to I_PRED_4×4_DC(2) */
??????? uint8_t (*non_zero_count)[16+4+4];? /* nzc. for I_PCMset to 16 */
??????? int8_t? *chroma_pred_mode;????????? /*chroma_pred_mode. cabac only. for non intra I_PRED_CHROMA_DC(0) */
??????? int16_t (*mv[2])[2];??????????????? /* mb mv. set to 0 for intra mb */
??????? int16_t (*mvd[2])[2];?????????????? /* mb mv difference with predict. set to 0 if intra. cabac only */
??????? int8_t?? *ref[2];?????????????????? /*mb ref. set to -1 if non used (intra or Lx only */
??????? /*current value */
??????? int???? i_type;
??????? int??? i_partition;
??????? int???? i_sub_partition[4];
??????? int???? i_cbp_luma;
??????? int???? i_cbp_chroma;
??????? int???? i_intra16×16_pred_mode;
??????? int???? i_chroma_pred_mode;
??????? struct
??????? {
??????????? /*pointer over mb of the frame to be compressed */
??????????? uint8_t *p_img[3];
??????????? int????? i_img[3];
?
??????????? /*pointers over mb of references and reconstrucated frame */
??????????? uint8_t *p_fdec[3];
??????????? uint8_t*p_fref[2][16][3];
??????????? int???? i_fdec[3]; /* same strides for p_fdec/p_fref */
??????? } pic;
??????? /*cache */
??????? struct
??????? {
??????????? /*real intra4×4_pred_mode if I_4X4, I_PRED_4×4_DC if mb available, -1 if not */
??????????? int???? intra4×4_pred_mode[X264_SCAN8_SIZE];色度預測模式
??????????? /*i_non_zero_count if availble else 0×80 */
??????????? int???? non_zero_count[X264_SCAN8_SIZE];
??????????? /*-1 if unused, -2 if unavaible */
??????????? int8_t ref[2][X264_SCAN8_SIZE];
??????????? /*0 if non avaible */
??????????? int16_t mv[2][X264_SCAN8_SIZE][2];
??????????? int16_t mvd[2][X264_SCAN8_SIZE][2];運動矢量與真實值之間的差
??????? } cache;
??????? /**/
??????? int???? i_last_qp; /* last qp */
??????? int???? i_last_dqp; /*last delta qp */
?
??? } mb;宏快的預測以及運動補償和運動估計
??? /*frames used for reference */
??? x264_frame_t????? *freference[16+1];? /* all references frames plus current */
??? int?????????????? i_ref0; 參考幀列表一(定義為lsit0意為向前預測編碼)
??? x264_frame_t????? *fref0[16];?????? /* ref list 0*/
??? int?????????????? i_ref1;參考幀列表二(定義為lsit1意為向后預測編碼)
??? x264_frame_t????? *fref1[16];?????? /* ref list 1*/
??? /*rate control encoding only */
??? x264_ratecontrol_t *rc;
??? /*stats */
??? struct
??? {
??????? /*per slice info */
??????? int?? i_slice_count[5];
??????? int?? i_slice_size[5];
??????? float f_psnr_y[5];
??????? float f_psnr_u[5];
??????? float f_psnr_v[5];
??????? int?? i_mb_count[5][18];
??? } stat;聲明每一片的參數變量
??? /* CPU functions dependants */
??? x264_predict_t????? predict_16×16[4+3];
??? x264_predict_t????? predict_8×8[4+3];
??? x264_predict_t????? predict_4×4[9+3];
??? x264_pixel_function_t pixf;
??? x264_mc_function_t??? mc[2];
??? x264_dct_function_t?? dctf;
??? /* vlc table for decoding purpose only */
??? x264_vlc_table_t *x264_coeff_token_lookup[5];
??? x264_vlc_table_t *x264_level_prefix_lookup;
??? x264_vlc_table_t *x264_total_zeros_lookup[15];
??? x264_vlc_table_t *x264_total_zeros_dc_lookup[3];
??? x264_vlc_table_t *x264_run_before_lookup[7];
};
#endif
給出編碼過程中的各個參數的初始化
x264_param_t
typedef struct
{
??? /* CPU flags */
??? unsigned int cpu;
??? /* Video Properties */
??? int???????? i_width;
??? int???????? i_height;
??? struct
??? {
??????? /*they will be reduced to be 0 < x <= 65535 and prime */
??????? int???????? i_sar_height;
??????? int???????? i_sar_width;
??? } vui;?
??? float?????? f_fps;
/* Used for rate control only */
??? /*Bitstream parameters */
??? int???????? i_frame_reference;? /* Maximum number of reference frames */
??? int???????? i_idrframe; /*every i_idrframe I frame are marked as IDR */
??? int???????? i_iframe;?? /* every i_iframe are intra */
??? int???????? i_bframe;?? /* how many b-frame between 2 references pictures */
??? int???????? b_deblocking_filter;
??? int???????? b_cabac;
??? int???????? i_cabac_init_idc;給出熵編碼初始化時表格的選擇
??? int???????? i_qp_constant;? /* 1-51 */
??? int???????? i_bitrate;????? /* not working yet */
??? /* Encoder analyser parameters */
??? struct
??? {
??????? unsigned int intra;??? /* intra flags */
??????? unsigned int inter;??? /* inter flags */
??? } analyse;
?
}
x264_param_t給出編碼過程中的各個參數的初始化
?
sps序列參數集
typedef struct
{
??? int i_id;
?
??? int i_profile_idc;指明所用profile
??? int i_level_idc; 指明所用level
???? int b_constraint_set0;
??? int b_constraint_set1;
??? int b_constraint_set2; 當他們值等于1時,表示必須遵守某些制約條件
??? int i_log2_max_frame_num;表示圖像解碼順序的最大取值
?
??? int i_poc_type;??? /* poc 0 */
??? int i_log2_max_poc_lsb;??? /* poc 1 */
??? int b_delta_pic_order_always_zero;其值等于一時句法元素delta_pic_order_cnt[0]和 delta_pic_order_cnt[1]不再片頭出現,且他們的默認值都為0。為0時上述則出現。
??? int i_offset_for_non_ref_pic;用來計算非參考幀或場的picture order count ,其值應在[-2e31,2e31-1]
??? int i_offset_for_top_to_bottom_field; 用來計算幀的底場的picture order count 其值應在[-2e31,2e31-1]
??? int i_num_ref_frames_in_poc_cycle;用來解碼picture order count 取值應在[0,255]之間
??? int i_offset_for_ref_frame[256]; 當picture order count type=1時用來解碼poc,這句語法對循環num_ref_frames_in_poc_cycle中的每一個元素指定了一個偏移
?
??? int i_num_ref_frames;指定參考幀隊列的最大長度 h264規定最多可為16個參考幀
??? int b_gaps_in_frame_num_value_allowed;值為1時表示允許句法frame_num可以不連續
??? int i_mb_width;
??? int i_mb_height;
??? int b_frame_mbs_only;
??? int b_mb_adaptive_frame_field;
??? int b_direct8×8_inference;指明b片的直接和skip模式下運動矢量的預測方法
???
??? int b_crop;
??? struct
??? {
??????? int i_left;
??????? int i_right;
??????? int i_top;
??????? int i_bottom;
??? } crop;圖像剪彩后輸出的參數
?
??? int b_vui;
??? struct
??? {
??????? int i_sar_width;
??????? int i_sar_height;
??????? /* FIXME to complete */
??? } vui;
?
}
x264_sps_t定義序列參考隊列的參數以及初始化
?
pps圖像參數集
typedef struct
{
??? int i_id;
??? int i_sps_id;
??? int b_cabac;
??? int b_pic_order;
??? int i_num_slice_groups; 加一表示圖像中片組的個數
?
??
int i_slice_group_map_type;片組分割類型??? /*i_slice_group_map_type == 0 */
??? int i_run_length[256];? 指明片組類型為2時每個片組連續的map_units的個數??? /* FIXME */
??? /*i_slice_group_map_type == 2 */
??? int i_top_left[256];??????? /* FIXME */
??? int i_bottom_right[256];??? /* FIXME */
??? /*i_slice_group_map_type == 3, 4, 5 */
??? int b_slice_group_change_direction; 當類型為345時與下句語法一起指明片組分割方法
??? int i_slice_group_change_rate;??? /*i_slice_group_map_type == 6 */
??? int i_pic_size_in_map_units;類型為6時指明圖像以map_units為單位的大小
???
??? int i_slice_group_id[256];? /* FIXME */指明map_units屬于哪個片組
??? int i_num_ref_idx_l0_active;加1為參考幀隊列的長度 此為list0
??? int i_num_ref_idx_l1_active;此為list1
??? int b_weighted_pred;用以指明是否允許P和SP片的加權預測
???
??? int b_weighted_bipred; 用以指明是否允許B片的加權預測
???? int i_pic_init_qp;加26后用以指明亮度分量的量化參數的初始值
??? int i_pic_init_qs;同上只是用于SP和SI
??? int i_chroma_qp_index_offset;指明計算使用時用到的參數
??? int b_deblocking_filter_control;
??? int b_constrained_intra_pred;控制PB幀的幀內編碼
??? int b_redundant_pic_cnt;是否出現redundant_pic_cnt句法元素
} x264_pps_t