[x265] [PATCH] pass bLuma and bChroma parameters for functions

Deepthi Nandakumar deepthi at multicorewareinc.com
Mon Oct 21 12:02:13 CEST 2013


This has already been accepted.


On Wed, Oct 16, 2013 at 5:18 PM, <sumalatha at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Sumalatha Polureddy
> # Date 1381924099 -19800
> # Node ID ac7aa89eae11d264992fd8495f6dcad8da85f243
> # Parent  3cdbc62783e197cd5cf6dcf5b1cc76e2cd6d93c2
> pass bLuma and bChroma parameters for functions
>
> Based on the values of two parameters, luma and chroma operations are done.
> Default value for both is set as true todo both operations
>
> diff -r 3cdbc62783e1 -r ac7aa89eae11
> source/Lib/TLibCommon/TComPrediction.cpp
> --- a/source/Lib/TLibCommon/TComPrediction.cpp  Wed Oct 16 12:17:21 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.cpp  Wed Oct 16 17:18:19 2013
> +0530
> @@ -245,7 +245,7 @@
>      return false;
>  }
>
> -void TComPrediction::motionCompensation(TComDataCU* cu, TComYuv* predYuv,
> RefPicList picList, int partIdx)
> +void TComPrediction::motionCompensation(TComDataCU* cu, TComYuv* predYuv,
> RefPicList picList, int partIdx, bool bLuma, bool bChroma)
>  {
>      int  width;
>      int  height;
> @@ -264,26 +264,27 @@
>
>                  MV mv = cu->getCUMvField(picList)->getMv(partAddr);
>                  cu->clipMv(mv);
> +                if (bLuma)
> +                    xPredInterLumaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
> +                if (bChroma)
> +                    xPredInterChromaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
>
> -                xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refId)->getPicYuvRec(), partAddr, &mv, width, height, pcMbYuv);
> -                xPredInterChromaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
> -
> -                xWeightedPredictionUni(cu, pcMbYuv, partAddr, width,
> height, picList, predYuv);
> +                xWeightedPredictionUni(cu, pcMbYuv, partAddr, width,
> height, picList, predYuv, bLuma, bChroma);
>              }
>              else
>              {
> -                xPredInterUni(cu, partAddr, width, height, picList,
> predYuv);
> +                xPredInterUni(cu, partAddr, width, height, picList,
> predYuv, bLuma, bChroma);
>              }
>          }
>          else
>          {
>              if (xCheckIdenticalMotion(cu, partAddr))
>              {
> -                xPredInterUni(cu, partAddr, width, height,
> REF_PIC_LIST_0, predYuv);
> +                xPredInterUni(cu, partAddr, width, height,
> REF_PIC_LIST_0, predYuv, bLuma, bChroma);
>              }
>              else
>              {
> -                xPredInterBi(cu, partAddr, width, height, predYuv);
> +                xPredInterBi(cu, partAddr, width, height, predYuv, bLuma,
> bChroma);
>              }
>          }
>          return;
> @@ -305,31 +306,33 @@
>                  MV mv = cu->getCUMvField(picList)->getMv(partAddr);
>                  cu->clipMv(mv);
>
> -                xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refId)->getPicYuvRec(), partAddr, &mv, width, height, pcMbYuv);
> -                xPredInterChromaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
> +                if (bLuma)
> +                    xPredInterLumaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
> +                if (bChroma)
> +                    xPredInterChromaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
>
> -                xWeightedPredictionUni(cu, pcMbYuv, partAddr, width,
> height, picList, predYuv);
> +                xWeightedPredictionUni(cu, pcMbYuv, partAddr, width,
> height, picList, predYuv, bLuma, bChroma);
>              }
>              else
>              {
> -                xPredInterUni(cu, partAddr, width, height, picList,
> predYuv);
> +                xPredInterUni(cu, partAddr, width, height, picList,
> predYuv, bLuma, bChroma);
>              }
>          }
>          else
>          {
>              if (xCheckIdenticalMotion(cu, partAddr))
>              {
> -                xPredInterUni(cu, partAddr, width, height,
> REF_PIC_LIST_0, predYuv);
> +                xPredInterUni(cu, partAddr, width, height,
> REF_PIC_LIST_0, predYuv, bLuma, bChroma);
>              }
>              else
>              {
> -                xPredInterBi(cu, partAddr, width, height, predYuv);
> +                xPredInterBi(cu, partAddr, width, height, predYuv, bLuma,
> bChroma);
>              }
>          }
>      }
>  }
>
> -void TComPrediction::xPredInterUni(TComDataCU* cu, UInt partAddr, int
> width, int height, RefPicList picList, TComYuv* outPredYuv)
> +void TComPrediction::xPredInterUni(TComDataCU* cu, UInt partAddr, int
> width, int height, RefPicList picList, TComYuv* outPredYuv, bool bLuma,
> bool bChroma)
>  {
>      int refIdx = cu->getCUMvField(picList)->getRefIdx(partAddr);
>
> @@ -338,12 +341,14 @@
>      MV mv = cu->getCUMvField(picList)->getMv(partAddr);
>      cu->clipMv(mv);
>
> -    xPredInterLumaBlk(cu, cu->getSlice()->m_mref[picList][refIdx],
> partAddr, &mv, width, height, outPredYuv);
> +    if (bLuma)
> +        xPredInterLumaBlk(cu, cu->getSlice()->m_mref[picList][refIdx],
> partAddr, &mv, width, height, outPredYuv);
>
> -    xPredInterChromaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
> +    if (bChroma)
> +        xPredInterChromaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
>  }
>
> -void TComPrediction::xPredInterUni(TComDataCU* cu, UInt partAddr, int
> width, int height, RefPicList picList, TShortYUV* outPredYuv)
> +void TComPrediction::xPredInterUni(TComDataCU* cu, UInt partAddr, int
> width, int height, RefPicList picList, TShortYUV* outPredYuv, bool bLuma,
> bool bChroma)
>  {
>      int refIdx = cu->getCUMvField(picList)->getRefIdx(partAddr);
>
> @@ -352,11 +357,13 @@
>      MV mv = cu->getCUMvField(picList)->getMv(partAddr);
>      cu->clipMv(mv);
>
> -    xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
> -    xPredInterChromaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
> +    if (bLuma)
> +        xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
> +    if (bChroma)
> +        xPredInterChromaBlk(cu, cu->getSlice()->getRefPic(picList,
> refIdx)->getPicYuvRec(), partAddr, &mv, width, height, outPredYuv);
>  }
>
> -void TComPrediction::xPredInterBi(TComDataCU* cu, UInt partAddr, int
> width, int height, TComYuv*& outPredYuv)
> +void TComPrediction::xPredInterBi(TComDataCU* cu, UInt partAddr, int
> width, int height, TComYuv*& outPredYuv, bool bLuma, bool bChroma)
>  {
>      int refIdx[2] = { -1, -1 };
>
> @@ -371,16 +378,16 @@
>              assert(refIdx[refList] <
> cu->getSlice()->getNumRefIdx(picList));
>
>              pcMbYuv = &m_predShortYuv[refList];
> -            xPredInterUni(cu, partAddr, width, height, picList, pcMbYuv);
> +            xPredInterUni(cu, partAddr, width, height, picList, pcMbYuv,
> bLuma, bChroma);
>          }
>
>          if (cu->getSlice()->getPPS()->getWPBiPred() &&
> cu->getSlice()->getSliceType() == B_SLICE)
>          {
> -            xWeightedPredictionBi(cu, &m_predShortYuv[0],
> &m_predShortYuv[1], refIdx[0], refIdx[1], partAddr, width, height,
> outPredYuv);
> +            xWeightedPredictionBi(cu, &m_predShortYuv[0],
> &m_predShortYuv[1], refIdx[0], refIdx[1], partAddr, width, height,
> outPredYuv, bLuma, bChroma);
>          }
>          else
>          {
> -            outPredYuv->addAvg(&m_predShortYuv[0], &m_predShortYuv[1],
> partAddr, width, height);
> +            outPredYuv->addAvg(&m_predShortYuv[0], &m_predShortYuv[1],
> partAddr, width, height, bLuma, bChroma);
>          }
>      }
>      else if (cu->getSlice()->getPPS()->getWPBiPred() &&
> cu->getSlice()->getSliceType() == B_SLICE)
> @@ -399,10 +406,10 @@
>              assert(refIdx[refList] <
> cu->getSlice()->getNumRefIdx(picList));
>
>              pcMbYuv = &m_predShortYuv[refList];
> -            xPredInterUni(cu, partAddr, width, height, picList, pcMbYuv);
> +            xPredInterUni(cu, partAddr, width, height, picList, pcMbYuv,
> bLuma, bChroma);
>          }
>
> -        xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1],
> refIdx[0], refIdx[1], partAddr, width, height, outPredYuv);
> +        xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1],
> refIdx[0], refIdx[1], partAddr, width, height, outPredYuv, bLuma, bChroma);
>      }
>      else if (cu->getSlice()->getPPS()->getUseWP() &&
> cu->getSlice()->getSliceType() == P_SLICE)
>      {
> @@ -421,11 +428,12 @@
>
>              MV mv = cu->getCUMvField(picList)->getMv(partAddr);
>              cu->clipMv(mv);
> +            if (bLuma)
> +                xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refId)->getPicYuvRec(), partAddr, &mv, width, height, pcMbYuv);
> +            if (bChroma)
> +                xPredInterChromaBlk(cu,
> cu->getSlice()->getRefPic(picList, refId)->getPicYuvRec(), partAddr, &mv,
> width, height, pcMbYuv);
>
> -            xPredInterLumaBlk(cu, cu->getSlice()->getRefPic(picList,
> refId)->getPicYuvRec(), partAddr, &mv, width, height, pcMbYuv);
> -            xPredInterChromaBlk(cu, cu->getSlice()->getRefPic(picList,
> refId)->getPicYuvRec(), partAddr, &mv, width, height, pcMbYuv);
> -
> -            xWeightedPredictionUni(cu, &m_predShortYuv[0], partAddr,
> width, height, REF_PIC_LIST_0, outPredYuv);
> +            xWeightedPredictionUni(cu, &m_predShortYuv[0], partAddr,
> width, height, REF_PIC_LIST_0, outPredYuv, bLuma, bChroma);
>          }
>      }
>      else
> @@ -443,10 +451,10 @@
>              assert(refIdx[refList] <
> cu->getSlice()->getNumRefIdx(picList));
>
>              TComYuv* yuv = &m_predYuv[refList];
> -            xPredInterUni(cu, partAddr, width, height, picList, yuv);
> +            xPredInterUni(cu, partAddr, width, height, picList, yuv,
> bLuma, bChroma);
>          }
>
> -        xWeightedAverage(&m_predYuv[0], &m_predYuv[1], refIdx[0],
> refIdx[1], partAddr, width, height, outPredYuv);
> +        xWeightedAverage(&m_predYuv[0], &m_predYuv[1], refIdx[0],
> refIdx[1], partAddr, width, height, outPredYuv, bLuma, bChroma);
>      }
>  }
>
> @@ -635,19 +643,19 @@
>      }
>  }
>
> -void TComPrediction::xWeightedAverage(TComYuv* srcYuv0, TComYuv* srcYuv1,
> int refIdx0, int refIdx1, UInt partIdx, int width, int height, TComYuv*&
> outDstYuv)
> +void TComPrediction::xWeightedAverage(TComYuv* srcYuv0, TComYuv* srcYuv1,
> int refIdx0, int refIdx1, UInt partIdx, int width, int height, TComYuv*&
> outDstYuv, bool bLuma, bool bChroma)
>  {
>      if (refIdx0 >= 0 && refIdx1 >= 0)
>      {
> -        outDstYuv->addAvg(srcYuv0, srcYuv1, partIdx, width, height);
> +        outDstYuv->addAvg(srcYuv0, srcYuv1, partIdx, width, height,
> bLuma, bChroma);
>      }
>      else if (refIdx0 >= 0 && refIdx1 <  0)
>      {
> -        srcYuv0->copyPartToPartYuv(outDstYuv, partIdx, width, height);
> +        srcYuv0->copyPartToPartYuv(outDstYuv, partIdx, width, height,
> bLuma, bChroma);
>      }
>      else if (refIdx0 <  0 && refIdx1 >= 0)
>      {
> -        srcYuv1->copyPartToPartYuv(outDstYuv, partIdx, width, height);
> +        srcYuv1->copyPartToPartYuv(outDstYuv, partIdx, width, height,
> bLuma, bChroma);
>      }
>  }
>
> diff -r 3cdbc62783e1 -r ac7aa89eae11 source/Lib/TLibCommon/TComPrediction.h
> --- a/source/Lib/TLibCommon/TComPrediction.h    Wed Oct 16 12:17:21 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.h    Wed Oct 16 17:18:19 2013
> +0530
> @@ -83,15 +83,15 @@
>      int       m_lumaRecStride; ///< stride of m_lumaRecBuffer
>
>      // motion compensation functions
> -    void xPredInterUni(TComDataCU* cu, UInt partAddr, int width, int
> height, RefPicList picList, TComYuv* outPredYuv);
> -    void xPredInterUni(TComDataCU* cu, UInt partAddr, int width, int
> height, RefPicList picList, TShortYUV* outPredYuv);
> +    void xPredInterUni(TComDataCU* cu, UInt partAddr, int width, int
> height, RefPicList picList, TComYuv* outPredYuv, bool bLuma = true, bool
> bChroma = true);
> +    void xPredInterUni(TComDataCU* cu, UInt partAddr, int width, int
> height, RefPicList picList, TShortYUV* outPredYuv, bool bLuma = true, bool
> bChroma = true);
>      void xPredInterLumaBlk(TComDataCU *cu, MotionReference *refPic, UInt
> partAddr, MV *mv, int width, int height, TComYuv *dstPic);
>      void xPredInterLumaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, MV *mv, int width, int height, TShortYUV *dstPic);
>      void xPredInterChromaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, MV *mv, int width, int height, TComYuv *dstPic);
>      void xPredInterChromaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, MV *mv, int width, int height, TShortYUV *dstPic);
>
> -    void xPredInterBi(TComDataCU* cu, UInt partAddr, int width, int
> height, TComYuv*& outPredYuv);
> -    void xWeightedAverage(TComYuv* srcYuv0, TComYuv* srcYuv1, int
> refIdx0, int refIdx1, UInt partAddr, int width, int height, TComYuv*&
> outDstYuv);
> +    void xPredInterBi(TComDataCU* cu, UInt partAddr, int width, int
> height, TComYuv*& outPredYuv, bool bLuma = true, bool bChroma = true);
> +    void xWeightedAverage(TComYuv* srcYuv0, TComYuv* srcYuv1, int
> refIdx0, int refIdx1, UInt partAddr, int width, int height, TComYuv*&
> outDstYuv, bool bLuma = true, bool bChroma = true);
>
>      void xGetLLSPrediction(TComPattern* pcPattern, int* src0, int
> srcstride, Pel* dst0, int dststride, UInt width, UInt height, UInt ext0);
>
> @@ -107,7 +107,7 @@
>      void initTempBuff();
>
>      // inter
> -    void motionCompensation(TComDataCU* cu, TComYuv* predYuv, RefPicList
> picList = REF_PIC_LIST_X, int partIdx = -1);
> +    void motionCompensation(TComDataCU* cu, TComYuv* predYuv, RefPicList
> picList = REF_PIC_LIST_X, int partIdx = -1, bool bLuma = true, bool bChroma
> = true);
>
>      // motion vector prediction
>      void getMvPredAMVP(TComDataCU* cu, UInt partIdx, UInt partAddr,
> RefPicList picList, MV& mvPred);
> diff -r 3cdbc62783e1 -r ac7aa89eae11
> source/Lib/TLibCommon/TComWeightPrediction.cpp
> --- a/source/Lib/TLibCommon/TComWeightPrediction.cpp    Wed Oct 16
> 12:17:21 2013 +0530
> +++ b/source/Lib/TLibCommon/TComWeightPrediction.cpp    Wed Oct 16
> 17:18:19 2013 +0530
> @@ -80,7 +80,7 @@
>   * \param TComYuv* outDstYuv
>   * \returns void
>   */
> -void TComWeightPrediction::addWeightBi(TComYuv* srcYuv0, TComYuv*
> srcYuv1, UInt partUnitIdx, UInt width, UInt height, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* outDstYuv, bool bRound)
> +void TComWeightPrediction::addWeightBi(TComYuv* srcYuv0, TComYuv*
> srcYuv1, UInt partUnitIdx, UInt width, UInt height, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* outDstYuv, bool bRound, bool bLuma, bool
> bChroma)
>  {
>      int x, y;
>
> @@ -96,90 +96,96 @@
>      Pel* dstU   = outDstYuv->getCbAddr(partUnitIdx);
>      Pel* dstV   = outDstYuv->getCrAddr(partUnitIdx);
>
> -    // Luma : --------------------------------------------
> -    int w0      = wp0[0].w;
> -    int offset  = wp0[0].offset;
> -    int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    int shift   = wp0[0].shift + shiftNum;
> -    int round   = shift ? (1 << (shift - 1)) * bRound : 0;
> -    int w1      = wp1[0].w;
> +    if (bLuma)
> +    {
> +        // Luma : --------------------------------------------
> +        int w0      = wp0[0].w;
> +        int offset  = wp0[0].offset;
> +        int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        int shift   = wp0[0].shift + shiftNum;
> +        int round   = shift ? (1 << (shift - 1)) * bRound : 0;
> +        int w1      = wp1[0].w;
>
> -    UInt  src0Stride = srcYuv0->getStride();
> -    UInt  src1Stride = srcYuv1->getStride();
> -    UInt  dststride  = outDstYuv->getStride();
> +        UInt  src0Stride = srcYuv0->getStride();
> +        UInt  src1Stride = srcYuv1->getStride();
> +        UInt  dststride  = outDstYuv->getStride();
>
> -    for (y = height - 1; y >= 0; y--)
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: luma min width is 4
> +                pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x],
> round, shift, offset);
> +                x--;
> +                pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x],
> round, shift, offset);
> +                x--;
> +                pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x],
> round, shift, offset);
> +                x--;
> +                pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x],
> round, shift, offset);
> +                x--;
> +            }
> +
> +            srcY0 += src0Stride;
> +            srcY1 += src1Stride;
> +            pDstY  += dststride;
> +        }
> +    }
> +
> +    if (bChroma)
>      {
> -        for (x = width - 1; x >= 0; )
> +        // Chroma U : --------------------------------------------
> +        int w0      = wp0[1].w;
> +        int offset  = wp0[1].offset;
> +        int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        int shift   = wp0[1].shift + shiftNum;
> +        int round   = shift ? (1 << (shift - 1)) : 0;
> +        int w1      = wp1[1].w;
> +
> +        UInt src0Stride = srcYuv0->getCStride();
> +        UInt src1Stride = srcYuv1->getCStride();
> +        UInt dststride  = outDstYuv->getCStride();
> +
> +        width  >>= 1;
> +        height >>= 1;
> +
> +        for (y = height - 1; y >= 0; y--)
>          {
> -            // note: luma min width is 4
> -            pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            pDstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> +                x--;
> +                dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> +                x--;
> +            }
> +
> +            srcU0 += src0Stride;
> +            srcU1 += src1Stride;
> +            dstU  += dststride;
>          }
>
> -        srcY0 += src0Stride;
> -        srcY1 += src1Stride;
> -        pDstY  += dststride;
> -    }
> +        // 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;
>
> -    // Chroma U : --------------------------------------------
> -    w0      = wp0[1].w;
> -    offset  = wp0[1].offset;
> -    shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    shift   = wp0[1].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> -    w1      = wp1[1].w;
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> +                x--;
> +                dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> +                x--;
> +            }
>
> -    src0Stride = srcYuv0->getCStride();
> -    src1Stride = srcYuv1->getCStride();
> -    dststride  = outDstYuv->getCStride();
> -
> -    width  >>= 1;
> -    height >>= 1;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> -            x--;
> -            dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> -            x--;
> +            srcV0 += src0Stride;
> +            srcV1 += src1Stride;
> +            dstV  += dststride;
>          }
> -
> -        srcU0 += src0Stride;
> -        srcU1 += src1Stride;
> -        dstU  += dststride;
> -    }
> -
> -    // 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 = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> -            x--;
> -            dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> -            x--;
> -        }
> -
> -        srcV0 += src0Stride;
> -        srcV1 += src1Stride;
> -        dstV  += dststride;
>      }
>  }
>
> @@ -194,10 +200,13 @@
>   * \param TComYuv* outDstYuv
>   * \returns void
>   */
> -void TComWeightPrediction::addWeightBi(TShortYUV* srcYuv0, TShortYUV*
> srcYuv1, UInt partUnitIdx, UInt width, UInt height, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* outDstYuv, bool bRound)
> +void TComWeightPrediction::addWeightBi(TShortYUV* srcYuv0, TShortYUV*
> srcYuv1, UInt partUnitIdx, UInt width, UInt height, wpScalingParam *wp0,
> wpScalingParam *wp1, TComYuv* outDstYuv, bool bRound, bool bLuma, bool
> bChroma)
>  {
>      int x, y;
>
> +    int w0,w1,  offset, shiftNum, shift, round;
> +    UInt src0Stride, src1Stride, dststride;
> +
>      short* srcY0  = srcYuv0->getLumaAddr(partUnitIdx);
>      short* srcU0  = srcYuv0->getCbAddr(partUnitIdx);
>      short* srcV0  = srcYuv0->getCrAddr(partUnitIdx);
> @@ -210,90 +219,96 @@
>      Pel* dstU   = outDstYuv->getCbAddr(partUnitIdx);
>      Pel* dstV   = outDstYuv->getCrAddr(partUnitIdx);
>
> -    // Luma : --------------------------------------------
> -    int w0      = wp0[0].w;
> -    int offset  = wp0[0].offset;
> -    int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    int shift   = wp0[0].shift + shiftNum;
> -    int round   = shift ? (1 << (shift - 1)) * bRound : 0;
> -    int w1      = wp1[0].w;
> +    if (bLuma)
> +    {
> +        // Luma : --------------------------------------------
> +        w0      = wp0[0].w;
> +        offset  = wp0[0].offset;
> +        shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        shift   = wp0[0].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) * bRound : 0;
> +        w1      = wp1[0].w;
>
> -    UInt  src0Stride = srcYuv0->m_width;
> -    UInt  src1Stride = srcYuv1->m_width;
> -    UInt  dststride  = outDstYuv->getStride();
> +        src0Stride = srcYuv0->m_width;
> +        src1Stride = srcYuv1->m_width;
> +        dststride  = outDstYuv->getStride();
>
> -    for (y = height - 1; y >= 0; y--)
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: luma min width is 4
> +                dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> +                x--;
> +                dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> +                x--;
> +                dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> +                x--;
> +                dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> +                x--;
> +            }
> +
> +            srcY0 += src0Stride;
> +            srcY1 += src1Stride;
> +            dstY  += dststride;
> +        }
> +    }
> +
> +    if (bChroma)
>      {
> -        for (x = width - 1; x >= 0; )
> +        // Chroma U : --------------------------------------------
> +        w0      = wp0[1].w;
> +        offset  = wp0[1].offset;
> +        shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        shift   = wp0[1].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
> +        w1      = wp1[1].w;
> +
> +        src0Stride = srcYuv0->m_cwidth;
> +        src1Stride = srcYuv1->m_cwidth;
> +        dststride  = outDstYuv->getCStride();
> +
> +        width  >>= 1;
> +        height >>= 1;
> +
> +        for (y = height - 1; y >= 0; y--)
>          {
> -            // note: luma min width is 4
> -            dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> -            dstY[x] = weightBidirY(w0, srcY0[x], w1, srcY1[x], round,
> shift, offset);
> -            x--;
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> +                x--;
> +                dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> +                x--;
> +            }
> +
> +            srcU0 += src0Stride;
> +            srcU1 += src1Stride;
> +            dstU  += dststride;
>          }
>
> -        srcY0 += src0Stride;
> -        srcY1 += src1Stride;
> -        dstY  += dststride;
> -    }
> +        // 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;
>
> -    // Chroma U : --------------------------------------------
> -    w0      = wp0[1].w;
> -    offset  = wp0[1].offset;
> -    shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    shift   = wp0[1].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> -    w1      = wp1[1].w;
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> +                x--;
> +                dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> +                x--;
> +            }
>
> -    src0Stride = srcYuv0->m_cwidth;
> -    src1Stride = srcYuv1->m_cwidth;
> -    dststride  = outDstYuv->getCStride();
> -
> -    width  >>= 1;
> -    height >>= 1;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> -            x--;
> -            dstU[x] = weightBidirC(w0, srcU0[x], w1, srcU1[x], round,
> shift, offset);
> -            x--;
> +            srcV0 += src0Stride;
> +            srcV1 += src1Stride;
> +            dstV  += dststride;
>          }
> -
> -        srcU0 += src0Stride;
> -        srcU1 += src1Stride;
> -        dstU  += dststride;
> -    }
> -
> -    // 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 = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> -            x--;
> -            dstV[x] = weightBidirC(w0, srcV0[x], w1, srcV1[x], round,
> shift, offset);
> -            x--;
> -        }
> -
> -        srcV0 += src0Stride;
> -        srcV1 += src1Stride;
> -        dstV  += dststride;
>      }
>  }
>
> @@ -306,10 +321,13 @@
>   * \param TComYuv* outDstYuv
>   * \returns void
>   */
> -void TComWeightPrediction::addWeightUni(TComYuv* srcYuv0, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, TComYuv*
> outDstYuv)
> +void TComWeightPrediction::addWeightUni(TComYuv* srcYuv0, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, TComYuv*
> outDstYuv, bool bLuma, bool bChroma)
>  {
>      int x, y;
>
> +    int w0, offset, shiftNum, shift, round;
> +    UInt src0Stride, dststride;
> +
>      Pel* srcY0  = srcYuv0->getLumaAddr(partUnitIdx);
>      Pel* srcU0  = srcYuv0->getCbAddr(partUnitIdx);
>      Pel* srcV0  = srcYuv0->getCrAddr(partUnitIdx);
> @@ -318,81 +336,87 @@
>      Pel* dstU   = outDstYuv->getCbAddr(partUnitIdx);
>      Pel* dstV   = outDstYuv->getCrAddr(partUnitIdx);
>
> -    // Luma : --------------------------------------------
> -    int w0      = wp0[0].w;
> -    int offset  = wp0[0].offset;
> -    int shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    int shift   = wp0[0].shift + shiftNum;
> -    int round   = shift ? (1 << (shift - 1)) : 0;
> -    UInt src0Stride = srcYuv0->getStride();
> -    UInt dststride  = outDstYuv->getStride();
> +    if (bLuma)
> +    {
> +        // Luma : --------------------------------------------
> +        w0      = wp0[0].w;
> +        offset  = wp0[0].offset;
> +        shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        shift   = wp0[0].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
> +        src0Stride = srcYuv0->getStride();
> +        dststride  = outDstYuv->getStride();
>
> -    for (y = height - 1; y >= 0; y--)
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: luma min width is 4
> +                dstY[x] = weightUnidirY(w0, srcY0[x], round, shift,
> offset);
> +                x--;
> +                dstY[x] = weightUnidirY(w0, srcY0[x], round, shift,
> offset);
> +                x--;
> +                dstY[x] = weightUnidirY(w0, srcY0[x], round, shift,
> offset);
> +                x--;
> +                dstY[x] = weightUnidirY(w0, srcY0[x], round, shift,
> offset);
> +                x--;
> +            }
> +
> +            srcY0 += src0Stride;
> +            dstY  += dststride;
> +        }
> +    }
> +
> +    if (bChroma)
>      {
> -        for (x = width - 1; x >= 0; )
> +        // Chroma U : --------------------------------------------
> +        w0      = wp0[1].w;
> +        offset  = wp0[1].offset;
> +        shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        shift   = wp0[1].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
> +
> +        src0Stride = srcYuv0->getCStride();
> +        dststride  = outDstYuv->getCStride();
> +
> +        width  >>= 1;
> +        height >>= 1;
> +
> +        for (y = height - 1; y >= 0; y--)
>          {
> -            // note: luma min width is 4
> -            dstY[x] = weightUnidirY(w0, srcY0[x], round, shift, offset);
> -            x--;
> -            dstY[x] = weightUnidirY(w0, srcY0[x], round, shift, offset);
> -            x--;
> -            dstY[x] = weightUnidirY(w0, srcY0[x], round, shift, offset);
> -            x--;
> -            dstY[x] = weightUnidirY(w0, srcY0[x], round, shift, offset);
> -            x--;
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstU[x] = weightUnidirC(w0, srcU0[x], round, shift,
> offset);
> +                x--;
> +                dstU[x] = weightUnidirC(w0, srcU0[x], round, shift,
> offset);
> +                x--;
> +            }
> +
> +            srcU0 += src0Stride;
> +            dstU  += dststride;
>          }
>
> -        srcY0 += src0Stride;
> -        dstY  += dststride;
> -    }
> +        // Chroma V : --------------------------------------------
> +        w0      = wp0[2].w;
> +        offset  = wp0[2].offset;
> +        shift   = wp0[2].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
>
> -    // Chroma U : --------------------------------------------
> -    w0      = wp0[1].w;
> -    offset  = wp0[1].offset;
> -    shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    shift   = wp0[1].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> +        for (y = height - 1; y >= 0; y--)
> +        {
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstV[x] = weightUnidirC(w0, srcV0[x], round, shift,
> offset);
> +                x--;
> +                dstV[x] = weightUnidirC(w0, srcV0[x], round, shift,
> offset);
> +                x--;
> +            }
>
> -    src0Stride = srcYuv0->getCStride();
> -    dststride  = outDstYuv->getCStride();
> -
> -    width  >>= 1;
> -    height >>= 1;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstU[x] = weightUnidirC(w0, srcU0[x], round, shift, offset);
> -            x--;
> -            dstU[x] = weightUnidirC(w0, srcU0[x], round, shift, offset);
> -            x--;
> +            srcV0 += src0Stride;
> +            dstV  += dststride;
>          }
> -
> -        srcU0 += src0Stride;
> -        dstU  += dststride;
> -    }
> -
> -    // Chroma V : --------------------------------------------
> -    w0      = wp0[2].w;
> -    offset  = wp0[2].offset;
> -    shift   = wp0[2].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstV[x] = weightUnidirC(w0, srcV0[x], round, shift, offset);
> -            x--;
> -            dstV[x] = weightUnidirC(w0, srcV0[x], round, shift, offset);
> -            x--;
> -        }
> -
> -        srcV0 += src0Stride;
> -        dstV  += dststride;
>      }
>  }
>
> @@ -406,7 +430,7 @@
>   * \returns void
>   */
>
> -void TComWeightPrediction::addWeightUni(TShortYUV* srcYuv0, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, TComYuv*
> outDstYuv, bool justChroma)
> +void TComWeightPrediction::addWeightUni(TShortYUV* srcYuv0, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, TComYuv*
> outDstYuv, bool bLuma, bool bChroma)
>  {
>      short* srcY0  = srcYuv0->getLumaAddr(partUnitIdx);
>      short* srcU0  = srcYuv0->getCbAddr(partUnitIdx);
> @@ -420,7 +444,7 @@
>      int w0, offset, shiftNum, shift, round;
>      UInt srcStride, dstStride;
>
> -    if(!justChroma)
> +    if (bLuma)
>      {
>          // Luma : --------------------------------------------
>          w0      = wp0[0].w;
> @@ -434,28 +458,31 @@
>          primitives.weightpUni((int16_t *)srcY0, dstY, srcStride,
> dstStride, width, height, w0, round, shift, offset);
>      }
>
> -    // Chroma U : --------------------------------------------
> -    w0      = wp0[1].w;
> -    offset  = wp0[1].offset;
> -    shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> -    shift   = wp0[1].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> +    if (bChroma)
> +    {
> +        // Chroma U : --------------------------------------------
> +        w0      = wp0[1].w;
> +        offset  = wp0[1].offset;
> +        shiftNum = IF_INTERNAL_PREC - X265_DEPTH;
> +        shift   = wp0[1].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
>
> -    srcStride = srcYuv0->m_cwidth;
> -    dstStride  = outDstYuv->getCStride();
> +        srcStride = srcYuv0->m_cwidth;
> +        dstStride  = outDstYuv->getCStride();
>
> -    width  >>= 1;
> -    height >>= 1;
> +        width  >>= 1;
> +        height >>= 1;
>
> -    primitives.weightpUni((int16_t *)srcU0, dstU, srcStride, dstStride,
> width, height, w0, round, shift, offset);
> +        primitives.weightpUni((int16_t *)srcU0, dstU, srcStride,
> dstStride, width, height, w0, round, shift, offset);
>
> -    // Chroma V : --------------------------------------------
> -    w0      = wp0[2].w;
> -    offset  = wp0[2].offset;
> -    shift   = wp0[2].shift + shiftNum;
> -    round   = shift ? (1 << (shift - 1)) : 0;
> +        // Chroma V : --------------------------------------------
> +        w0      = wp0[2].w;
> +        offset  = wp0[2].offset;
> +        shift   = wp0[2].shift + shiftNum;
> +        round   = shift ? (1 << (shift - 1)) : 0;
>
> -    primitives.weightpUni((int16_t *)srcV0, dstV, srcStride, dstStride,
> width, height, w0, round, shift, offset);
> +        primitives.weightpUni((int16_t *)srcV0, dstV, srcStride,
> dstStride, width, height, w0, round, shift, offset);
> +    }
>  }
>
>  //=======================================================
> @@ -546,7 +573,7 @@
>   * \param TComYuv* outDstYuv
>   * \returns void
>   */
> -void TComWeightPrediction::xWeightedPredictionBi(TComDataCU* cu, TComYuv*
> srcYuv0, TComYuv* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int
> width, int height, TComYuv* outDstYuv)
> +void TComWeightPrediction::xWeightedPredictionBi(TComDataCU* cu, TComYuv*
> srcYuv0, TComYuv* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int
> width, int height, TComYuv* outDstYuv, bool bLuma, bool bChroma)
>  {
>      wpScalingParam  *pwp0, *pwp1;
>
> @@ -554,15 +581,15 @@
>
>      if (refIdx0 >= 0 && refIdx1 >= 0)
>      {
> -        addWeightBi(srcYuv0, srcYuv1, partIdx, width, height, pwp0, pwp1,
> outDstYuv);
> +        addWeightBi(srcYuv0, srcYuv1, partIdx, width, height, pwp0, pwp1,
> outDstYuv, bLuma, bChroma);
>      }
>      else if (refIdx0 >= 0 && refIdx1 <  0)
>      {
> -        addWeightUni(srcYuv0, partIdx, width, height, pwp0, outDstYuv);
> +        addWeightUni(srcYuv0, partIdx, width, height, pwp0, outDstYuv,
> bLuma, bChroma);
>      }
>      else if (refIdx0 <  0 && refIdx1 >= 0)
>      {
> -        addWeightUni(srcYuv1, partIdx, width, height, pwp1, outDstYuv);
> +        addWeightUni(srcYuv1, partIdx, width, height, pwp1, outDstYuv,
> bLuma, bChroma);
>      }
>      else
>      {
> @@ -582,7 +609,7 @@
>   * \param TComYuv* outDstYuv
>   * \returns void
>   */
> -void TComWeightPrediction::xWeightedPredictionBi(TComDataCU* cu,
> TShortYUV* srcYuv0, TShortYUV* srcYuv1, int refIdx0, int refIdx1, UInt
> partIdx, int width, int height, TComYuv* outDstYuv)
> +void TComWeightPrediction::xWeightedPredictionBi(TComDataCU* cu,
> TShortYUV* srcYuv0, TShortYUV* srcYuv1, int refIdx0, int refIdx1, UInt
> partIdx, int width, int height, TComYuv* outDstYuv, bool bLuma, bool
> bChroma)
>  {
>      wpScalingParam  *pwp0, *pwp1;
>
> @@ -590,15 +617,15 @@
>
>      if (refIdx0 >= 0 && refIdx1 >= 0)
>      {
> -        addWeightBi(srcYuv0, srcYuv1, partIdx, width, height, pwp0, pwp1,
> outDstYuv);
> +        addWeightBi(srcYuv0, srcYuv1, partIdx, width, height, pwp0, pwp1,
> outDstYuv, bLuma, bChroma);
>      }
>      else if (refIdx0 >= 0 && refIdx1 <  0)
>      {
> -        addWeightUni(srcYuv0, partIdx, width, height, pwp0, outDstYuv);
> +        addWeightUni(srcYuv0, partIdx, width, height, pwp0, outDstYuv,
> bLuma, bChroma);
>      }
>      else if (refIdx0 <  0 && refIdx1 >= 0)
>      {
> -        addWeightUni(srcYuv1, partIdx, width, height, pwp1, outDstYuv);
> +        addWeightUni(srcYuv1, partIdx, width, height, pwp1, outDstYuv,
> bLuma, bChroma);
>      }
>      else
>      {
> @@ -618,7 +645,7 @@
>   * \param refIdx
>   * \returns void
>   */
> -void TComWeightPrediction::xWeightedPredictionUni(TComDataCU* cu,
> TComYuv* srcYuv, UInt partAddr, int width, int height, RefPicList picList,
> TComYuv*& outPredYuv, int refIdx)
> +void TComWeightPrediction::xWeightedPredictionUni(TComDataCU* cu,
> TComYuv* srcYuv, UInt partAddr, int width, int height, RefPicList picList,
> TComYuv*& outPredYuv, int refIdx, bool bLuma, bool bChroma)
>  {
>      wpScalingParam  *pwp, *pwpTmp;
>
> @@ -636,7 +663,7 @@
>      {
>          getWpScaling(cu, -1, refIdx, pwpTmp, pwp);
>      }
> -    addWeightUni(srcYuv, partAddr, width, height, pwp, outPredYuv);
> +    addWeightUni(srcYuv, partAddr, width, height, pwp, outPredYuv, bLuma,
> bChroma);
>  }
>
>  /** weighted prediction for uni-pred
> @@ -651,7 +678,7 @@
>   * \param refIdx
>   * \returns void
>   */
> -void TComWeightPrediction::xWeightedPredictionUni(TComDataCU* cu,
> TShortYUV* srcYuv, UInt partAddr, int width, int height, RefPicList
> picList, TComYuv*& outPredYuv, int refIdx)
> +void TComWeightPrediction::xWeightedPredictionUni(TComDataCU* cu,
> TShortYUV* srcYuv, UInt partAddr, int width, int height, RefPicList
> picList, TComYuv*& outPredYuv, int refIdx, bool bLuma, bool bChroma)
>  {
>      wpScalingParam  *pwp, *pwpTmp;
>
> @@ -669,5 +696,5 @@
>      {
>          getWpScaling(cu, -1, refIdx, pwpTmp, pwp);
>      }
> -    addWeightUni(srcYuv, partAddr, width, height, pwp, outPredYuv);
> +    addWeightUni(srcYuv, partAddr, width, height, pwp, outPredYuv, bLuma,
> bChroma);
>  }
> diff -r 3cdbc62783e1 -r ac7aa89eae11
> source/Lib/TLibCommon/TComWeightPrediction.h
> --- a/source/Lib/TLibCommon/TComWeightPrediction.h      Wed Oct 16
> 12:17:21 2013 +0530
> +++ b/source/Lib/TLibCommon/TComWeightPrediction.h      Wed Oct 16
> 17:18:19 2013 +0530
> @@ -60,15 +60,15 @@
>
>      void  getWpScaling(TComDataCU* cu, int refIdx0, int refIdx1,
> wpScalingParam *&wp0, wpScalingParam *&wp1);
>
> -    void  addWeightBi(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, wpScalingParam
> *wp1, TComYuv* outDstYuv, bool bRound = true);
> -    void  addWeightBi(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, wpScalingParam
> *wp1, TComYuv* outDstYuv, bool bRound = true);
> -    void  addWeightUni(TComYuv* srcYuv0, UInt partUnitIdx, UInt width,
> UInt height, wpScalingParam *wp0, TComYuv* outDstYuv);
> -    void  addWeightUni(TShortYUV* srcYuv0, UInt partUnitIdx, UInt width,
> UInt height, wpScalingParam *wp0, TComYuv* outDstYuv, bool justChroma =
> false);
> +    void  addWeightBi(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, wpScalingParam
> *wp1, TComYuv* outDstYuv, bool bRound = true, bool bLuma = true, bool
> bChroma = true);
> +    void  addWeightBi(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, wpScalingParam *wp0, wpScalingParam
> *wp1, TComYuv* outDstYuv, bool bRound = true, bool bLuma = true, bool
> bChroma = true);
> +    void  addWeightUni(TComYuv* srcYuv0, UInt partUnitIdx, UInt width,
> UInt height, wpScalingParam *wp0, TComYuv* outDstYuv, bool bLuma = true,
> bool bChroma = true);
> +    void  addWeightUni(TShortYUV* srcYuv0, UInt partUnitIdx, UInt width,
> UInt height, wpScalingParam *wp0, TComYuv* outDstYuv, bool bLuma = true,
> bool bChroma = true);
>
> -    void  xWeightedPredictionUni(TComDataCU* cu, TComYuv* srcYuv, UInt
> partAddr, int width, int height, RefPicList picList, TComYuv*& outPredYuv,
> int refIdx = -1);
> -    void  xWeightedPredictionUni(TComDataCU* cu, TShortYUV* srcYuv, UInt
> partAddr, int width, int height, RefPicList picList, TComYuv*& outPredYuv,
> int refIdx = -1);
> -    void  xWeightedPredictionBi(TComDataCU* cu, TComYuv* srcYuv0,
> TComYuv* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int width, int
> height, TComYuv* outDstYuv);
> -    void  xWeightedPredictionBi(TComDataCU* cu, TShortYUV* srcYuv0,
> TShortYUV* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int width, int
> height, TComYuv* outDstYuv);
> +    void  xWeightedPredictionUni(TComDataCU* cu, TComYuv* srcYuv, UInt
> partAddr, int width, int height, RefPicList picList, TComYuv*& outPredYuv,
> int refIdx = -1, bool bLuma = true, bool bChroma = true);
> +    void  xWeightedPredictionUni(TComDataCU* cu, TShortYUV* srcYuv, UInt
> partAddr, int width, int height, RefPicList picList, TComYuv*& outPredYuv,
> int refIdx = -1, bool bLuma = true, bool bChroma = true);
> +    void  xWeightedPredictionBi(TComDataCU* cu, TComYuv* srcYuv0,
> TComYuv* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int width, int
> height, TComYuv* outDstYuv, bool bLuma = true, bool bChroma = true);
> +    void  xWeightedPredictionBi(TComDataCU* cu, TShortYUV* srcYuv0,
> TShortYUV* srcYuv1, int refIdx0, int refIdx1, UInt partIdx, int width, int
> height, TComYuv* outDstYuv, bool bLuma = true, bool bChroma = true);
>  };
>  }
>
> diff -r 3cdbc62783e1 -r ac7aa89eae11 source/Lib/TLibCommon/TComYuv.cpp
> --- a/source/Lib/TLibCommon/TComYuv.cpp Wed Oct 16 12:17:21 2013 +0530
> +++ b/source/Lib/TLibCommon/TComYuv.cpp Wed Oct 16 17:18:19 2013 +0530
> @@ -234,16 +234,20 @@
>      primitives.blockcpy_pp(uiCWidth, uiCHeight, dstV, dststride, srcV,
> srcstride);
>  }
>
> -void TComYuv::copyPartToPartYuv(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height)
> +void TComYuv::copyPartToPartYuv(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height, bool bLuma, bool bChroma)
>  {
> -    copyPartToPartLuma(dstPicYuv, partIdx, width, height);
> -    copyPartToPartChroma(dstPicYuv, partIdx, width >> 1, height >> 1);
> +    if(bLuma)
> +        copyPartToPartLuma(dstPicYuv, partIdx, width, height);
> +    if(bChroma)
> +        copyPartToPartChroma(dstPicYuv, partIdx, width >> 1, height >> 1);
>  }
>
> -void TComYuv::copyPartToPartYuv(TShortYUV* dstPicYuv, UInt partIdx, UInt
> width, UInt height)
> +void TComYuv::copyPartToPartYuv(TShortYUV* dstPicYuv, UInt partIdx, UInt
> width, UInt height, bool bLuma, bool bChroma)
>  {
> -    copyPartToPartLuma(dstPicYuv, partIdx, width, height);
> -    copyPartToPartChroma(dstPicYuv, partIdx, width >> 1, height >> 1);
> +    if(bLuma)
> +        copyPartToPartLuma(dstPicYuv, partIdx, width, height);
> +    if(bChroma)
> +        copyPartToPartChroma(dstPicYuv, partIdx, width >> 1, height >> 1);
>  }
>
>  void TComYuv::copyPartToPartLuma(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height)
> @@ -529,9 +533,11 @@
>      }
>  }
>
> -void TComYuv::addAvg(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height)
> +void TComYuv::addAvg(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, bool bLuma, bool bChroma)
>  {
>      int x, y;
> +    UInt src0Stride, src1Stride, dststride;
> +    int shiftNum, offset;
>
>      Pel* srcY0 = srcYuv0->getLumaAddr(partUnitIdx);
>      Pel* srcU0 = srcYuv0->getCbAddr(partUnitIdx);
> @@ -545,62 +551,69 @@
>      Pel* dstU  = getCbAddr(partUnitIdx);
>      Pel* dstV  = getCrAddr(partUnitIdx);
>
> -    UInt src0Stride = srcYuv0->getStride();
> -    UInt src1Stride = srcYuv1->getStride();
> -    UInt dststride  = getStride();
> -    int shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> -    int offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +    if(bLuma)
> +    {
> +        src0Stride = srcYuv0->getStride();
> +        src1Stride = srcYuv1->getStride();
> +        dststride  = getStride();
> +        shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> +        offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
>
> -    for (y = 0; y < height; y++)
> +        for (y = 0; y < height; y++)
> +        {
> +            for (x = 0; x < width; x += 4)
> +            {
> +                dstY[x + 0] = ClipY((srcY0[x + 0] + srcY1[x + 0] +
> offset) >> shiftNum);
> +                dstY[x + 1] = ClipY((srcY0[x + 1] + srcY1[x + 1] +
> offset) >> shiftNum);
> +                dstY[x + 2] = ClipY((srcY0[x + 2] + srcY1[x + 2] +
> offset) >> shiftNum);
> +                dstY[x + 3] = ClipY((srcY0[x + 3] + srcY1[x + 3] +
> offset) >> shiftNum);
> +            }
> +
> +            srcY0 += src0Stride;
> +            srcY1 += src1Stride;
> +            dstY  += dststride;
> +        }
> +    }
> +    if(bChroma)
>      {
> -        for (x = 0; x < width; x += 4)
> +        shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> +        offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +
> +        src0Stride = srcYuv0->getCStride();
> +        src1Stride = srcYuv1->getCStride();
> +        dststride  = getCStride();
> +
> +        width  >>= 1;
> +        height >>= 1;
> +
> +        for (y = height - 1; y >= 0; y--)
>          {
> -            dstY[x + 0] = ClipY((srcY0[x + 0] + srcY1[x + 0] + offset) >>
> shiftNum);
> -            dstY[x + 1] = ClipY((srcY0[x + 1] + srcY1[x + 1] + offset) >>
> shiftNum);
> -            dstY[x + 2] = ClipY((srcY0[x + 2] + srcY1[x + 2] + offset) >>
> shiftNum);
> -            dstY[x + 3] = ClipY((srcY0[x + 3] + srcY1[x + 3] + offset) >>
> shiftNum);
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >>
> shiftNum);
> +                dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >>
> shiftNum);
> +                x--;
> +                dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >>
> shiftNum);
> +                dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >>
> shiftNum);
> +                x--;
> +            }
> +
> +            srcU0 += src0Stride;
> +            srcU1 += src1Stride;
> +            srcV0 += src0Stride;
> +            srcV1 += src1Stride;
> +            dstU  += dststride;
> +            dstV  += dststride;
>          }
> -
> -        srcY0 += src0Stride;
> -        srcY1 += src1Stride;
> -        dstY  += dststride;
> -    }
> -
> -    shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> -    offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> -
> -    src0Stride = srcYuv0->getCStride();
> -    src1Stride = srcYuv1->getCStride();
> -    dststride  = getCStride();
> -
> -    width  >>= 1;
> -    height >>= 1;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >> shiftNum);
> -            dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >> shiftNum);
> -            x--;
> -            dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >> shiftNum);
> -            dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >> shiftNum);
> -            x--;
> -        }
> -
> -        srcU0 += src0Stride;
> -        srcU1 += src1Stride;
> -        srcV0 += src0Stride;
> -        srcV1 += src1Stride;
> -        dstU  += dststride;
> -        dstV  += dststride;
>      }
>  }
>
> -void TComYuv::addAvg(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height)
> +void TComYuv::addAvg(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, bool bLuma, bool bChroma)
>  {
>      int x, y;
> +    UInt src0Stride, src1Stride, dststride;
> +    int shiftNum, offset;
>
>      short* srcY0 = srcYuv0->getLumaAddr(partUnitIdx);
>      short* srcU0 = srcYuv0->getCbAddr(partUnitIdx);
> @@ -614,56 +627,61 @@
>      Pel* dstU = getCbAddr(partUnitIdx);
>      Pel* dstV = getCrAddr(partUnitIdx);
>
> -    UInt src0Stride = srcYuv0->m_width;
> -    UInt src1Stride = srcYuv1->m_width;
> -    UInt dststride  = getStride();
> -    int shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> -    int offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +    if(bLuma)
> +    {
> +        src0Stride = srcYuv0->m_width;
> +        src1Stride = srcYuv1->m_width;
> +        dststride  = getStride();
> +        shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> +        offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
>
> -    for (y = 0; y < height; y++)
> +        for (y = 0; y < height; y++)
> +        {
> +            for (x = 0; x < width; x += 4)
> +            {
> +                dstY[x + 0] = ClipY((srcY0[x + 0] + srcY1[x + 0] +
> offset) >> shiftNum);
> +                dstY[x + 1] = ClipY((srcY0[x + 1] + srcY1[x + 1] +
> offset) >> shiftNum);
> +                dstY[x + 2] = ClipY((srcY0[x + 2] + srcY1[x + 2] +
> offset) >> shiftNum);
> +                dstY[x + 3] = ClipY((srcY0[x + 3] + srcY1[x + 3] +
> offset) >> shiftNum);
> +            }
> +
> +            srcY0 += src0Stride;
> +            srcY1 += src1Stride;
> +            dstY  += dststride;
> +        }
> +    }
> +    if(bChroma)
>      {
> -        for (x = 0; x < width; x += 4)
> +        shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> +        offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> +
> +        src0Stride = srcYuv0->m_cwidth;
> +        src1Stride = srcYuv1->m_cwidth;
> +        dststride  = getCStride();
> +
> +        width  >>= 1;
> +        height >>= 1;
> +
> +        for (y = height - 1; y >= 0; y--)
>          {
> -            dstY[x + 0] = ClipY((srcY0[x + 0] + srcY1[x + 0] + offset) >>
> shiftNum);
> -            dstY[x + 1] = ClipY((srcY0[x + 1] + srcY1[x + 1] + offset) >>
> shiftNum);
> -            dstY[x + 2] = ClipY((srcY0[x + 2] + srcY1[x + 2] + offset) >>
> shiftNum);
> -            dstY[x + 3] = ClipY((srcY0[x + 3] + srcY1[x + 3] + offset) >>
> shiftNum);
> +            for (x = width - 1; x >= 0; )
> +            {
> +                // note: chroma min width is 2
> +                dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >>
> shiftNum);
> +                dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >>
> shiftNum);
> +                x--;
> +                dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >>
> shiftNum);
> +                dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >>
> shiftNum);
> +                x--;
> +            }
> +
> +            srcU0 += src0Stride;
> +            srcU1 += src1Stride;
> +            srcV0 += src0Stride;
> +            srcV1 += src1Stride;
> +            dstU  += dststride;
> +            dstV  += dststride;
>          }
> -
> -        srcY0 += src0Stride;
> -        srcY1 += src1Stride;
> -        dstY  += dststride;
> -    }
> -
> -    shiftNum = IF_INTERNAL_PREC + 1 - X265_DEPTH;
> -    offset = (1 << (shiftNum - 1)) + 2 * IF_INTERNAL_OFFS;
> -
> -    src0Stride = srcYuv0->m_cwidth;
> -    src1Stride = srcYuv1->m_cwidth;
> -    dststride  = getCStride();
> -
> -    width  >>= 1;
> -    height >>= 1;
> -
> -    for (y = height - 1; y >= 0; y--)
> -    {
> -        for (x = width - 1; x >= 0; )
> -        {
> -            // note: chroma min width is 2
> -            dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >> shiftNum);
> -            dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >> shiftNum);
> -            x--;
> -            dstU[x] = ClipC((srcU0[x] + srcU1[x] + offset) >> shiftNum);
> -            dstV[x] = ClipC((srcV0[x] + srcV1[x] + offset) >> shiftNum);
> -            x--;
> -        }
> -
> -        srcU0 += src0Stride;
> -        srcU1 += src1Stride;
> -        srcV0 += src0Stride;
> -        srcV1 += src1Stride;
> -        dstU  += dststride;
> -        dstV  += dststride;
>      }
>  }
>
> diff -r 3cdbc62783e1 -r ac7aa89eae11 source/Lib/TLibCommon/TComYuv.h
> --- a/source/Lib/TLibCommon/TComYuv.h   Wed Oct 16 12:17:21 2013 +0530
> +++ b/source/Lib/TLibCommon/TComYuv.h   Wed Oct 16 17:18:19 2013 +0530
> @@ -132,8 +132,8 @@
>      void    copyPartToChroma(TComYuv* dstPicYuv, UInt uiSrcPartIdx);
>
>      //  Copy YUV partition buffer to other YUV partition buffer
> -    void    copyPartToPartYuv(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height);
> -    void    copyPartToPartYuv(TShortYUV* dstPicYuv, UInt partIdx, UInt
> width, UInt height);
> +    void    copyPartToPartYuv(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height, bool bLuma = true, bool bChroma = true);
> +    void    copyPartToPartYuv(TShortYUV* dstPicYuv, UInt partIdx, UInt
> width, UInt height, bool bLuma = true, bool bChroma = true);
>      void    copyPartToPartLuma(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height);
>      void    copyPartToPartLuma(TShortYUV* dstPicYuv, UInt partIdx, UInt
> width, UInt height);
>      void    copyPartToPartChroma(TComYuv* dstPicYuv, UInt partIdx, UInt
> width, UInt height);
> @@ -160,8 +160,8 @@
>      void    subtractChroma(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt
> trUnitIdx, UInt partSize);
>
>      //  (srcYuv0 + srcYuv1)/2 for YUV partition
> -    void    addAvg(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt partUnitIdx,
> UInt width, UInt height);
> -    void    addAvg(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height);
> +    void    addAvg(TComYuv* srcYuv0, TComYuv* srcYuv1, UInt partUnitIdx,
> UInt width, UInt height, bool bLuma = true, bool bChroma = true);
> +    void    addAvg(TShortYUV* srcYuv0, TShortYUV* srcYuv1, UInt
> partUnitIdx, UInt width, UInt height, bool bLuma = true, bool bChroma =
> true);
>
>      //   Remove High frequency
>      void    removeHighFreq(TComYuv* srcYuv, UInt partIdx, UInt width,
> UInt height);
> diff -r 3cdbc62783e1 -r ac7aa89eae11 source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 16 12:17:21 2013
> +0530
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 16 17:18:19 2013
> +0530
> @@ -2196,7 +2196,7 @@
>   * \param bUseMRG
>   * \returns void
>   */
> -void TEncSearch::predInterSearch(TComDataCU* cu, TComYuv* predYuv, bool
> bUseMRG)
> +void TEncSearch::predInterSearch(TComDataCU* cu, TComYuv* predYuv, bool
> bUseMRG, bool bLuma, bool bChroma)
>  {
>      MV mvzero(0, 0);
>      MV mv[2];
> @@ -2521,7 +2521,7 @@
>  #endif
>              }
>          }
> -        motionCompensation(cu, predYuv, REF_PIC_LIST_X, partIdx);
> +        motionCompensation(cu, predYuv, REF_PIC_LIST_X, partIdx, bLuma,
> bChroma);
>      }
>
>      setWpScalingDistParam(cu, -1, REF_PIC_LIST_X);
> diff -r 3cdbc62783e1 -r ac7aa89eae11 source/Lib/TLibEncoder/TEncSearch.h
> --- a/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 16 12:17:21 2013
> +0530
> +++ b/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 16 17:18:19 2013
> +0530
> @@ -142,7 +142,7 @@
>                                TComYuv* reconYuv, UInt precalcDistC);
>
>      /// encoder estimation - inter prediction (non-skip)
> -    void predInterSearch(TComDataCU* cu, TComYuv* predYuv, bool bUseMRG =
> false);
> +    void predInterSearch(TComDataCU* cu, TComYuv* predYuv, bool bUseMRG =
> false, bool bLuma = true, bool bChroma = true);
>
>      /// encode residual and compute rd-cost for inter mode
>      void encodeResAndCalcRdInterCU(TComDataCU* cu, TComYuv* fencYuv,
> TComYuv* predYuv, TShortYUV* resiYuv, TShortYUV* bestResiYuv,
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20131021/131a54ca/attachment-0001.html>


More information about the x265-devel mailing list