x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()

本文深入剖析x264编码器中的宏块编码函数x264_macroblock_encode()及其内部函数x264_macroblock_encode_internal()。详细解释了Skip、Intra16x16、Intra4x4类型宏块的编码过程,以及Inter类型宏块的DCT变换、量化、反量化和DCT反变换步骤。
摘要由CSDN通过智能技术生成

x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()

 

        宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_macroblock_encode()调用了x264_macroblock_encode_internal()函数,在x264_macroblock_encode_internal()函数中,主要完成了如下功能:

 

x264_macroblock_encode_skip():编码Skip类型宏块。

x264_mb_encode_i16x16():编码Intra16x16类型的宏块。该函数除了进行DCT变换之外,还对16个小块的DC系数进行了Hadamard变换。

x264_mb_encode_i4x4():编码Intra4x4类型的宏块。

帧间宏块编码:这一部分代码直接写在了函数体里面。

x264_mb_encode_chroma():编码色度块。

 

        x264_macroblock_encode()函数与x264_macroblock_encode_internal()函数都处于encoder文件夹内的macroblock.c,其调用关系图如下所示:

 



1x264_macroblock_encode()函数

 

        x264_macroblock_encode()函数处于encoder文件夹内的macroblock.c中,x264_macroblock_encode()封装了x264_macroblock_encode_internal()。如果色度模式是YUV444的话,传递的参数plane_count=3chroma=0;如果不是YUV444的话,传递的参数plane_count=1chroma=1

 

对应的代码如下:

 

/******************************************************************/
/******************************************************************/
/*
======Analysed by RuiDong Fang
======Csdn Blog:http://blog.csdn.net/frd2009041510
======Date:2016.03.22
 */
/******************************************************************/
/******************************************************************/

/************====== 宏块编码函数x264_macroblock_encode() ======************/
/*
功能:x264_macroblock_encode()封装了x264_macroblock_encode_internal(),即编码的内部函数——残差DCT变换、量化
*/
void x264_macroblock_encode( x264_t *h )
{
    if( CHROMA444 )
        x264_macroblock_encode_internal( h, 3, 0 );//YUV444相当于把YUV3个分量都当做Y编码
    else
        x264_macroblock_encode_internal( h, 1, 1 );
}

 

2x264_macroblock_encode_internal()函数

 

        x264_macroblock_encode_internal()函数也处于encoder文件夹内的macroblock.c中,具体的代码分析如下:

 

/************====== 宏块编码函数x264_macroblock_encode_internal() ======************/
/*
功能:调用了编码-残差DCT变换、量化-内部函数
*/
/*****************************************************************************
 * x264_macroblock_encode:
 *****************************************************************************/
static ALWAYS_INLINE void x264_macroblock_encode_internal( x264_t *h, int plane_count, int chroma )
{
    int i_qp = h->mb.i_qp;
    int b_decimate = h->mb.b_dct_decimate;
    int b_force_no_skip = 0;
    int nz;
    h->mb.i_cbp_luma = 0;
    for( int p = 0; p < plane_count; p++ )
        h->mb.cache.non_zero_count[x264_scan8[LUMA_DC+p]] = 0;

	/*======== PCM ========*/
    if( h->mb.i_type == I_PCM )//PCM
    {
      
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值