x264_t結構體維護著CODEC的諸多重要信息
?
其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀,其類型已經確定;next是尚未確定類型的幀;unused用于回收不使用的frame結構體以備今后再次使用。
structx264_t?????????????????????????????????
{
???
???unsigned int??cpu;
???
???struct
???{
???????int????????i_nal;????????//定義一個網絡提取層//
???????x264_nal_t?nal[3];????????
???????int????????i_bitstream;???
???????uint8_t????*p_bitstream;??
???????bs_t???????bs;
???} out;
???
???x264_param_t???param;
???
???int????????????i_frame;???????????//一個指示和控制幀編碼過程的結構
???int????????????i_poc;
???int????????????i_frame_offset;
???int????????????i_frame_num;???
???int????????????i_poc_msb;?????
???int????????????i_poc_lsb;?????
???
???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;
???
???x264_slice_header_t sh;
???
???x264_cabac_t???cabac;
???
???x264_picture_t? *picture;
???
???x264_frame_t???*bframe_current[X264_BFRAME_MAX];
???x264_frame_t???*frame_next[X264_BFRAME_MAX+1];??這個是定義下一個幀,但不一定是B幀
???x264_frame_t???*frame_unused[X264_BFRAME_MAX+1];
???
???x264_frame_t???*fdec;
???
???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;離散余弦變換
???
???struct
???{
???????
???????int????i_mb_stride;
?
???????
???????int????i_mb_x;
???????int????i_mb_y;
???????int????i_mb_xy;
???????unsigned int i_neighbour;
???????
???????int8_t?*type;?????????????????????
???????int8_t?*qp;???????????????????????
???????int16_t*cbp;??????????????????????
???????int8_t?(*intra4×4_pred_mode)[7];??
???????uint8_t (*non_zero_count)[16+4+4];?
???????int8_t?*chroma_pred_mode;?????????
???????int16_t(*mv[2])[2];???????????????
???????int16_t(*mvd[2])[2];??????????????
???????int8_t??*ref[2];??????????????????
???????
???????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
???????{
???????????
???????????uint8_t *p_img[3];
???????????int?????i_img[3];
?
???????????
???????????uint8_t *p_fdec[3];
???????????uint8_t*p_fref[2][16][3];
???????????int????i_fdec[3];
???????} pic;
???????
???????struct
???????{
???????????
???????????int????intra4×4_pred_mode[X264_SCAN8_SIZE];色度預測模式
???????????
???????????int????non_zero_count[X264_SCAN8_SIZE];
???????????
???????????int8_t ref[2][X264_SCAN8_SIZE];
???????????
???????????int16_t mv[2][X264_SCAN8_SIZE][2];
???????????int16_t mvd[2][X264_SCAN8_SIZE][2];運動矢量與真實值之間的差
???????} cache;
???????
???????int????i_last_qp;
???????int????i_last_dqp;
?
???} mb;宏快的預測以及運動補償和運動估計
???
???x264_frame_t?????*freference[16+1];?
???int??????????????i_ref0; 參考幀列表一(定義為lsit0意為向前預測編碼)
???x264_frame_t?????*fref0[16];??????
???int??????????????i_ref1;參考幀列表二(定義為lsit1意為向后預測編碼)
???x264_frame_t?????*fref1[16];??????
???
???x264_ratecontrol_t *rc;
???
???struct
???{
???????
???????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;聲明每一片的參數變量
???
???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;
???
???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
{
???
???unsigned int cpu;
???
???int????????i_width;
???int????????i_height;
???struct
???{
???????
???????int????????i_sar_height;
???????int????????i_sar_width;
???} vui;?
???float??????f_fps;
???
???int????????i_frame_reference;?
???int????????i_idrframe;
???int????????i_iframe;??
???int????????i_bframe;??
???int????????b_deblocking_filter;
???int????????b_cabac;
???int????????i_cabac_init_idc;給出熵編碼初始化時表格的選擇
???int????????i_qp_constant;?
???int????????i_bitrate;?????
???
???struct
???{
???????unsigned intintra;???
???????unsigned intinter;???
???} 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;表示圖像解碼順序的最大取值
?
???inti_poc_type;???
???inti_log2_max_poc_lsb;???
???intb_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 counttype=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;
???????
???} 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; 加一表示圖像中片組的個數
?
??
inti_slice_group_map_type;片組分割類型???
???int i_run_length[256];?指明片組類型為2時每個片組連續的map_units的個數???
???
???inti_top_left[256];???????
???inti_bottom_right[256];???
???
???int b_slice_group_change_direction; 當類型為345時與下句語法一起指明片組分割方法
???inti_slice_group_change_rate;???
???int i_pic_size_in_map_units;類型為6時指明圖像以map_units為單位的大小
???
???int i_slice_group_id[256];?指明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