[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