x264源码分析
2013-02-01 15:40
302 查看
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源码分析与应用示例(三)——浅谈码率控制的优化问题
- x264 源码分析 (6)
- X264源码分析
- ffmpeg源码分析五:ffmpeg调用x264编码器的过程分析
- ffmpeg源码分析五:ffmpeg调用x264编码器的过程分析 (转5)
- x264源码分析与应用示例(二)——码率控制
- x264源码分析 -- x264_slicetype_path
- x264源码分析
- x264源码分析三:x264_slices_write和x264_slice_write函数分析
- x264源码分析与应用示例(三)——浅谈码率控制的优化问题
- x264源码分析 -- x264_slicetype_mb_cost
- x264源码分析一:main函数和encode函数
- x264 源码分析 (1)
- x264_param_default()源码分析;
- x264源码分析 -- frame_init_lowres_core
- x264_param_default_preset()源码分析
- x264 源码分析 (2)
- x264 源码分析 (3)
- x264源码分析二:encode_frame函数和x264_encoder_encode函数
- x264命令行工具(x264.exe)源码整体分析