美文网首页
(十)帧间编码3:运动估计之菱形搜索

(十)帧间编码3:运动估计之菱形搜索

作者: 奔向火星005 | 来源:发表于2018-09-08 10:09 被阅读0次

上一篇文章简单介绍了5种运动搜索算法,现在介绍5种搜索算法中最简单的一种:菱形搜索。源码如下:

    switch( h->mb.i_me_method )
    {
        case X264_ME_DIA:
        {
            /* diamond search, radius 1 */
            bcost <<= 4;   //左移4位,因为bcost低四位将要存放代表上下左右位置的标志
            int i = i_me_range;
            do
            {
                COST_MV_X4_DIR( 0,-1, 0,1, -1,0, 1,0, costs );  //计算bmx,bmy像素点上下左右四个临近点的cost
                COPY1_IF_LT( bcost, (costs[0]<<4)+1 );  //若(costs[0]<<4)+1 小于bcost则将它赋给bcost
                COPY1_IF_LT( bcost, (costs[1]<<4)+3 );
                COPY1_IF_LT( bcost, (costs[2]<<4)+4 );
                COPY1_IF_LT( bcost, (costs[3]<<4)+12 );
                if( !(bcost&15) )   //若bmx,bmy像素点的上下左右的cost都不小于bcost,则退出搜索
                    break;
                
                bmx -= (bcost<<28)>>30;  //下一个搜索中心点是本次cost最小的像素点
                bmy -= (bcost<<30)>>30;  
                bcost &= ~15;
            } while( --i && CHECK_MVRANGE(bmx, bmy) );  //超过搜索范围也要退出
            bcost >>= 4;   //将bcost还原
            break;
        }
//省略...
  }

源码中bcost是记录待编码宏块与参考宏块之间的的差值,通常为sad(绝对误差和)或satd(hadamard变换后再绝对值求和)。菱形搜索是一个while循环,遍历以bmx, bmy为中心的上下左右四个方向的像素点对应的宏块,求出最小差值的一点,再以该点为中心继续遍历。最重要的操作是COST_MV_X4_DIR宏,代码如下:

#define COST_MV_X4_DIR( m0x, m0y, m1x, m1y, m2x, m2y, m3x, m3y, costs )\
{\
    pixel *pix_base = p_fref_w + bmx + bmy*stride;\
    h->pixf.fpelcmp_x4[i_pixel]( p_fenc,\
        pix_base + (m0x) + (m0y)*stride,\
        pix_base + (m1x) + (m1y)*stride,\
        pix_base + (m2x) + (m2y)*stride,\
        pix_base + (m3x) + (m3y)*stride,\
        stride, costs );\
    (costs)[0] += BITS_MVD( bmx+(m0x), bmy+(m0y) );\
    (costs)[1] += BITS_MVD( bmx+(m1x), bmy+(m1y) );\
    (costs)[2] += BITS_MVD( bmx+(m2x), bmy+(m2y) );\
    (costs)[3] += BITS_MVD( bmx+(m3x), bmy+(m3y) );\
}

在源码中,p_fenc代表的是待编码帧,p_fref_w代表的是参考帧,注意,运动估计,菱形搜索这些都是帧间编码才有的,而非帧内编码,千万不要搞混淆了,如下图:


菱形搜索00.png

h->pixf.fpelcmp_x4[i_pixel]是一个函数指针,它的c语言版本的实现如下:

static void x264_pixel_sad_x4_8x8( pixel *fenc, pixel *pix0, pixel *pix1,pixel *pix2, pixel *pix3,\
                                      intptr_t i_stride, int scores[4] )\
{\
    scores[0] = x264_pixel_sad_8x8( fenc, FENC_STRIDE, pix0, i_stride );\
    scores[1] = x264_pixel_sad_8x8( fenc, FENC_STRIDE, pix1, i_stride );\
    scores[2] = x264_pixel_sad_8x8( fenc, FENC_STRIDE, pix2, i_stride );\
    scores[3] = x264_pixel_sad_8x8( fenc, FENC_STRIDE, pix3, i_stride );\
}

x264_pixel_sad_8x8是计算两个8x8宏块的绝对误差和的函数,它的c语言版本是一个宏,大致实现如下:

static int x264_pixel_sad_8x8( pixel *pix1, intptr_t i_stride_pix1,  \
                 pixel *pix2, intptr_t i_stride_pix2 ) \
{                                                   \
    int i_sum = 0;                                  \
    for( int y = 0; y < 8; y++ )                   \
    {                                               \
        for( int x = 0; x < 8; x++ )               \
        {                                           \
            i_sum += abs( pix1[x] - pix2[x] );      \
        }                                           \
        pix1 += i_stride_pix1;                      \
        pix2 += i_stride_pix2;                      \
    }                                               \
    return i_sum;                                   \
}

相关文章

  • (十)帧间编码3:运动估计之菱形搜索

    上一篇文章简单介绍了5种运动搜索算法,现在介绍5种搜索算法中最简单的一种:菱形搜索。源码如下: 源码中bcost是...

  • (十一)帧间编码4:运动估计之六边形搜索

    六边形搜索比菱形搜索稍复杂,先以六边形搜索找出最小损耗的像素点,再对该像素点进行正方形搜索以找到更高精度的mv。源...

  • (九)帧间编码2:运动搜索算法简介

    目前x264主要有5种搜索算法,以下为翻译x264官网的me参数说明:运动搜索算法:默认:'hex'设置全像素运动...

  • 预测编码关键技术

    1. 帧内预测技术 离散余弦变换DTC. 偏差 2. 帧间预测编码关键技术 1) 基于运动补偿技术ME(Moti...

  • 视频编码技术基础

    目录 简介 帧内预测 帧间预测 变换编码 熵编码 参考 1.简介 传统数字视频编码采用的基本都是基于块的混合编码框...

  • 视频编码技术概况(解码篇)

    回顾 上篇文章介绍了视频编码技术,我们知道无论视频编码技术分为:预测,量化,变换和编码其中预测分为帧间预测以及帧内...

  • AE学习笔记07-关键帧

    菜单栏视图选项中,可以打开运动路径显示,点越密代表运动速度越慢,点越稀疏代表运动速度越快。 线性关键帧显示为菱形,...

  • 视频的一些名词概念

    帧类型介绍 I帧:帧内编码帧 尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像 P帧:前向预测编码帧 通过...

  • I帧,P帧,B帧

    ** 根据视频预测编码方式的不同,可以将图像分为I帧,P帧,B帧。 ** I帧 帧内编码,intra frame,...

  • H.264编解码小结

    编码的流程:采集--> 获取到视频帧--> 对视频帧进行编码 --> 获取到视频帧信息 --> 将编码后的数据以N...

网友评论

      本文标题:(十)帧间编码3:运动估计之菱形搜索

      本文链接:https://www.haomeiwen.com/subject/cxskgftx.html