X264.c ---->
main() --->
parse( argc, argv, ¶m, &opt ) ---->//解釋參數
x264_param_default( &defaults ); //設置默認的值,見下結構體 x264_param_t *param
encode( ¶m, &opt ); --->//進入x264.c中的Encode函數
x264_encoder_open(param); ---->//這個函數是對不正確的參數進行修改,並對各結構體參數和cabac編碼,預測等需要的參數進行初始化.
x264_validate_parameters( h, 1 ) //驗證參數
x264_sps_init( h->sps, h->param.i_sps_id, &h->param ); --->//初始化 x264_sps_t 結構體
x264_pps_init( h->pps, h->param.i_sps_id, &h->param, h->sps ); ---> //初始化 x264_pps_t 結構體
x264_validate_levels( h, 1 ); --->
x264_cqm_init( h );---->
encode_frame() ---->
x264_encoder_encode() ---->//對幀進行編碼
{
//step 1: Copy the picture to a frame and move it to a buffer
x264_frame_copy_picture();
//step 2: Place the frame into the queue for its slice type decision
x264_lookahead_put_frame();
//step 3:The picture is analyzed in the lookahead
x264_lookahead_get_frames();
//step 4: get picture to encode
x264_frame_shift();
//step 5:Init data dependent of frame type
x264_reference_build_list();
//step 6:end
x264_encoder_frame_end
}
x264_encoder_close() ----->
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
結構體
/*x264_param_t *param*/
附部分變量的意義:
param->i_csp = X264_CSP_I420; // 設置輸入的視頻採樣的格式
param->vui.i_sar_width = 0; //VUI:video usability information
param->i_fps_num = 10; //幀率
param->i_fps_den = 1; //用兩個整型的數的比值,來表示幀率
/* Encoder parameters */
param->i_frame_reference = 1; //參考幀的最大幀數。
param->i_bframe = 0; //兩個參考幀之間的B幀數目。
param->b_deblocking_filter = 1; //去塊效應相關
param->b_cabac = 0; //cabac的開關
param->i_cabac_init_idc = -1;
param->rc.b_cbr = 1; //constant bitrate 恆定碼率控制模式
param->rc.i_bitrate = 0; //默認的碼率
param->rc.i_rc_buffer_size = 0; //buffer的大小
param->rc.i_rc_init_buffer = 0; //
param->rc.i_rc_sens = 100; ///* rate control sensitivity
param->rc.i_rc_method = X264_RC_NONE; //碼率控制,CQP(恆定質量)、//CRF(恆定碼率)、ABR(平均碼率)
param->rc.i_qp_constant = 26; //qp的初始值,最大最小的qp值,
param->rc.i_qp_min = 10; //最小的qp值
param->rc.i_qp_max = 51; //最大的qp值
param->rc.i_qp_step = 4; //qp[步長step。
param->rc.f_ip_factor = 1.4; //ip--i幀p幀的qp的差值
param->rc.f_pb_factor = 1.3; //pb--p幀b幀的qp的差值
/* Log */ //整個param的一個log文件
/*analyse */
param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8;
//楨內分析
param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8 | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16;
//楨間分析
param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
//預測模式
param->analyse.i_me_method = X264_ME_HEX; //運動估計模式
param->analyse.i_me_range = 16; //運動估計範圍
param->analyse.i_subpel_refine = 5;
param->analyse.b_chroma_me = 1;
param->analyse.i_mv_range_thread = -1;
param->analyse.i_mv_range = -1; // set from level_idc
param->analyse.i_direct_8x8_inference = -1; // set from level_idc
param->analyse.i_chroma_qp_offset = 0;
param->analyse.b_fast_pskip = 1;
param->analyse.b_dct_decimate = 1;
param->analyse.i_luma_deadzone[0] = 21;
param->analyse.i_luma_deadzone[1] = 11;
param->analyse.b_psnr = 1;
param->analyse.b_ssim = 1;
param->i_cqm_preset = X264_CQM_FLAT; //自定義量化矩陣(CQM),初始化量化模式爲flat
}
結構體 //x264_sps_t
typedef struct
{
int i_id; //本序列參數集的id號
int i_profile_idc; //指明所用的profile
int i_level_idc; //指明所用的level
int b_constraint_set0; //其值等於時,表示必須遵從附錄A.2.1所指明的所有約束條件
int b_constraint_set1; //其值等於時,表示必須遵從附錄A.2.2所指明的所有約束條件
int b_constraint_set2; //其值等於時,表示必須遵從附錄A.2.3所指明的所有約束條件
int i_log2_max_frame_num; //這個句法元素只要是爲讀取frame_num服務的
int i_poc_type; //指明poc的編碼方法,poc標識圖像的播放順序
/* poc 0 */
int i_log2_max_poc_lsb; //指明瞭變量i_poc_lsb的max值
/* poc 1 */
int b_delta_pic_order_always_zero; //其值爲時,i_delta_poc[0]和i_delta_poc[1]不在片頭出現,並且它們的默認值爲;當本句法元素爲時,上述兩個句法元素將在片頭出現
int i_offset_for_non_ref_pic; //用於計算非參考幀或場的poc
int i_offset_for_top_to_bottom_field; //用於計算幀的底場的poc
int i_num_ref_frames_in_poc_cycle; //被用來解碼poc
int i_offset_for_ref_frame[256]; //當i_poc_type=時用於解碼poc,本句法元素對循環i_num_ref_frames_in_poc_cycle中的每一個元素指定一個偏移
int i_num_ref_frames; //指定參考幀隊列可能達到的最大長度,解碼器根據這個句法元素的值開闢存儲區,這個存儲區用於存放已解碼的參考幀
int b_gaps_in_frame_num_value_allowed; //這個句法元素等於時,表示允許句法元素frame_num可以不連續;當傳輸信道堵塞時,允許丟棄若干幀
int i_mb_width; //圖像的寬度,以宏塊爲單位
int i_mb_height; //圖像的高度,以宏塊爲單位
int b_frame_mbs_only; //本句法元素等於時,表示本序列中所有的圖像編碼模式都是幀,沒有其他編碼模式存在;當爲時,表示本序列中圖像的編碼模式可能是幀,也可能是場或幀場自適應
int b_mb_adaptive_frame_field; //指明本序列是否屬於幀場自適應模式
int b_direct8x8_inference; //指明b片的直接和skip模式下運動矢量的預測方法
int b_crop; //指明解碼器是否要將圖像裁剪後輸出,如果是的話,後面緊跟的四個句法元素分別指出左、右、上、下裁剪的寬度
struct
{
int i_left;
int i_right;
int i_top;
int i_bottom;
} crop;
int b_vui; //指明vui子結構是否出現在碼流中
struct
{
...... //省略
/* FIXME to complete */
} vui;
int b_qpprime_y_zero_transform_bypass;
} x264_sps_t;
typedef struct
{
int i_id; //本參數集的序號,在片頭被引用
int i_sps_id; //本圖像參數集所引用的序列參數集的序號
int b_cabac; //0時使用cavlc,時使用cabac
int b_pic_order; //poc的三種計算方法在片層還各需要用一些句法元素作爲參數;當等於時,表示在片頭會有句句法元素指明這些參數;當爲時,表示片頭不會給出這些參數
int i_num_slice_groups; //圖像中片組的個數
int i_num_ref_idx_l0_active; //指明目前參考幀隊列的長度,即有多少各參考幀(短期和長期),用於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; //亮度分量的量化參數的初始值
int i_pic_init_qs; //亮度分量的量化參數的初始值,用於SP和SI
int i_chroma_qp_index_offset; //色度分量的量化參數是根據亮度分量的量化參數計算出來的,本句法元素用以指明計算時用到的參數
int b_deblocking_filter_control; //編碼器可以通過句法元素顯式地控制去塊濾波的強度
int b_constrained_intra_pred; //在p和b片中,幀內編碼的宏塊的鄰近宏塊可能是採用的幀間編碼
int b_redundant_pic_cnt;
int b_transform_8x8_mode;
int i_cqm_preset;
const uint8_t *scaling_list[6]; /* could be 8, but we don't allow separate Cb/Cr lists */
} x264_pps_t;
x264源碼分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.