x264源碼分析

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;

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