[x265] [PATCH 2 of 3] MotionReference class with weighted frames

Steve Borho steve at borho.org
Tue Jul 30 19:00:28 CEST 2013


On Tue, Jul 30, 2013 at 6:39 AM, <deepthidevaki at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Deepthi Devaki
> # Date 1375183553 -19800
> # Node ID 25b74f97e87324d065c10a25d2c5ee85b1db4792
> # Parent  9e7928fc81d7bdf95f35f90e09349b016b8e4582
> MotionReference class with weighted frames
>

I'll be pushing these first two patches with a few cleanups


> diff -r 9e7928fc81d7 -r 25b74f97e873 source/common/reference.cpp
> --- a/source/common/reference.cpp       Tue Jul 30 16:54:06 2013 +0530
> +++ b/source/common/reference.cpp       Tue Jul 30 16:55:53 2013 +0530
> @@ -38,7 +38,7 @@
>  #error "Must define atomic operations for this compiler"
>  #endif
>
> -MotionReference::MotionReference(TComPicYuv* pic, ThreadPool *pool)
> +MotionReference::MotionReference(TComPicYuv* pic, ThreadPool *pool,
>  wpScalingParam *w)
>      : JobProvider(pool)
>  {
>      m_reconPic = pic;
> @@ -59,14 +59,39 @@
>      /* Create buffers for Hpel/Qpel Planes */
>      size_t padwidth = width + pic->m_lumaMarginX * 2;
>      size_t padheight = height + pic->m_lumaMarginY * 2;
> -    for (int i = 0; i < 4; i++)
> +
> +    if(w!=NULL)
>      {
> -        for (int j = 0; j < 4; j++)
> +        for (int i = 0; i < 4; i++)
>          {
> -            if (i == 0 && j == 0)
> -                continue;
> -            m_lumaPlane[i][j] = (pixel*)X265_MALLOC(pixel,  padwidth *
> padheight) + m_startPad;
> +            for (int j = 0; j < 4; j++)
> +            {
> +                m_lumaPlane[i][j] = (pixel*)X265_MALLOC(pixel,  padwidth
> * padheight) + m_startPad;
> +            }
>          }
> +
> +        //Initialization of weight parameters
> +        m_weight      = w->inputWeight;
> +        m_offset = w->inputOffset * (1 << (g_bitDepth - 8));
> +        m_shift  = w->log2WeightDenom;
> +        m_round  = (w->log2WeightDenom >= 1) ? (1 << (w->log2WeightDenom
> - 1)) : (0);
> +        m_isWeighted = true;
> +    }
> +    else
> +    {
> +
> +        for (int i = 0; i < 4; i++)
> +        {
> +            for (int j = 0; j < 4; j++)
> +            {
> +                if (i == 0 && j == 0)
> +                    continue;
> +                m_lumaPlane[i][j] = (pixel*)X265_MALLOC(pixel,  padwidth
> * padheight) + m_startPad;
> +            }
> +        }
> +
> +        m_isWeighted = false;
> +        m_weight = 0;
>      }
>  }
>
> @@ -78,7 +103,7 @@
>      {
>          for (int j = 0; j < 4; j++)
>          {
> -            if (i == 0 && j == 0)
> +            if (i == 0 && j == 0 && !m_isWeighted)
>                  continue;
>              if (m_lumaPlane[i][j])
>              {
> @@ -105,7 +130,23 @@
>          /* This one function call generates the four intermediate (short)
> planes for each
>           * QPEL offset in the horizontal direction.  At the same time it
> outputs the three
>           * Y=0 output (padded pixel) planes since they require no
> vertical interpolation */
> -        primitives.filterHmulti(srcPtr, m_lumaStride,
>        // source buffer
> +        if(m_isWeighted)
> +        {
> +           primitives.filterHwghtd(srcPtr, m_lumaStride,               //
> source buffer
> +                                   intPtrF, intPtrA, intPtrB, intPtrC,
> m_intStride, // 4 intermediate HPEL buffers
> +                                   m_lumaPlane[0][0] + bufOffset,
> +                                   m_lumaPlane[1][0] + bufOffset,
> +                                   m_lumaPlane[2][0] + bufOffset,
> +                                   m_lumaPlane[3][0] + bufOffset,
> m_lumaStride,     // 3 (x=n, y=0) output buffers (no V interp)
> +                                   m_filterWidth + (2 * s_intMarginX),
>            // filter dimensions with margins
> +                                   m_filterHeight + (2 * s_intMarginY),
> +                                   m_reconPic->m_lumaMarginX -
> s_tmpMarginX - s_intMarginX, // pixel extension margins
> +                                   m_reconPic->m_lumaMarginY -
> s_tmpMarginY - s_intMarginY,
> +                                   m_weight, m_round, m_shift, m_offset);
> +       }
> +       else
> +       {
> +                                primitives.filterHmulti(srcPtr,
> m_lumaStride,                            // source buffer
>                                  intPtrF, intPtrA, intPtrB, intPtrC,
> m_intStride, // 4 intermediate HPEL buffers
>                                  m_lumaPlane[1][0] + bufOffset,
>                                  m_lumaPlane[2][0] + bufOffset,
> @@ -114,6 +155,7 @@
>                                  m_filterHeight + (2 * s_intMarginY),
>                                  m_reconPic->m_lumaMarginX - s_tmpMarginX
> - s_intMarginX, // pixel extension margins
>                                  m_reconPic->m_lumaMarginY - s_tmpMarginY
> - s_intMarginY);
> +        }
>      }
>
>      if (!m_pool)
> @@ -173,5 +215,12 @@
>      pixel *dstPtr2 = m_lumaPlane[x][2] - s_tmpMarginY * m_lumaStride -
> s_tmpMarginX;
>      pixel *dstPtr3 = m_lumaPlane[x][3] - s_tmpMarginY * m_lumaStride -
> s_tmpMarginX;
>
> -    primitives.filterVmulti(intPtr, m_intStride, dstPtr1, dstPtr2,
> dstPtr3, m_lumaStride, m_filterWidth, m_filterHeight,
> m_reconPic->m_lumaMarginX - s_tmpMarginX, m_reconPic->m_lumaMarginY -
> s_tmpMarginY);
> +    if(m_isWeighted)
> +    {
> +        primitives.filterVwghtd(intPtr, m_intStride, dstPtr1, dstPtr2,
> dstPtr3, m_lumaStride, m_filterWidth, m_filterHeight,
> m_reconPic->m_lumaMarginX - s_tmpMarginX, m_reconPic->m_lumaMarginY -
> s_tmpMarginY, m_weight, m_round, m_shift, m_offset);
> +    }
> +    else
> +    {
> +        primitives.filterVmulti(intPtr, m_intStride, dstPtr1, dstPtr2,
> dstPtr3, m_lumaStride, m_filterWidth, m_filterHeight,
> m_reconPic->m_lumaMarginX - s_tmpMarginX, m_reconPic->m_lumaMarginY -
> s_tmpMarginY);
> +    }
>  }
> diff -r 9e7928fc81d7 -r 25b74f97e873 source/common/reference.h
> --- a/source/common/reference.h Tue Jul 30 16:54:06 2013 +0530
> +++ b/source/common/reference.h Tue Jul 30 16:55:53 2013 +0530
> @@ -27,6 +27,7 @@
>  #include "primitives.h"
>  #include "threading.h"
>  #include "threadpool.h"
> +#include "TLibCommon/TComSlice.h"
>
>  class TComPicYuv;
>
> @@ -37,7 +38,7 @@
>  {
>  public:
>
> -    MotionReference(TComPicYuv*, ThreadPool *);
> +    MotionReference(TComPicYuv*, ThreadPool *, wpScalingParam* w = NULL );
>
>      ~MotionReference();
>
> @@ -49,6 +50,8 @@
>      int m_lumaStride;
>
>      MotionReference *m_next;
> +    int m_weight;
> +    bool m_isWeighted;
>
>  protected:
>
> @@ -75,6 +78,10 @@
>      int         m_filterHeight;
>      short      *m_intermediateValues;
>
> +    int m_offset;
> +    int m_shift;
> +    int m_round;
> +
>      MotionReference& operator =(const MotionReference&);
>  };
>  }
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> http://mailman.videolan.org/listinfo/x265-devel
>
>


-- 
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/private/x265-devel/attachments/20130730/c1fc2b90/attachment-0001.html>


More information about the x265-devel mailing list