源码分析系列x264_main_dataflow

Posted STN_LCD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码分析系列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

 

以上是关于源码分析系列x264_main_dataflow的主要内容,如果未能解决你的问题,请参考以下文章

源码分析系列x264_cavlc_dataflow

源码分析系列x264_deblocking_dataflow

源码分析系列x264_nal_dataflow

H264编码系列之ffmpeg和x264码率控制分析

x264学习资料之——雷神博客系列

x264代码剖析:encode()函数之x264_encoder_open()函数