源码分析系列(一)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流程图

 

 
分类: X264

 

posted @ 2017-07-18 10:43  STN_LCD  阅读(354)  评论(0编辑  收藏  举报