main()函数
**main_internal():**
x264_threading_init():
parse():Parse command line data
sigint_handler():设置b_ctrl_c = 1;
encode():
x264_encoder_open():
x264_threading_init():
validate_parameters():
x264_cqm_parse_file():
x264_reduce_fraction():
x264_sps_init():根据输入参数填值
x264_pps_init():
x264_validate_levels():
x264_rdo_init():
x264_predict_16x16_init():int cpu, x264_predict_t pf[7]
x264_predict_4x4_init(): int cpu, x264_predict_t pf[12] 12个方向
x264_pixel_init():各种函数指针赋值
x264_dct_init():各种函数指针赋值
x264_cabac_init():
mbcmp_init(h);
chroma_dsp_init(h);
x264_analyse_init_costs():
x264_lookahead_init():
x264_ratecontrol_new():
x264_free():
x264_encoder_parameters():
memcpy(param, &h->thread[h->i_thread_phase]->param, sizeof(x264_param_t));
x264_encoder_headers():if b_repeat_headers = 0,只写一次SEI, SPS and PPS
for(i:all frames)
filter.get_frame():获取pic数据到cli_pic
x264_picture_init():只是赋3个值
convert_cli_to_lib_pic():
parse_qpfile():
encode_frame():循环调用编码一帧数据
x264_encoder_encode():api
write_frame()//输出一帧264数据
filter.release_frame():
print_status():
while():刷新残留数据
x264_encoder_delayed_frames():Flush delayed frames
encode_frame():
print_status():
x264_encoder_close():
x264_lookahead_delete():
x264_threadpool_delete():
x264_frame_delete():
x264_thread_sync_ratecontrol():
Slices used and PSNR()
close_file():
close_file():
encode_frame()循环调用编码每一帧主要函数接口:
x264_encoder_encode():api,存储YUV数据的x264_picture_t编码为存储H.264数据的x264_nal_t
x264_frame_pop_unused():获取1个x264_frame_t类型结构体fenc。
x264_frame_copy_picture():将输入的图像数据拷贝至fenc。
x264_frame_expand_border_mod16():16对齐
x264_lookahead_put_frame(): 将fenc放入lookahead.next.list[]队列,等待确定帧类型。
x264_lookahead_get_frames():通过lookahead分析帧类型。并且将帧放入frames.current[]队列。
x264_slicetype_decide(),
x264_slicetype_analyse()
x264_slicetype_frame_cost():一个待编码帧的最优(最小)损耗,
x264_slicetype_slice_cost():循环遍历一个编码帧中的所有宏块,进行帧内预测,帧间预测,
x264_frame_shift():从frames.current[]队列取出一帧用于编码。
x264_reference_update():更新参考帧列表。
x264_reference_reset():如果为IDR帧,调用该函数清空参考帧列表。
x264_reference_hierarchy_reset():如果是I(非IDR帧)、P帧、B帧(可做为参考帧),调用该函数(还没研究)。
x264_reference_build_list():创建参考帧列表list0和list1。
x264_ratecontrol_start():计算一帧的QP值,帧层码率控制
update_vbv_plan():b_vbv开启时
rate_estimate_qscale():根据选择的码率控制方式计算new_qscale
qscale2qp():根据new_qscale计算得到qp:(12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f )
accum_p_qp_update():更新qp的累加器中的值
slice_init():创建Slice Header。Fill "default" values
slice_header_init():
x264_macroblock_slice_init():
weighted_pred_init():只对P帧进行处理
slices_write()线程开启运行:x264_threadpool_run,当i_thread_frames > 1时
slices_write():编码数据(最关键的步骤)。
x264_nal_start():开始写一个NALU。
x264_macroblock_thread_init():初始化存储宏块的重建数据缓存fdec_buf[]和编码数据缓存fenc_buf[]。
x264_slice_header_write():输出Slice Header。
x264_fdec_filter_row():滤波模块。该模块包含了 环路滤波,半像素插值,SSIM/PSNR的计算。
x264_frame_deblock_row():去块效应滤波器。
x264_frame_filter():半像素插值。
x264_pixel_ssd_wxh():PSNR计算。
x264_pixel_ssim_wxh():SSIM计算。
x264_macroblock_cache_load_interlaced():将要编码宏块的周围宏块的信息读进来。
x264_macroblock_cache_load_progressive()
x264_macroblock_analyse():宏块分析模块。该模块包含了帧内预测模式分析以及帧间运动估计等。
x264_mb_analyse_init(): Analysis模块初始化。
x264_mb_analyse_intra(): 如果是I Slice:进行I宏块帧内预测模式分析。
x264_macroblock_probe_pskip(): 分析是否是skip模式。
x264_mb_analyse_inter_p16x16():P16x16宏块帧间预测模式分析。
x264_mb_analyse_inter_p8x8(): P8x8宏块帧间预测模式分析。
x264_mb_analyse_inter_p4x4():当P8x8代价值小于P16x16
x264_mb_analyse_inter_p8x4():如果P4x4的代价值小于P8x8时调用
x264_mb_analyse_inter_p16x8(): P16x8宏块帧间预测模式分析。如果P8x8代价值小于P16x16
x264_mb_analyse_intra():检查当前宏块作为Intra宏块编码的代价是否小于作为P宏块编码的代价
如果当前是B Slice,则进行和P Slice同样的处理。
x264_mb_analyse_inter_b16x16():B16x16宏块帧间预测模式分析。
x264_mb_analyse_inter_b8x8(): B8x8宏块帧间预测模式分析。
x264_mb_analyse_inter_b16x8(): B16x8宏块帧间预测模式分析。
x264_macroblock_encode():宏块编码模块,通过对残差的DCT变换、量化等方式对宏块进行编码。
x264_macroblock_encode_internal():
x264_macroblock_encode_skip():编码Skip类型宏块。
x264_mb_encode_i16x16():除了进行DCT变换之外,对16个小块DC系数进行Hadamard变换
x264_mb_encode_i4x4(): 编码Intra4x4类型的宏块。
帧间直接编码:编码就是“DCT变换+量化”两步的组合
x264_mb_encode_chroma():编码色度块。
x264_macroblock_write_cabac():CABAC熵编码模块。
x264_macroblock_write_cavlc():CAVLC熵编码模块。
x264_cavlc_mb_header_i():写入I宏块MB Header数据。包含帧内预测模式等。
x264_cavlc_mb_header_p():写入P宏块MB Header数据。包含MVD、参考帧序号等。
x264_cavlc_mb_header_b():写入B宏块MB Header数据。包含MVD、参考帧序号等。
x264_cavlc_qp_delta():写入QP。
x264_cavlc_block_residual():写入残差数据。
x264_macroblock_cache_save():保存当前宏块的信息。
x264_ratecontrol_mb():宏块级码率控制。
x264_nal_end():结束写一个NALU。
return x264_encoder_frame_end():编码结束后做一些后续处理
x264_frame_push_unused()将fenc重新放回frames.unused[]队列
x264_ratecontrol_end()关闭码率控制。