[x265] [PATCH] Added support for bipred, but 8bpp, 16bpp mismatch

Steve Borho steve at borho.org
Mon Jun 24 20:09:34 CEST 2013


On Mon, Jun 24, 2013 at 7:37 AM, <deepthidevaki at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Deepthi Devaki
> # Date 1372077358 -19800
> # Node ID a864e518afece8fe5d8f5abbe349dec84114c98d
> # Parent  7f9730659262eed1746df4ce17217d6e5c455f92
> Added support for bipred, but 8bpp, 16bpp mismatch
>

This patch didn't apply cleanly to the tip because it was based on your
earlier patch and did not include the fixes I made to it (HIGHBITDEPTH
should be HIGH_BIT_DEPTH).  An important part of the patch based workflow
is to always base our patches on the current development tip so they apply
cleanly.

I was able to edit this patch to get it to apply cleanly, so it's been
pushed.  Thanks for fixing bidir prediction!


>
> diff -r 7f9730659262 -r a864e518afec
> source/Lib/TLibCommon/TComPrediction.cpp
> --- a/source/Lib/TLibCommon/TComPrediction.cpp  Mon Jun 24 11:38:53 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.cpp  Mon Jun 24 18:05:58 2013
> +0530
> @@ -77,6 +77,8 @@
>
>      m_acYuvPred[0].destroy();
>      m_acYuvPred[1].destroy();
> +    m_acShortPred[0].destroy();
> +    m_acShortPred[1].destroy();
>
>      m_cYuvPredTemp.destroy();
>
> @@ -126,6 +128,8 @@
>          // new structure
>          m_acYuvPred[0].create(MAX_CU_SIZE, MAX_CU_SIZE);
>          m_acYuvPred[1].create(MAX_CU_SIZE, MAX_CU_SIZE);
> +        m_acShortPred[0].create(MAX_CU_SIZE, MAX_CU_SIZE);
> +        m_acShortPred[1].create(MAX_CU_SIZE, MAX_CU_SIZE);
>
>          m_cYuvPredTemp.create(MAX_CU_SIZE, MAX_CU_SIZE);
>      }
> @@ -412,7 +416,7 @@
>      Int         iWidth;
>      Int         iHeight;
>      UInt        uiPartAddr;
> -
> +
>      if (iPartIdx >= 0)
>      {
>          pcCU->getPartIndexAndSize(iPartIdx, uiPartAddr, iWidth, iHeight);
> @@ -420,16 +424,14 @@
>          {
>              if (pcCU->getSlice()->getPPS()->getUseWP())
>              {
> -                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcYuvPred, true);
> +                TShortYUV* pcMbYuv = &m_acShortPred[0];
> +                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcMbYuv, true);
> +                xWeightedPredictionUni(pcCU, pcMbYuv, uiPartAddr, iWidth,
> iHeight, eRefPicList, pcYuvPred);
>              }
>              else
>              {
>                  xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcYuvPred);
>              }
> -            if (pcCU->getSlice()->getPPS()->getUseWP())
> -            {
> -                xWeightedPredictionUni(pcCU, pcYuvPred, uiPartAddr,
> iWidth, iHeight, eRefPicList, pcYuvPred);
> -            }
>          }
>          else
>          {
> @@ -453,16 +455,14 @@
>          {
>              if (pcCU->getSlice()->getPPS()->getUseWP())
>              {
> -                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcYuvPred, true);
> +                TShortYUV* pcMbYuv = &m_acShortPred[0];
> +                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcMbYuv, true);
> +                xWeightedPredictionUni(pcCU, pcMbYuv, uiPartAddr, iWidth,
> iHeight, eRefPicList, pcYuvPred);
>              }
>              else
>              {
>                  xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcYuvPred);
>              }
> -            if (pcCU->getSlice()->getPPS()->getUseWP())
> -            {
> -                xWeightedPredictionUni(pcCU, pcYuvPred, uiPartAddr,
> iWidth, iHeight, eRefPicList, pcYuvPred);
> -            }
>          }
>          else
>          {
> @@ -478,6 +478,7 @@
>      }
>  }
>
> +
>  Void TComPrediction::xPredInterUni(TComDataCU* pcCU, UInt uiPartAddr, Int
> iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi)
>  {
>      assert (bi == false);
> @@ -507,11 +508,11 @@
>
>  Void TComPrediction::xPredInterBi(TComDataCU* pcCU, UInt uiPartAddr, Int
> iWidth, Int iHeight, TComYuv*& rpcYuvPred)
>  {
> -    TComYuv* pcMbYuv;
>      Int      iRefIdx[2] = { -1, -1 };
>
>      if (pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiPartAddr) >= 0 &&
> pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiPartAddr) >= 0)
>      {
> +        TShortYUV* pcMbYuv;
>          for (Int iRefList = 0; iRefList < 2; iRefList++)
>          {
>              RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> @@ -519,22 +520,61 @@
>
>              assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
>
> -            pcMbYuv = &m_acYuvPred[iRefList];
> -            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);   //pcMbYuv should be TShortYuv
> +            pcMbYuv = &m_acShortPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);
>          }
>          if (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE)
>          {
> -            //m_acYuvPred must be TShortYuv
> -            xWeightedPredictionBi(pcCU, &m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
> +            xWeightedPredictionBi(pcCU, &m_acShortPred[0],
> &m_acShortPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight,
> rpcYuvPred);
>          }
>          else
>          {
> -            //m_acYuvPred must be TShortYuv
> -            xWeightedAverage(&m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
> +            rpcYuvPred->addAvg(&m_acShortPred[0], &m_acShortPred[1],
> uiPartAddr, iWidth, iHeight);
>          }
>      }
>      else if (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE)
>      {
> +        TShortYUV* pcMbYuv;
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +
> +            if (iRefIdx[iRefList] < 0)
> +            {
> +                continue;
> +            }
> +
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acShortPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);
> +        }
> +        xWeightedPredictionBi(pcCU, &m_acShortPred[0], &m_acShortPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
> +    }
> +    else if (pcCU->getSlice()->getPPS()->getUseWP() &&
> pcCU->getSlice()->getSliceType() == P_SLICE)
> +    {
> +        TShortYUV* pcMbYuv;
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +
> +            if (iRefIdx[iRefList] < 0)
> +            {
> +                continue;
> +            }
> +
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acShortPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);
> +        }
> +        xWeightedPredictionUni(pcCU, &m_acShortPred[0], uiPartAddr,
> iWidth, iHeight, REF_PIC_LIST_0, rpcYuvPred);
> +    }
> +    else
> +    {
> +        TComYuv* pcMbYuv;
>          for (Int iRefList = 0; iRefList < 2; iRefList++)
>          {
>              RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> @@ -548,49 +588,8 @@
>              assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
>
>              pcMbYuv = &m_acYuvPred[iRefList];
> -            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true); //pcMbYuv must be TShort
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv);
>          }
> -        //m_acYuvPred must be TShort
> -        xWeightedPredictionBi(pcCU, &m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
> -    }
> -    else if (pcCU->getSlice()->getPPS()->getUseWP() &&
> pcCU->getSlice()->getSliceType() == P_SLICE)
> -    {
> -        for (Int iRefList = 0; iRefList < 2; iRefList++)
> -        {
> -            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> -            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> -
> -            if (iRefIdx[iRefList] < 0)
> -            {
> -                continue;
> -            }
> -
> -            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> -
> -            pcMbYuv = &m_acYuvPred[iRefList];
> -            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true); //pcMbYuv must be TShortYuv
> -        }
> -        //m_acYuvPred must be TShortYuv
> -        xWeightedPredictionUni(pcCU, &m_acYuvPred[0], uiPartAddr, iWidth,
> iHeight, REF_PIC_LIST_0, rpcYuvPred);
> -    }
> -    else
> -    {
> -        for (Int iRefList = 0; iRefList < 2; iRefList++)
> -        {
> -            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> -            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> -
> -            if (iRefIdx[iRefList] < 0)
> -            {
> -                continue;
> -            }
> -
> -            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> -
> -            pcMbYuv = &m_acYuvPred[iRefList];
> -            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv); //pcMbYuv must be TComYuv
> -        }
> -        //m_acYuvPred must be TComYuv
>          xWeightedAverage(&m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0],
> iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
>      }
>  }
> @@ -609,77 +608,22 @@
>   */
>  Void TComPrediction::xPredInterLumaBlk(TComDataCU *cu, TComPicYuv
> *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv
> *&dstPic, Bool bi)
>  {
> -#if HIGHBITDEPTH
> -    if(bi == false)
> -#endif
> -    {
> -        assert(bi == false);
> +    assert(bi == false);
>
> -        Int refStride = refPic->getStride();
> -        Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) *
> refStride;
> -        Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
> +    Int refStride = refPic->getStride();
> +    Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) * refStride;
> +    Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
>
> -        Int dstStride = dstPic->getStride();
> -        Pel *dst      = dstPic->getLumaAddr(partAddr);
> +    Int dstStride = dstPic->getStride();
> +    Pel *dst      = dstPic->getLumaAddr(partAddr);
>
> -        Int xFrac = mv->getHor() & 0x3;
> -        Int yFrac = mv->getVer() & 0x3;
> +    Int xFrac = mv->getHor() & 0x3;
> +    Int yFrac = mv->getVer() & 0x3;
>
> -        Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac,
> cu->getAddr(), cu->getZorderIdxInCU() + partAddr) + refOffset;
> -        Int srcStride = refPic->getStride();
> +    Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac, cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
> +    Int srcStride = refPic->getStride();
>
> -        x265::primitives.cpyblock(width, height, (pixel*)dst, dstStride,
> (pixel*)src, srcStride);
> -    }
> -#if HIGHBITDEPTH
> -    else /* For biprediction. will work correctly only when HIGHBITDEPTH
> enabled. Will be removed once bipred is fixed.  */
> -    {
> -        assert(bi == true);
> -
> -        Int refStride = refPic->getStride();
> -        Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) *
> refStride;
> -        Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
> -
> -        Int dstStride = dstPic->getStride();
> -        Short *dst      = (Short*)dstPic->getLumaAddr(partAddr);
> -
> -        Int xFrac = mv->getHor() & 0x3;
> -        Int yFrac = mv->getVer() & 0x3;
> -
> -        Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac,
> cu->getAddr(), cu->getZorderIdxInCU() + partAddr) + refOffset;
> -        Int srcStride = refPic->getStride();
> -
> -        if (yFrac == 0)
> -        {
> -            if(xFrac==0)
> -            {
> -                //filterconvertpeltoshort
> -                x265::primitives.ipfilterConvert_p_s(g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height);
> -            }
> -            else
> -            {
> -                //filterhorizontalpelshort
> -
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY, (pixel*)ref ,
> refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> -            }
> -        }
> -        else if (xFrac == 0)
> -        {
> -            //filterverticalpelshort
> -            x265::primitives.ipFilter_p_s[FILTER_V_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[yFrac]);
> -        }
> -        else
> -        {
> -            Int tmpStride = width;
> -            Int filterSize = NTAPS_LUMA;
> -            Int halfFilterSize = (filterSize >> 1);
> -            Short *tmp    = (Short*)malloc(width * (height + filterSize -
> 1) * sizeof(Short));
> -
> -            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(ref - (halfFilterSize - 1) * refStride) , refStride, tmp,
> tmpStride, width, height + filterSize - 1,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> -            x265::primitives.ipFilter_s_s[FILTER_V_S_S_8](g_bitDepthY,
> tmp + (halfFilterSize - 1) * tmpStride ,tmpStride, dst, dstStride, width,
> height, TComInterpolationFilter::m_lumaFilter[yFrac]);
> -
> -            free(tmp);
> -        }
> -    }
> -#endif
> +    x265::primitives.cpyblock(width, height, (pixel*)dst, dstStride,
> (pixel*)src, srcStride);
>  }
>
>  //Motion compensated block for biprediction
> @@ -704,18 +648,15 @@
>      {
>          if(xFrac==0)
>          {
> -                //filterconvertpeltoshort
>              x265::primitives.ipfilterConvert_p_s(g_bitDepthY, (pixel*)ref
> , refStride, dst, dstStride, width, height);
>          }
>          else
>          {
> -            //filterhorizontalpelshort
>              x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
>          }
>      }
>      else if (xFrac == 0)
>      {
> -        //filterverticalpelshort
>          x265::primitives.ipFilter_p_s[FILTER_V_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[yFrac]);
>      }
>      else
> @@ -767,89 +708,38 @@
>      Int filterSize = NTAPS_CHROMA;
>
>      Int halfFilterSize = (filterSize >> 1);
> -#if HIGHBITDEPTH
> -    if(bi == false)
> -#endif
> +
> +    if (yFrac == 0)
>      {
> -        if (yFrac == 0)
> +        if (xFrac == 0)
>          {
> -            if (xFrac == 0)
> -            {
> -                x265::primitives.cpyblock(cxWidth, cxHeight,
> (pixel*)dstCb, dstStride, (pixel*)refCb, refStride);
> -                x265::primitives.cpyblock(cxWidth, cxHeight,
> (pixel*)dstCr, dstStride, (pixel*)refCr, refStride);
> -            }
> -            else
> -            {
> -                primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> -                primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> -            }
> -        }
> -        else if (xFrac == 0)
> -        {
> -            primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> -            primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> +            x265::primitives.cpyblock(cxWidth, cxHeight, (pixel*)dstCb,
> dstStride, (pixel*)refCb, refStride);
> +            x265::primitives.cpyblock(cxWidth, cxHeight, (pixel*)dstCr,
> dstStride, (pixel*)refCr, refStride);
>          }
>          else
>          {
> -            Int     extStride = cxWidth;
> -            Short*  extY      = (Short*)xMalloc(Short, cxWidth *
> (cxHeight + filterSize - 1));
> -
> -            primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1, m_if.m_chromaFilter[xFrac]);
> -            primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCb, dstStride,
> cxWidth, cxHeight, m_if.m_chromaFilter[yFrac]);
> -
> -            primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1,  m_if.m_chromaFilter[xFrac]);
> -            primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCr, dstStride,
> cxWidth, cxHeight,  m_if.m_chromaFilter[yFrac]);
> -
> -            xFree(extY);
> +            primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> +            primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
>          }
>      }
> -#if HIGHBITDEPTH
> -    else  /* For biprediction. will work correctly only when HIGHBITDEPTH
> enabled. Will be removed once bipred is fixed.  */
> -    {
> -        Short* dstCb = (Short*)dstPic->getCbAddr(partAddr);
> -        Short* dstCr = (Short*)dstPic->getCrAddr(partAddr);
> -        if (yFrac == 0)
> -        {
> -            //m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> -            //m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> -            if(xFrac==0)
> -            {
> -                    //filterconvertpeltoshort
> -                x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight);
> -                x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight);
> -            }
> -            else
> -            {
> -                //filterhorizontalpelshort
> -
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC, (pixel*)refCb ,
> refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> -
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC, (pixel*)refCr ,
> refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> -            }
> -        }
> -        else if (xFrac == 0)
> -        {
> -            //m_if.filterVerChroma(refCb, refStride, dstCb, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> -            //m_if.filterVerChroma(refCr, refStride, dstCr, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> -            x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCb, refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> -            x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCr, refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> -        }
> -        else
> -        {
> -            Int     extStride = cxWidth;
> -            Short*  extY      = (Short*)malloc(cxWidth * (cxHeight +
> filterSize - 1) * sizeof(Short));
> -            //m_if.filterHorChroma(refCb - (halfFilterSize - 1) *
> refStride, refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1,
> xFrac, false);
> -            //m_if.filterVerChroma(extY  + (halfFilterSize - 1) *
> extStride, extStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, false,
> !bi);
> -            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> -            x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY,
> extY  + (halfFilterSize - 1) * extStride, extStride, dstCb, dstStride,
> cxWidth, cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> -
> -            //m_if.filterHorChroma(refCr - (halfFilterSize - 1) *
> refStride, refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1,
> xFrac, false);
> -            //m_if.filterVerChroma(extY  + (halfFilterSize - 1) *
> extStride, extStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, false,
> !bi);
> -            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> -            x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY,
> extY  + (halfFilterSize - 1) * extStride, extStride, dstCr, dstStride,
> cxWidth, cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> -            free(extY);
> -        }
> -
> +    else if (xFrac == 0)
> +    {
> +        primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> +        primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
>      }
> -#endif
> +    else
> +    {
> +        Int     extStride = cxWidth;
> +        Short*  extY      = (Short*)xMalloc(Short, cxWidth * (cxHeight +
> filterSize - 1));
> +
> +        primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1, m_if.m_chromaFilter[xFrac]);
> +        primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCb, dstStride,
> cxWidth, cxHeight, m_if.m_chromaFilter[yFrac]);
> +
> +        primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1,  m_if.m_chromaFilter[xFrac]);
> +        primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCr, dstStride,
> cxWidth, cxHeight,  m_if.m_chromaFilter[yFrac]);
> +
> +        xFree(extY);
> +    }
>  }
>
>  //Generate motion compensated block when biprediction
> @@ -879,25 +769,19 @@
>
>      if (yFrac == 0)
>      {
> -        //m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> -        //m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
>          if(xFrac==0)
>          {
> -            //filterconvertpeltoshort
>              x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight);
>              x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight);
>          }
>          else
>          {
> -            //filterhorizontalpelshort
>              x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
>              x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
>          }
>      }
>      else if (xFrac == 0)
>      {
> -        //m_if.filterVerChroma(refCb, refStride, dstCb, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> -        //m_if.filterVerChroma(refCr, refStride, dstCr, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
>          x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCb, refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
>          x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCr, refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
>      }
> @@ -905,18 +789,12 @@
>      {
>          Int     extStride = cxWidth;
>          Short*  extY      = (Short*)malloc(cxWidth * (cxHeight +
> filterSize - 1) * sizeof(Short));
> -        //m_if.filterHorChroma(refCb - (halfFilterSize - 1) * refStride,
> refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1, xFrac,
> false);
> -        //m_if.filterVerChroma(extY  + (halfFilterSize - 1) * extStride,
> extStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, false, !bi);
> -        x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +        x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthY,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
>          x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY, extY
>  + (halfFilterSize - 1) * extStride, extStride, dstCb, dstStride, cxWidth,
> cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> -
> -        //m_if.filterHorChroma(refCr - (halfFilterSize - 1) * refStride,
> refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1, xFrac,
> false);
> -        //m_if.filterVerChroma(extY  + (halfFilterSize - 1) * extStride,
> extStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, false, !bi);
> -        x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +        x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthY,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
>          x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY, extY
>  + (halfFilterSize - 1) * extStride, extStride, dstCr, dstStride, cxWidth,
> cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
>          free(extY);
>      }
> -
>  }
>
>  Void TComPrediction::xWeightedAverage(TComYuv* pcYuvSrc0, TComYuv*
> pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth, Int
> iHeight, TComYuv*& rpcYuvDst)
> diff -r 7f9730659262 -r a864e518afec source/Lib/TLibCommon/TComPrediction.h
> --- a/source/Lib/TLibCommon/TComPrediction.h    Mon Jun 24 11:38:53 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.h    Mon Jun 24 18:05:58 2013
> +0530
> @@ -68,6 +68,7 @@
>      Pel *refAbove, *refAboveFlt, *refLeft, *refLeftFlt;
>
>      TComYuv   m_acYuvPred[2];
> +    TShortYUV   m_acShortPred[2];
>      TComYuv   m_cYuvPredTemp;
>      /*This holds final interpolated pixel values (0-255). Hence memory is
> stored as Pel.*/
>      TComYuv m_filteredBlock[4][4];
> diff -r 7f9730659262 -r a864e518afec
> source/Lib/TLibCommon/TComWeightPrediction.cpp
> --- a/source/Lib/TLibCommon/TComWeightPrediction.cpp    Mon Jun 24
> 11:38:53 2013 +0530
> +++ b/source/Lib/TLibCommon/TComWeightPrediction.cpp    Mon Jun 24
> 18:05:58 2013 +0530
> @@ -40,26 +40,27 @@
>  #include "TComWeightPrediction.h"
>  #include "TComInterpolationFilter.h"
>
> -static inline Pel weightBidirY(Int w0, Pel P0, Int w1, Pel P1, Int round,
> Int shift, Int offset)
> +static inline Pel weightBidirY(Int w0, Short P0, Int w1, Short P1, Int
> round, Int shift, Int offset)
>  {
>      return ClipY(((w0 * (P0 + IF_INTERNAL_OFFS) + w1 * (P1 +
> IF_INTERNAL_OFFS) + round + (offset << (shift - 1))) >> shift));
>  }
>
> -static inline Pel weightBidirC(Int w0, Pel P0, Int w1, Pel P1, Int round,
> Int shift, Int offset)
> +static inline Pel weightBidirC(Int w0, Short P0, Int w1, Short P1, Int
> round, Int shift, Int offset)
>  {
>      return ClipC(((w0 * (P0 + IF_INTERNAL_OFFS) + w1 * (P1 +
> IF_INTERNAL_OFFS) + round + (offset << (shift - 1))) >> shift));
>  }
>
> -static inline Pel weightUnidirY(Int w0, Pel P0, Int round, Int shift, Int
> offset)
> +static inline Pel weightUnidirY(Int w0, Short P0, Int round, Int shift,
> Int offset)
>  {
>      return ClipY(((w0 * (P0 + IF_INTERNAL_OFFS) + round) >> shift) +
> offset);
>  }
>
> -static inline Pel weightUnidirC(Int w0, Pel P0, Int round, Int shift, Int
> offset)
> +static inline Pel weightUnidirC(Int w0, Short P0, Int round, Int shift,
> Int offset)
>  {
>      return ClipC(((w0 * (P0 + IF_INTERNAL_OFFS) + round) >> shift) +
> offset);
>  }
>
> +
>  //
> ====================================================================================================================
>  // Class definition
>  //
> ====================================================================================================================
> @@ -180,6 +181,121 @@
>      }
>  }
>
> +/** weighted averaging for bi-pred
> + * \param TShortYuv* pcYuvSrc0
> + * \param TShortYuv* pcYuvSrc1
> + * \param iPartUnitIdx
> + * \param iWidth
> + * \param iHeight
> + * \param wpScalingParam *wp0
> + * \param wpScalingParam *wp1
> + * \param TComYuv* rpcYuvDst
> + * \returns Void
> + */
> +Void TComWeightPrediction::addWeightBi(TShortYUV* pcYuvSrc0, TShortYUV*
> pcYuvSrc1, UInt iPartUnitIdx, UInt iWidth, UInt iHeight, wpScalingParam
> *wp0, wpScalingParam *wp1, TComYuv* rpcYuvDst, Bool bRound)
> +{
> +    Int x, y;
> +
> +    Short* pSrcY0  = pcYuvSrc0->getLumaAddr(iPartUnitIdx);
> +    Short* pSrcU0  = pcYuvSrc0->getCbAddr(iPartUnitIdx);
> +    Short* pSrcV0  = pcYuvSrc0->getCrAddr(iPartUnitIdx);
> +
> +    Short* pSrcY1  = pcYuvSrc1->getLumaAddr(iPartUnitIdx);
> +    Short* pSrcU1  = pcYuvSrc1->getCbAddr(iPartUnitIdx);
> +    Short* pSrcV1  = pcYuvSrc1->getCrAddr(iPartUnitIdx);
> +
> +    Pel* pDstY   = rpcYuvDst->getLumaAddr(iPartUnitIdx);
> +    Pel* pDstU   = rpcYuvDst->getCbAddr(iPartUnitIdx);
> +    Pel* pDstV   = rpcYuvDst->getCrAddr(iPartUnitIdx);
> +
> +    // Luma : --------------------------------------------
> +    Int w0      = wp0[0].w;
> +    Int offset  = wp0[0].offset;
> +    Int shiftNum = IF_INTERNAL_PREC - g_bitDepthY;
> +    Int shift   = wp0[0].shift + shiftNum;
> +    Int round   = shift ? (1 << (shift - 1)) * bRound : 0;
> +    Int w1      = wp1[0].w;
> +
> +    UInt  iSrc0Stride = pcYuvSrc0->getStride();
> +    UInt  iSrc1Stride = pcYuvSrc1->getStride();
> +    UInt  iDstStride  = rpcYuvDst->getStride();
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: luma min width is 4
> +            pDstY[x] = weightBidirY(w0, pSrcY0[x], w1, pSrcY1[x], round,
> shift, offset);
> +            x--;
> +            pDstY[x] = weightBidirY(w0, pSrcY0[x], w1, pSrcY1[x], round,
> shift, offset);
> +            x--;
> +            pDstY[x] = weightBidirY(w0, pSrcY0[x], w1, pSrcY1[x], round,
> shift, offset);
> +            x--;
> +            pDstY[x] = weightBidirY(w0, pSrcY0[x], w1, pSrcY1[x], round,
> shift, offset);
> +            x--;
> +        }
> +
> +        pSrcY0 += iSrc0Stride;
> +        pSrcY1 += iSrc1Stride;
> +        pDstY  += iDstStride;
> +    }
> +
> +    // Chroma U : --------------------------------------------
> +    w0      = wp0[1].w;
> +    offset  = wp0[1].offset;
> +    shiftNum = IF_INTERNAL_PREC - g_bitDepthC;
> +    shift   = wp0[1].shift + shiftNum;
> +    round   = shift ? (1 << (shift - 1)) : 0;
> +    w1      = wp1[1].w;
> +
> +    iSrc0Stride = pcYuvSrc0->getCStride();
> +    iSrc1Stride = pcYuvSrc1->getCStride();
> +    iDstStride  = rpcYuvDst->getCStride();
> +
> +    iWidth  >>= 1;
> +    iHeight >>= 1;
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: chroma min width is 2
> +            pDstU[x] = weightBidirC(w0, pSrcU0[x], w1, pSrcU1[x], round,
> shift, offset);
> +            x--;
> +            pDstU[x] = weightBidirC(w0, pSrcU0[x], w1, pSrcU1[x], round,
> shift, offset);
> +            x--;
> +        }
> +
> +        pSrcU0 += iSrc0Stride;
> +        pSrcU1 += iSrc1Stride;
> +        pDstU  += iDstStride;
> +    }
> +
> +    // Chroma V : --------------------------------------------
> +    w0      = wp0[2].w;
> +    offset  = wp0[2].offset;
> +    shift   = wp0[2].shift + shiftNum;
> +    round   = shift ? (1 << (shift - 1)) : 0;
> +    w1      = wp1[2].w;
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: chroma min width is 2
> +            pDstV[x] = weightBidirC(w0, pSrcV0[x], w1, pSrcV1[x], round,
> shift, offset);
> +            x--;
> +            pDstV[x] = weightBidirC(w0, pSrcV0[x], w1, pSrcV1[x], round,
> shift, offset);
> +            x--;
> +        }
> +
> +        pSrcV0 += iSrc0Stride;
> +        pSrcV1 += iSrc1Stride;
> +        pDstV  += iDstStride;
> +    }
> +}
> +
> +
>  /** weighted averaging for uni-pred
>   * \param TComYuv* pcYuvSrc0
>   * \param iPartUnitIdx
> @@ -279,6 +395,105 @@
>      }
>  }
>
> +/** weighted averaging for uni-pred
> + * \param TShortYUV* pcYuvSrc0
> + * \param iPartUnitIdx
> + * \param iWidth
> + * \param iHeight
> + * \param wpScalingParam *wp0
> + * \param TComYuv* rpcYuvDst
> + * \returns Void
> + */
> +Void TComWeightPrediction::addWeightUni(TShortYUV* pcYuvSrc0, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight, wpScalingParam *wp0, TComYuv*
> rpcYuvDst)
> +{
> +    Int x, y;
> +
> +    Short* pSrcY0  = pcYuvSrc0->getLumaAddr(iPartUnitIdx);
> +    Short* pSrcU0  = pcYuvSrc0->getCbAddr(iPartUnitIdx);
> +    Short* pSrcV0  = pcYuvSrc0->getCrAddr(iPartUnitIdx);
> +
> +    Pel* pDstY   = rpcYuvDst->getLumaAddr(iPartUnitIdx);
> +    Pel* pDstU   = rpcYuvDst->getCbAddr(iPartUnitIdx);
> +    Pel* pDstV   = rpcYuvDst->getCrAddr(iPartUnitIdx);
> +
> +    // Luma : --------------------------------------------
> +    Int w0      = wp0[0].w;
> +    Int offset  = wp0[0].offset;
> +    Int shiftNum = IF_INTERNAL_PREC - g_bitDepthY;
> +    Int shift   = wp0[0].shift + shiftNum;
> +    Int round   = shift ? (1 << (shift - 1)) : 0;
> +    UInt  iSrc0Stride = pcYuvSrc0->getStride();
> +    UInt  iDstStride  = rpcYuvDst->getStride();
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: luma min width is 4
> +            pDstY[x] = weightUnidirY(w0, pSrcY0[x], round, shift, offset);
> +            x--;
> +            pDstY[x] = weightUnidirY(w0, pSrcY0[x], round, shift, offset);
> +            x--;
> +            pDstY[x] = weightUnidirY(w0, pSrcY0[x], round, shift, offset);
> +            x--;
> +            pDstY[x] = weightUnidirY(w0, pSrcY0[x], round, shift, offset);
> +            x--;
> +        }
> +
> +        pSrcY0 += iSrc0Stride;
> +        pDstY  += iDstStride;
> +    }
> +
> +    // Chroma U : --------------------------------------------
> +    w0      = wp0[1].w;
> +    offset  = wp0[1].offset;
> +    shiftNum = IF_INTERNAL_PREC - g_bitDepthC;
> +    shift   = wp0[1].shift + shiftNum;
> +    round   = shift ? (1 << (shift - 1)) : 0;
> +
> +    iSrc0Stride = pcYuvSrc0->getCStride();
> +    iDstStride  = rpcYuvDst->getCStride();
> +
> +    iWidth  >>= 1;
> +    iHeight >>= 1;
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: chroma min width is 2
> +            pDstU[x] = weightUnidirC(w0, pSrcU0[x], round, shift, offset);
> +            x--;
> +            pDstU[x] = weightUnidirC(w0, pSrcU0[x], round, shift, offset);
> +            x--;
> +        }
> +
> +        pSrcU0 += iSrc0Stride;
> +        pDstU  += iDstStride;
> +    }
> +
> +    // Chroma V : --------------------------------------------
> +    w0      = wp0[2].w;
> +    offset  = wp0[2].offset;
> +    shift   = wp0[2].shift + shiftNum;
> +    round   = shift ? (1 << (shift - 1)) : 0;
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: chroma min width is 2
> +            pDstV[x] = weightUnidirC(w0, pSrcV0[x], round, shift, offset);
> +            x--;
> +            pDstV[x] = weightUnidirC(w0, pSrcV0[x], round, shift, offset);
> +            x--;
> +        }
> +
> +        pSrcV0 += iSrc0Stride;
> +        pDstV  += iDstStride;
> +    }
> +}
> +
>  //=======================================================
>  //  getWpScaling()
>  //=======================================================
> @@ -396,6 +611,45 @@
>      }
>  }
>
> +/** weighted prediction for bi-pred
> + * \param TComDataCU* pcCU
> + * \param TShortYuv* pcYuvSrc0
> + * \param TShortYuv* pcYuvSrc1
> + * \param iRefIdx0
> + * \param iRefIdx1
> + * \param uiPartIdx
> + * \param iWidth
> + * \param iHeight
> + * \param TComYuv* rpcYuvDst
> + * \returns Void
> + */
> +Void TComWeightPrediction::xWeightedPredictionBi(TComDataCU* pcCU,
> TShortYUV* pcYuvSrc0, TShortYUV* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1,
> UInt uiPartIdx, Int iWidth, Int iHeight, TComYuv* rpcYuvDst)
> +{
> +    wpScalingParam  *pwp0, *pwp1;
> +    const TComPPS   *pps = pcCU->getSlice()->getPPS();
> +
> +    assert(pps->getWPBiPred());
> +
> +    getWpScaling(pcCU, iRefIdx0, iRefIdx1, pwp0, pwp1);
> +
> +    if (iRefIdx0 >= 0 && iRefIdx1 >= 0)
> +    {
> +        addWeightBi(pcYuvSrc0, pcYuvSrc1, uiPartIdx, iWidth, iHeight,
> pwp0, pwp1, rpcYuvDst);
> +    }
> +    else if (iRefIdx0 >= 0 && iRefIdx1 <  0)
> +    {
> +        addWeightUni(pcYuvSrc0, uiPartIdx, iWidth, iHeight, pwp0,
> rpcYuvDst);
> +    }
> +    else if (iRefIdx0 <  0 && iRefIdx1 >= 0)
> +    {
> +        addWeightUni(pcYuvSrc1, uiPartIdx, iWidth, iHeight, pwp1,
> rpcYuvDst);
> +    }
> +    else
> +    {
> +        assert(0);
> +    }
> +}
> +
>  /** weighted prediction for uni-pred
>   * \param TComDataCU* pcCU
>   * \param TComYuv* pcYuvSrc
> @@ -428,3 +682,37 @@
>      }
>      addWeightUni(pcYuvSrc, uiPartAddr, iWidth, iHeight, pwp, rpcYuvPred);
>  }
> +
> +
> +/** weighted prediction for uni-pred
> + * \param TComDataCU* pcCU
> + * \param TShortYuv* pcYuvSrc
> + * \param uiPartAddr
> + * \param iWidth
> + * \param iHeight
> + * \param eRefPicList
> + * \param TComYuv*& rpcYuvPred
> + * \param iPartIdx
> + * \param iRefIdx
> + * \returns Void
> + */
> +Void TComWeightPrediction::xWeightedPredictionUni(TComDataCU* pcCU,
> TShortYUV* pcYuvSrc, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList
> eRefPicList, TComYuv*& rpcYuvPred, Int iRefIdx)
> +{
> +    wpScalingParam  *pwp, *pwpTmp;
> +
> +    if (iRefIdx < 0)
> +    {
> +        iRefIdx   =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +    }
> +    assert(iRefIdx >= 0);
> +
> +    if (eRefPicList == REF_PIC_LIST_0)
> +    {
> +        getWpScaling(pcCU, iRefIdx, -1, pwp, pwpTmp);
> +    }
> +    else
> +    {
> +        getWpScaling(pcCU, -1, iRefIdx, pwpTmp, pwp);
> +    }
> +    addWeightUni(pcYuvSrc, uiPartAddr, iWidth, iHeight, pwp, rpcYuvPred);
> +}
> diff -r 7f9730659262 -r a864e518afec
> source/Lib/TLibCommon/TComWeightPrediction.h
> --- a/source/Lib/TLibCommon/TComWeightPrediction.h      Mon Jun 24
> 11:38:53 2013 +0530
> +++ b/source/Lib/TLibCommon/TComWeightPrediction.h      Mon Jun 24
> 18:05:58 2013 +0530
> @@ -58,10 +58,14 @@
>      Void  getWpScaling(TComDataCU* pcCU, Int iRefIdx0, Int iRefIdx1,
> wpScalingParam *&wp0, wpScalingParam *&wp1);
>
>      Void  addWeightBi(TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* rpcYuvDst, Bool bRound = true);
> +    Void  addWeightBi(TShortYUV* pcYuvSrc0, TShortYUV* pcYuvSrc1, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* rpcYuvDst, Bool bRound = true);
>      Void  addWeightUni(TComYuv* pcYuvSrc0, UInt iPartUnitIdx, UInt
> iWidth, UInt iHeight, wpScalingParam *wp0, TComYuv* rpcYuvDst);
> +    Void  addWeightUni(TShortYUV* pcYuvSrc0, UInt iPartUnitIdx, UInt
> iWidth, UInt iHeight, wpScalingParam *wp0, TComYuv* rpcYuvDst);
>
>      Void  xWeightedPredictionUni(TComDataCU* pcCU, TComYuv* pcYuvSrc,
> UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*&
> rpcYuvPred, Int iRefIdx = -1);
> +    Void  xWeightedPredictionUni(TComDataCU* pcCU, TShortYUV* pcYuvSrc,
> UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*&
> rpcYuvPred, Int iRefIdx = -1);
>      Void  xWeightedPredictionBi(TComDataCU* pcCU, TComYuv* pcYuvSrc0,
> TComYuv* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth,
> Int iHeight, TComYuv* rpcYuvDst);
> +    Void  xWeightedPredictionBi(TComDataCU* pcCU, TShortYUV* pcYuvSrc0,
> TShortYUV* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int
> iWidth, Int iHeight, TComYuv* rpcYuvDst);
>  };
>
>  #endif // ifndef __TCOMWEIGHTPREDICTION__
> diff -r 7f9730659262 -r a864e518afec source/Lib/TLibCommon/TComYuv.cpp
> --- a/source/Lib/TLibCommon/TComYuv.cpp Mon Jun 24 11:38:53 2013 +0530
> +++ b/source/Lib/TLibCommon/TComYuv.cpp Mon Jun 24 18:05:58 2013 +0530
> @@ -649,6 +649,75 @@
>      }
>  }
>
> +Void TComYuv::addAvg(TShortYUV* pcYuvSrc0, TShortYUV* pcYuvSrc1, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight)
> +{
> +    Int x, y;
> +
> +    Short* pSrcY0  = pcYuvSrc0->getLumaAddr(iPartUnitIdx);
> +    Short* pSrcU0  = pcYuvSrc0->getCbAddr(iPartUnitIdx);
> +    Short* pSrcV0  = pcYuvSrc0->getCrAddr(iPartUnitIdx);
> +
> +    Short* pSrcY1  = pcYuvSrc1->getLumaAddr(iPartUnitIdx);
> +    Short* pSrcU1  = pcYuvSrc1->getCbAddr(iPartUnitIdx);
> +    Short* pSrcV1  = pcYuvSrc1->getCrAddr(iPartUnitIdx);
> +
> +    Pel* pDstY   = getLumaAddr(iPartUnitIdx);
> +    Pel* pDstU   = getCbAddr(iPartUnitIdx);
> +    Pel* pDstV   = getCrAddr(iPartUnitIdx);
> +
> +    UInt  iSrc0Stride = pcYuvSrc0->getStride();
> +    UInt  iSrc1Stride = pcYuvSrc1->getStride();
> +    UInt  iDstStride  = getStride();
> +    Int shiftNum = IF_INTERNAL_PREC + 1 - g_bitDepthY;
> +    Int offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +
> +    for (y = 0; y < iHeight; y++)
> +    {
> +        for (x = 0; x < iWidth; x += 4)
> +        {
> +            pDstY[x + 0] = ClipY((pSrcY0[x + 0] + pSrcY1[x + 0] + offset)
> >> shiftNum);
> +            pDstY[x + 1] = ClipY((pSrcY0[x + 1] + pSrcY1[x + 1] + offset)
> >> shiftNum);
> +            pDstY[x + 2] = ClipY((pSrcY0[x + 2] + pSrcY1[x + 2] + offset)
> >> shiftNum);
> +            pDstY[x + 3] = ClipY((pSrcY0[x + 3] + pSrcY1[x + 3] + offset)
> >> shiftNum);
> +        }
> +
> +        pSrcY0 += iSrc0Stride;
> +        pSrcY1 += iSrc1Stride;
> +        pDstY  += iDstStride;
> +    }
> +
> +    shiftNum = IF_INTERNAL_PREC + 1 - g_bitDepthC;
> +    offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +
> +    iSrc0Stride = pcYuvSrc0->getCStride();
> +    iSrc1Stride = pcYuvSrc1->getCStride();
> +    iDstStride  = getCStride();
> +
> +    iWidth  >>= 1;
> +    iHeight >>= 1;
> +
> +    for (y = iHeight - 1; y >= 0; y--)
> +    {
> +        for (x = iWidth - 1; x >= 0; )
> +        {
> +            // note: chroma min width is 2
> +            pDstU[x] = ClipC((pSrcU0[x] + pSrcU1[x] + offset) >>
> shiftNum);
> +            pDstV[x] = ClipC((pSrcV0[x] + pSrcV1[x] + offset) >>
> shiftNum);
> +            x--;
> +            pDstU[x] = ClipC((pSrcU0[x] + pSrcU1[x] + offset) >>
> shiftNum);
> +            pDstV[x] = ClipC((pSrcV0[x] + pSrcV1[x] + offset) >>
> shiftNum);
> +            x--;
> +        }
> +
> +        pSrcU0 += iSrc0Stride;
> +        pSrcU1 += iSrc1Stride;
> +        pSrcV0 += iSrc0Stride;
> +        pSrcV1 += iSrc1Stride;
> +        pDstU  += iDstStride;
> +        pDstV  += iDstStride;
> +    }
> +}
> +
>  Void TComYuv::removeHighFreq(TComYuv* pcYuvSrc, UInt uiPartIdx, UInt
> uiWidht, UInt uiHeight)
>  {
>      Int x, y;
> diff -r 7f9730659262 -r a864e518afec source/Lib/TLibCommon/TComYuv.h
> --- a/source/Lib/TLibCommon/TComYuv.h   Mon Jun 24 11:38:53 2013 +0530
> +++ b/source/Lib/TLibCommon/TComYuv.h   Mon Jun 24 18:05:58 2013 +0530
> @@ -157,6 +157,7 @@
>
>      //  (pcYuvSrc0 + pcYuvSrc1)/2 for YUV partition
>      Void    addAvg(TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight);
> +    Void    addAvg(TShortYUV* pcYuvSrc0, TShortYUV* pcYuvSrc1, UInt
> iPartUnitIdx, UInt iWidth, UInt iHeight);
>
>      //   Remove High frequency
>      Void    removeHighFreq(TComYuv* pcYuvSrc, UInt uiPartIdx, UInt
> uiWidht, UInt uiHeight);
> diff -r 7f9730659262 -r a864e518afec source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Jun 24 11:38:53 2013
> +0530
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Jun 24 18:05:58 2013
> +0530
> @@ -3561,18 +3561,15 @@
>      // prediction pattern
>      if (pcCU->getSlice()->getPPS()->getUseWP() &&
> pcCU->getSlice()->getSliceType() == P_SLICE)
>      {
> -        xPredInterLumaBlk(pcCU, pcPicYuvRef, uiPartAddr, &cMvCand,
> iSizeX, iSizeY, pcTemplateCand, true);
> +        TShortYUV *pcMbYuv = &m_acShortPred[0];
> +        xPredInterLumaBlk(pcCU, pcPicYuvRef, uiPartAddr, &cMvCand,
> iSizeX, iSizeY, pcMbYuv, true);
> +        xWeightedPredictionUni(pcCU, pcMbYuv, uiPartAddr, iSizeX, iSizeY,
> eRefPicList, pcTemplateCand, iRefIdx);
>      }
>      else
>      {
>          xPredInterLumaBlk(pcCU, pcPicYuvRef, uiPartAddr, &cMvCand,
> iSizeX, iSizeY, pcTemplateCand, false);
>      }
>
> -    if (pcCU->getSlice()->getPPS()->getUseWP() &&
> pcCU->getSlice()->getSliceType() == P_SLICE)
> -    {
> -        xWeightedPredictionUni(pcCU, pcTemplateCand, uiPartAddr, iSizeX,
> iSizeY, eRefPicList, pcTemplateCand, iRefIdx);
> -    }
> -
>      // calc distortion
>      uiCost = m_me.bufSAD((pixel*)pcTemplateCand->getLumaAddr(uiPartAddr),
> pcTemplateCand->getStride());
>      x265_emms();
>
> _______________________________________________
> 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/pipermail/x265-devel/attachments/20130624/5f7dec43/attachment-0001.html>


More information about the x265-devel mailing list