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;

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