源码分析系列(一)x264_main_dataflow
http://www.cnblogs.com/xkfz007/articles/2616153.html
帧内帧间编码部分关键函数
1.1 x264_encoder_open (x264_param_t *param )
功能
分配编码器所需结构体。
检测参数有效性。
初始化sps和pps。
分配编码器所需memory空间,包括参考帧和缓冲帧。
初始化macroblock cache相应空间。
分配编码器所需memory空间,包括参考帧和缓冲帧。
根据cpu类型,初始化各指令集加速函数。
输入项目
x264_param_t *param
输出项目
x264_t *h
存储分配
x264_t *h = x264_malloc( sizeof( x264_t ) );
h->out.p_bitstream = x264_malloc( h->out.i_bitstream );
h->frames.unused[i] = x264_frame_new( h );
h->frames.reference[i] = x264_frame_new( h );
x264_ratecontrol_new( h ) ;
1.2 x264_encoder_encode(x264_t *h, x264_nal_t **pp_nal, int *pi_nal, x264_picture_t *pic)
功能
处理编码帧队列,并设置编码帧类型。
初始化参考列表、码率控制等相关信息。
根据编码信息,写sps、pps位流。
调用int x264_slices_write( x264_t *h )函数编码一帧。
更新码率控制、噪声抑制等参数。
输入项目
x264_t *h
x264_nal_t **pp_nal
int *pi_nal
x264_picture_t *pic
输出项目
Log文件等。
程序逻辑
如附图1所示。
附图1: x264_encoder_encode流程图
1.3 x264_slice_write(x264_t *h, int i_nal_type, int i_nal_ref_idc)
功能
调用x264_slice_header_write函数向码流写入slice header
Load宏块到cache
宏块分析
宏块编码
宏块写cavlc/cabac
保存宏块到cache
输入项目
x264_t *h
int i_nal_type
int i_nal_ref_idc
程序逻辑
如附图2所示:
附图2: x264_slice_write流程图
1.4 x264_macroblock_analyse(x264_t *h )
功能
初始化;
对于I Slice,遍历所有16x16和4x4预测模式,得到最小Cost所对应的分块方式和预测模式;
对于P Slice,如果宏块周围有Skip模式的宏块,检测当前块是否是Skip块,如果不是Skip块,遍历所有可能的块划分模式,对每种模式进行运动估计并计算Cost,计算intra对应的16x16和4x4的Cost(包括色度),比较所有的Cost,选最小的Cost对应的模式为最终模式。
输入项目
x264_t *h
程序逻辑
如附图3所示:
附图3: x264_macroblock_analyse流程图
1.5 x264_macroblock_encode(x264_t *h )
功能
DCT;
量化;
Zigzag;
反量化;
运动补偿;
得到残差的dct域coff。
输入项目
x264_t *h
程序逻辑
如附图4所示:
附图4:x264_macroblock_encode流程图
运动补偿x264_mb_mc( x264_t *h )的大体流程,如附图5所示:
附图5: x264_mb_mc流程图