x264.c主线程调用说明

本文详细解析了x264编码器的工作流程,包括从main()函数启动,到x264_threading_init()初始化多线程,再到encode()函数中x264_encoder_open()打开编码器,直至x264_encoder_encode()API接口调用,完成YUV数据到H.264数据的转换。文章深入探讨了宏块分析、帧内预测、帧间预测、DCT变换、量化、CABAC熵编码等核心编码过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()关闭码率控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值