[x265] [PATCH RFC] Weighted filter integrated to encoder for testing

deepthidevaki at multicorewareinc.com deepthidevaki at multicorewareinc.com
Wed Jul 24 13:23:28 CEST 2013


# HG changeset patch
# User Deepthi Devaki
# Date 1374664960 -19800
# Node ID d471a3d25d3ec642df5273b75e35922cb30071b8
# Parent  fa3b07fcf2128db6e4f54f113225e08c37164c2a
Weighted filter integrated to encoder for testing.

diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibCommon/TComPicYuv.cpp
--- a/source/Lib/TLibCommon/TComPicYuv.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibCommon/TComPicYuv.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -251,6 +251,24 @@
     m_bIsBorderExtended = true;
 }
 
+Void TComPicYuv::extendPicBorder(x265::ThreadPool *pool, wpScalingParam *w)
+{
+    if (m_bIsBorderExtended)
+        return;
+
+    /* HPEL generation requires luma integer plane to already be extended */
+    xExtendPicCompBorder(getLumaAddr(), getStride(), getWidth(), getHeight(), m_lumaMarginX, m_lumaMarginY);
+
+    xExtendPicCompBorder(getCbAddr(), getCStride(), getWidth() >> 1, getHeight() >> 1, m_chromaMarginX, m_chromaMarginY);
+    xExtendPicCompBorder(getCrAddr(), getCStride(), getWidth() >> 1, getHeight() >> 1, m_chromaMarginX, m_chromaMarginY);
+
+    if (m_refList == NULL)
+        m_refList = new x265::MotionReference(this, pool, w);
+    m_refList->generateReferencePlanes();
+
+    m_bIsBorderExtended = true;
+}
+
 Void TComPicYuv::xExtendPicCompBorder(Pel* recon, Int stride, Int width, Int height, Int iMarginX, Int iMarginY)
 {
     Int   x, y;
diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibCommon/TComPicYuv.h
--- a/source/Lib/TLibCommon/TComPicYuv.h	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibCommon/TComPicYuv.h	Wed Jul 24 16:52:40 2013 +0530
@@ -43,6 +43,7 @@
 
 #include "x265.h"
 #include "reference.h"
+#include "TComSlice.h"
 
 class TShortYUV;
 
@@ -184,6 +185,7 @@
 
     //  Extend function of picture buffer
     Void  extendPicBorder(x265::ThreadPool *pool);
+    Void  extendPicBorder(x265::ThreadPool *pool, wpScalingParam *w);
 
     //  Dump picture
     Void  dump(Char* pFileName, Bool bAdd = false);
diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibCommon/TComRdCost.cpp
--- a/source/Lib/TLibCommon/TComRdCost.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibCommon/TComRdCost.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -201,10 +201,10 @@
 
 UInt TComRdCost::xGetSAD(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org   = distParam->fenc;
     Pel* cur   = distParam->fref;
@@ -230,10 +230,10 @@
 
 UInt TComRdCost::xGetSAD4(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org   = distParam->fenc;
     Pel* cur   = distParam->fref;
@@ -261,10 +261,10 @@
 
 UInt TComRdCost::xGetSAD8(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -296,10 +296,10 @@
 
 UInt TComRdCost::xGetSAD16(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -339,10 +339,10 @@
 
 UInt TComRdCost::xGetSAD12(DistParam* distparam)
 {
-    if (distparam->applyWeight)
-    {
-        return xGetSADw(distparam);
-    }
+    //if (distparam->applyWeight)
+    //{
+    //    return xGetSADw(distparam);
+    //}
 
     Pel* org = distparam->fenc;
     Pel* cur = distparam->fref;
@@ -421,10 +421,10 @@
 
 UInt TComRdCost::xGetSAD32(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -480,10 +480,10 @@
 
 UInt TComRdCost::xGetSAD24(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -531,10 +531,10 @@
 
 UInt TComRdCost::xGetSAD64(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -623,10 +623,10 @@
 
 UInt TComRdCost::xGetSAD48(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSADw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSADw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -724,10 +724,10 @@
 
 UInt TComRdCost::xGetSSE(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSSEw(distParam);
+    //}
 
     Int  rows = distParam->rows;
     Int  cols = distParam->cols;
@@ -788,11 +788,11 @@
 
 UInt TComRdCost::xGetSSE4(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        assert(distParam->cols == 4);
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    assert(distParam->cols == 4);
+    //    return xGetSSEw(distParam);
+    //}
 
     Int  rows = distParam->rows;
     Int  strideOrg = distParam->fencstride;
@@ -860,11 +860,11 @@
 
 UInt TComRdCost::xGetSSE8(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        assert(distParam->cols == 8);
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    assert(distParam->cols == 8);
+    //    return xGetSSEw(distParam);
+    //}
 
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
@@ -948,11 +948,11 @@
 
 UInt TComRdCost::xGetSSE16(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        assert(distParam->cols == 16);
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    assert(distParam->cols == 16);
+    //    return xGetSSEw(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1039,10 +1039,10 @@
 
 UInt TComRdCost::xGetSSE16N(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetSSEw(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1159,11 +1159,11 @@
 
 UInt TComRdCost::xGetSSE32(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        assert(distParam->cols == 32);
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    assert(distParam->cols == 32);
+    //    return xGetSSEw(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1344,11 +1344,11 @@
 
 UInt TComRdCost::xGetSSE64(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        assert(distParam->cols == 64);
-        return xGetSSEw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    assert(distParam->cols == 64);
+    //    return xGetSSEw(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1581,10 +1581,10 @@
 
 UInt TComRdCost::xGetHADs4(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetHADs4w(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetHADs4w(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1607,10 +1607,10 @@
 
 UInt TComRdCost::xGetHADs8(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetHADs8w(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetHADs8w(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
@@ -1643,10 +1643,10 @@
 
 UInt TComRdCost::xGetHADs(DistParam* distParam)
 {
-    if (distParam->applyWeight)
-    {
-        return xGetHADsw(distParam);
-    }
+    //if (distParam->applyWeight)
+    //{
+    //    return xGetHADsw(distParam);
+    //}
     Pel* org = distParam->fenc;
     Pel* cur = distParam->fref;
     Int  rows = distParam->rows;
diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibCommon/TComSlice.h
--- a/source/Lib/TLibCommon/TComSlice.h	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibCommon/TComSlice.h	Wed Jul 24 16:52:40 2013 +0530
@@ -1413,7 +1413,6 @@
     UInt        m_sliceSegmentBits;
     Bool        m_bFinalized;
 
-    wpScalingParam  m_weightPredTable[2][MAX_NUM_REF][3]; // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V]
     wpACDCParam     m_weightACDCParam[3];                 // [0:Y, 1:U, 2:V]
 
     std::vector<UInt> m_tileByteLocation;
@@ -1431,6 +1430,8 @@
 
 public:
 
+    wpScalingParam  m_weightPredTable[2][MAX_NUM_REF][3]; // [REF_PIC_LIST_0 or REF_PIC_LIST_1][refIdx][0:Y, 1:U, 2:V]
+
     TComSlice();
     virtual ~TComSlice();
     Void      initSlice();
diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -3331,7 +3331,8 @@
 
     setWpScalingDistParam(cu, refIdxPred, picList);
 
-    Pel* fref = cu->getSlice()->getRefPic(picList, refIdxPred)->getPicYuvRec()->getLumaAddr(cu->getAddr(), cu->getZorderIdxInCU() + partAddr);
+    Pel* fref = cu->getSlice()->getRefPic(picList, refIdxPred)->getPicYuvRec()->getLumaFilterBlock(0,0,cu->getAddr(), cu->getZorderIdxInCU() + partAddr);
+
     Int  stride  = cu->getSlice()->getRefPic(picList, refIdxPred)->getPicYuvRec()->getStride();
 
     // Configure the MV bit cost calculator
diff -r fa3b07fcf212 -r d471a3d25d3e source/Lib/TLibEncoder/TEncSlice.cpp
--- a/source/Lib/TLibEncoder/TEncSlice.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/Lib/TLibEncoder/TEncSlice.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -421,17 +421,35 @@
         xCheckWPEnable(slice);
     }
 
+    wpexplicit = (slice->getSliceType() == P_SLICE && slice->getPPS()->getUseWP());
+
     Int numPredDir = slice->isInterP() ? 1 : 2;
 
-    for (Int refList = 0; refList < numPredDir; refList++)
-    {
-        RefPicList  picList = (refList ? REF_PIC_LIST_1 : REF_PIC_LIST_0);
-        for (Int refIdxTemp = 0; refIdxTemp < slice->getNumRefIdx(picList); refIdxTemp++)
-        {
-            // To do: Call the merged IP + weighted frames if weighted prediction enabled
-            slice->getRefPic(picList, refIdxTemp)->getPicYuvRec()->extendPicBorder(x265::ThreadPool::getThreadPool()); 
+    if(wpexplicit)
+     {
+        for (Int refList = 0; refList < numPredDir; refList++)
+         {
+            RefPicList  picList = (refList ? REF_PIC_LIST_1 : REF_PIC_LIST_0);
+            for (Int refIdxTemp = 0; refIdxTemp < slice->getNumRefIdx(picList); refIdxTemp++)
+            {
+                //Call the merged IP + weighted frames if weighted prediction enabled
+                wpScalingParam *w = &(slice->m_weightPredTable[picList][refIdxTemp][0]);
+                slice->getRefPic(picList, refIdxTemp)->getPicYuvRec()->extendPicBorder(x265::ThreadPool::getThreadPool(), w); 
+            }
         }
     }
+    else
+    {
+        for (Int refList = 0; refList < numPredDir; refList++)
+        {
+            RefPicList  picList = (refList ? REF_PIC_LIST_1 : REF_PIC_LIST_0);
+            for (Int refIdxTemp = 0; refIdxTemp < slice->getNumRefIdx(picList); refIdxTemp++)
+            {                
+                slice->getRefPic(picList, refIdxTemp)->getPicYuvRec()->extendPicBorder(x265::ThreadPool::getThreadPool());                 
+            }
+         }
+     }
+
 
     frameEncoder->encode(pic, slice);
 
diff -r fa3b07fcf212 -r d471a3d25d3e source/common/ipfilter.cpp
--- a/source/common/ipfilter.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/common/ipfilter.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -468,6 +468,7 @@
     filterVertical_s_p<8>(src, srcStride, dstI, dstStride, block_width, block_height, g_lumaFilter[2]);
     filterVertical_s_p<8>(src, srcStride, dstE, dstStride, block_width, block_height, g_lumaFilter[1]);
     filterVertical_s_p<8>(src, srcStride, dstP, dstStride, block_width, block_height, g_lumaFilter[3]);
+
     extendPicCompBorder(dstE, dstStride, block_width, block_height, marginX, marginY);
     extendPicCompBorder(dstI, dstStride, block_width, block_height, marginX, marginY);
     extendPicCompBorder(dstP, dstStride, block_width, block_height, marginX, marginY);
@@ -509,7 +510,7 @@
 
 // filterHorizontal, Multiplane, Weighted
 void filterHorizontalWeighted(pixel *src, int srcStride, short *midF, short* midA, short* midB, short* midC, int midStride,
-                              pixel *dstA, pixel *dstB, pixel *dstC, int dstStride, int block_width, int block_height,
+                              pixel *dstF, pixel *dstA, pixel *dstB, pixel *dstC, int dstStride, int block_width, int block_height,
                               int marginX, int marginY, int w, int roundw, int shiftw, int offsetw)
 {
     filterConvertPelToShort(src, srcStride, midF, midStride, block_width, block_height);
@@ -517,10 +518,12 @@
     filterHorizontal_p_s<8>(src, srcStride, midA, midStride, block_width, block_height, g_lumaFilter[1]);
     filterHorizontal_p_s<8>(src, srcStride, midC, midStride, block_width, block_height, g_lumaFilter[3]);
 
+    weightUnidir(midF, dstF, midStride, dstStride, block_width, block_height, w, roundw, shiftw, offsetw);
     weightUnidir(midA, dstA, midStride, dstStride, block_width, block_height, w, roundw, shiftw, offsetw);
     weightUnidir(midB, dstB, midStride, dstStride, block_width, block_height, w, roundw, shiftw, offsetw);
     weightUnidir(midC, dstC, midStride, dstStride, block_width, block_height, w, roundw, shiftw, offsetw);
 
+    extendPicCompBorder(dstF, dstStride, block_width, block_height, marginX, marginY);
     extendPicCompBorder(dstA, dstStride, block_width, block_height, marginX, marginY);
     extendPicCompBorder(dstB, dstStride, block_width, block_height, marginX, marginY);
     extendPicCompBorder(dstC, dstStride, block_width, block_height, marginX, marginY);
@@ -590,4 +593,5 @@
     p.filterVwghtd = filterVerticalWeighted;         
     p.filterHwghtd = filterHorizontalWeighted;
 }
+
 }
diff -r fa3b07fcf212 -r d471a3d25d3e source/common/primitives.h
--- a/source/common/primitives.h	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/common/primitives.h	Wed Jul 24 16:52:40 2013 +0530
@@ -223,7 +223,7 @@
 typedef void (*filterHmulti_t)(pixel *src, int srcStride, short *midF, short* midA, short* midB, short* midC, int midStride,
                                pixel *dstA, pixel *dstB, pixel *dstC, int dstStride, int block_width, int block_height, int marginX, int marginY);
 typedef void (*filterHwghtd_t)(pixel *src, int srcStride, short *midF, short* midA, short* midB, short* midC, int midStride,
-                               pixel *pDstA, pixel *pDstB, pixel *pDstC, int pDstStride, int block_width, int block_height,
+                               pixel *dstF, pixel *pDstA, pixel *pDstB, pixel *pDstC, int pDstStride, int block_width, int block_height,
                                int marginX, int marginY, int w, int roundw, int shiftw, int offsetw);
 typedef void (*weightpUni_t)(short *src, pixel *dst, int srcStride, int dstStride, int width, int height, int w0, int round, int shift, int offset);
 typedef void (*scale_t)(pixel *dst, pixel *src, intptr_t stride);
diff -r fa3b07fcf212 -r d471a3d25d3e source/common/reference.cpp
--- a/source/common/reference.cpp	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/common/reference.cpp	Wed Jul 24 16:52:40 2013 +0530
@@ -68,6 +68,47 @@
             m_lumaPlane[i][j] = (pixel*)xMalloc(pixel,  padwidth * padheight) + m_startPad;
         }
     }
+
+    m_isWeighted = false;
+}
+
+MotionReference::MotionReference(TComPicYuv* pic, ThreadPool *pool, wpScalingParam *w)
+    : JobProvider(pool)
+{
+    m_reconPic = pic;
+    int width = pic->getWidth();
+    int height = pic->getHeight();
+    m_lumaStride = pic->getStride();
+    m_startPad = pic->m_lumaMarginY * m_lumaStride + pic->m_lumaMarginX;
+    m_intStride = width + s_tmpMarginX * 4;
+    m_extendOffset = s_tmpMarginY * m_lumaStride + s_tmpMarginX;
+    m_offsetToLuma = s_tmpMarginY * 2 * m_intStride  + s_tmpMarginX * 2;
+    m_filterWidth = width + s_tmpMarginX * 2;
+    m_filterHeight = height + s_tmpMarginY * 2;
+    m_next = NULL;
+
+    /* directly reference the pre-extended integer pel plane */
+    //m_lumaPlane[0][0] = pic->m_picBufY + m_startPad;
+
+    /* 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++)
+    {
+        for (int j = 0; j < 4; j++)
+        {
+            //if (i == 0 && j == 0)
+            //    continue;
+            m_lumaPlane[i][j] = (pixel*)xMalloc(pixel,  padwidth * padheight) + m_startPad;
+        }
+    }
+
+    //Innitialization 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;
 }
 
 MotionReference::~MotionReference()
@@ -105,7 +146,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 +171,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 +231,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 fa3b07fcf212 -r d471a3d25d3e source/common/reference.h
--- a/source/common/reference.h	Wed Jul 24 12:07:19 2013 +0530
+++ b/source/common/reference.h	Wed Jul 24 16:52:40 2013 +0530
@@ -27,6 +27,7 @@
 #include "primitives.h"
 #include "threading.h"
 #include "threadpool.h"
+#include "TLibCommon/TComSlice.h"
 
 class TComPicYuv;
 
@@ -38,6 +39,7 @@
 public:
 
     MotionReference(TComPicYuv*, ThreadPool *);
+    MotionReference(TComPicYuv*, ThreadPool *, wpScalingParam *w);
 
     ~MotionReference();
 
@@ -75,6 +77,12 @@
     int         m_filterHeight;
     short      *m_intermediateValues;
 
+    int m_weight;
+    int m_offset;
+    int m_shift;
+    int m_round;
+    bool m_isWeighted;
+
     MotionReference& operator =(const MotionReference&);
 };
 }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.patch
Type: text/x-patch
Size: 22031 bytes
Desc: not available
URL: <http://mailman.videolan.org/private/x265-devel/attachments/20130724/98e7eec9/attachment-0001.bin>


More information about the x265-devel mailing list