[x265] [PATCH] Restructured xPredInterBi. Added xPredInterluma/chromablk/Uni functions with TShortYuv argument for bipred. Not yet usable

Steve Borho steve at borho.org
Fri Jun 21 19:40:03 CEST 2013


On Fri, Jun 21, 2013 at 7:26 AM, <deepthidevaki at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Deepthi Devaki
> # Date 1371817190 -19800
> # Node ID caaf0b1a045c9e79b8124dab5585e0ca1a75dd42
> # Parent  371e9320d819387ced987a42f55bda2815dcc7ae
> Restructured xPredInterBi. Added xPredInterluma/chromablk/Uni functions
> with TShortYuv argument for bipred. Not yet usable.
>

When applied, this patch results in heap corruption errors being reported
at exit when the TComPrediction buffers are deleted, so I'm leaving this
un-applied.

diff -r 371e9320d819 -r caaf0b1a045c
> source/Lib/TLibCommon/TComPrediction.cpp
> --- a/source/Lib/TLibCommon/TComPrediction.cpp  Fri Jun 21 17:46:23 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.cpp  Fri Jun 21 17:49:50 2013
> +0530
> @@ -480,6 +480,21 @@
>
>  Void TComPrediction::xPredInterUni(TComDataCU* pcCU, UInt uiPartAddr, Int
> iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi)
>  {
> +    assert (bi == false);
> +    Int iRefIdx = pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +
> +    assert(iRefIdx >= 0);
> +    TComMv cMv = pcCU->getCUMvField(eRefPicList)->getMv(uiPartAddr);
> +
> +    pcCU->clipMv(cMv);
> +    xPredInterLumaBlk(pcCU, pcCU->getSlice()->getRefPic(eRefPicList,
> iRefIdx)->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred,
> bi);
> +    xPredInterChromaBlk(pcCU, pcCU->getSlice()->getRefPic(eRefPicList,
> iRefIdx)->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred,
> bi);
> +}
> +
> +Void TComPrediction::xPredInterUni(TComDataCU* pcCU, UInt uiPartAddr, Int
> iWidth, Int iHeight, RefPicList eRefPicList, TShortYUV*& rpcYuvPred, Bool
> bi)
> +{
> +    assert (bi == true);
> +
>      Int iRefIdx = pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
>
>      assert(iRefIdx >= 0);
> @@ -495,47 +510,87 @@
>      TComYuv* pcMbYuv;
>      Int      iRefIdx[2] = { -1, -1 };
>
> -    for (Int iRefList = 0; iRefList < 2; iRefList++)
> +    if (pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiPartAddr) >= 0 &&
> pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiPartAddr) >= 0)
>      {
> -        RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> -        iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
>
> -        if (iRefIdx[iRefList] < 0)
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acYuvPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);   //pcMbYuv should be TShortYuv
> +        }
> +        if (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE)
>          {
> -            continue;
> -        }
> -
> -        assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> -
> -        pcMbYuv = &m_acYuvPred[iRefList];
> -        if (pcCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiPartAddr) >=
> 0 && pcCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiPartAddr) >= 0)
> -        {
> -            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true);
> +            //m_acYuvPred must be TShortYuv
> +            xWeightedPredictionBi(pcCU, &m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
>          }
>          else
>          {
> -            if ((pcCU->getSlice()->getPPS()->getUseWP()       &&
> pcCU->getSlice()->getSliceType() == P_SLICE) ||
> -                (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE))
> -            {
> -                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcMbYuv, true);
> -            }
> -            else
> -            {
> -                xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight,
> eRefPicList, pcMbYuv);
> -            }
> +            //m_acYuvPred must be TShortYuv
> +            xWeightedAverage(&m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
>          }
>      }
> +    else if (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE)
> +    {
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
>
> -    if (pcCU->getSlice()->getPPS()->getWPBiPred() &&
> pcCU->getSlice()->getSliceType() == B_SLICE)
> -    {
> +            if (iRefIdx[iRefList] < 0)
> +            {
> +                continue;
> +            }
> +
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acYuvPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true); //pcMbYuv must be TShort
> +        }
> +        //m_acYuvPred must be TShort
>          xWeightedPredictionBi(pcCU, &m_acYuvPred[0], &m_acYuvPred[1],
> iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
>      }
>      else if (pcCU->getSlice()->getPPS()->getUseWP() &&
> pcCU->getSlice()->getSliceType() == P_SLICE)
>      {
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +
> +            if (iRefIdx[iRefList] < 0)
> +            {
> +                continue;
> +            }
> +
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acYuvPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv, true); //pcMbYuv must be TShortYuv
> +        }
> +        //m_acYuvPred must be TShortYuv
>          xWeightedPredictionUni(pcCU, &m_acYuvPred[0], uiPartAddr, iWidth,
> iHeight, REF_PIC_LIST_0, rpcYuvPred);
>      }
>      else
>      {
> +        for (Int iRefList = 0; iRefList < 2; iRefList++)
> +        {
> +            RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 :
> REF_PIC_LIST_0);
> +            iRefIdx[iRefList] =
> pcCU->getCUMvField(eRefPicList)->getRefIdx(uiPartAddr);
> +
> +            if (iRefIdx[iRefList] < 0)
> +            {
> +                continue;
> +            }
> +
> +            assert(iRefIdx[iRefList] <
> pcCU->getSlice()->getNumRefIdx(eRefPicList));
> +
> +            pcMbYuv = &m_acYuvPred[iRefList];
> +            xPredInterUni(pcCU, uiPartAddr, iWidth, iHeight, eRefPicList,
> pcMbYuv); //pcMbYuv must be TComYuv
> +        }
> +        //m_acYuvPred must be TComYuv
>          xWeightedAverage(&m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0],
> iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred);
>      }
>  }
> @@ -553,15 +608,87 @@
>   * \param bi       Flag indicating whether bipred is used
>   */
>  Void TComPrediction::xPredInterLumaBlk(TComDataCU *cu, TComPicYuv
> *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv
> *&dstPic, Bool bi)
> +{
> +    if(bi == false)
> +    {
> +        assert(bi == false);
> +
> +        Int refStride = refPic->getStride();
> +        Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) *
> refStride;
> +        Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
> +
> +        Int dstStride = dstPic->getStride();
> +        Pel *dst      = dstPic->getLumaAddr(partAddr);
> +
> +        Int xFrac = mv->getHor() & 0x3;
> +        Int yFrac = mv->getVer() & 0x3;
> +
> +        Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac,
> cu->getAddr(), cu->getZorderIdxInCU() + partAddr) + refOffset;
> +        Int srcStride = refPic->getStride();
> +
> +        x265::primitives.cpyblock(width, height, (pixel*)dst, dstStride,
> (pixel*)src, srcStride);
> +    }
> +    else /* For biprediction. will work correctly only when HIGHBITDEPTH
> enabled. Will be removed once bipred is fixed.  */
> +    {
> +        assert(bi == true);
> +
> +        Int refStride = refPic->getStride();
> +        Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) *
> refStride;
> +        Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
> +
> +        Int dstStride = dstPic->getStride();
> +        Short *dst      = (Short*)dstPic->getLumaAddr(partAddr);
> +
> +        Int xFrac = mv->getHor() & 0x3;
> +        Int yFrac = mv->getVer() & 0x3;
> +
> +        Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac,
> cu->getAddr(), cu->getZorderIdxInCU() + partAddr) + refOffset;
> +        Int srcStride = refPic->getStride();
> +
> +        if (yFrac == 0)
> +        {
> +            if(xFrac==0)
> +            {
> +                //filterconvertpeltoshort
> +                x265::primitives.ipfilterConvert_p_s(g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height);
> +            }
> +            else
> +            {
> +                //filterhorizontalpelshort
> +
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY, (pixel*)ref ,
> refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> +            }
> +        }
> +        else if (xFrac == 0)
> +        {
> +            //filterverticalpelshort
> +            x265::primitives.ipFilter_p_s[FILTER_V_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[yFrac]);
> +        }
> +        else
> +        {
> +            Int tmpStride = width;
> +            Int filterSize = NTAPS_LUMA;
> +            Int halfFilterSize = (filterSize >> 1);
> +            Short *tmp    = (Short*)malloc(width * (height + filterSize -
> 1) * sizeof(Short));
> +
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(ref - (halfFilterSize - 1) * refStride) , refStride, tmp,
> tmpStride, width, height + filterSize - 1,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> +            x265::primitives.ipFilter_s_s[FILTER_V_S_S_8](g_bitDepthY,
> tmp + (halfFilterSize - 1) * tmpStride ,tmpStride, dst, dstStride, width,
> height, TComInterpolationFilter::m_lumaFilter[yFrac]);
> +
> +            free(tmp);
> +        }
> +    }
> +}
> +
> +//Motion compensated block for biprediction
> +Void TComPrediction::xPredInterLumaBlk(TComDataCU *cu, TComPicYuv
> *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TShortYUV
> *&dstPic, Bool bi)
>  {
> -    assert(bi == false);
> +    assert(bi == true);
>
>      Int refStride = refPic->getStride();
>      Int refOffset = (mv->getHor() >> 2) + (mv->getVer() >> 2) * refStride;
>      Pel *ref      =  refPic->getLumaAddr(cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
>
>      Int dstStride = dstPic->getStride();
> -    Pel *dst      = dstPic->getLumaAddr(partAddr);
> +    Short *dst      = dstPic->getLumaAddr(partAddr);
>
>      Int xFrac = mv->getHor() & 0x3;
>      Int yFrac = mv->getVer() & 0x3;
> @@ -569,7 +696,36 @@
>      Pel* src = refPic->getLumaFilterBlock(yFrac, xFrac, cu->getAddr(),
> cu->getZorderIdxInCU() + partAddr) + refOffset;
>      Int srcStride = refPic->getStride();
>
> -    x265::primitives.cpyblock(width, height, (pixel*)dst, dstStride,
> (pixel*)src, srcStride);
> +    if (yFrac == 0)
> +    {
> +        if(xFrac==0)
> +        {
> +                //filterconvertpeltoshort
> +            x265::primitives.ipfilterConvert_p_s(g_bitDepthY, (pixel*)ref
> , refStride, dst, dstStride, width, height);
> +        }
> +        else
> +        {
> +            //filterhorizontalpelshort
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> +        }
> +    }
> +    else if (xFrac == 0)
> +    {
> +        //filterverticalpelshort
> +        x265::primitives.ipFilter_p_s[FILTER_V_P_S_8](g_bitDepthY,
> (pixel*)ref , refStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[yFrac]);
> +    }
> +    else
> +    {
> +        Int tmpStride = width;
> +        Int filterSize = NTAPS_LUMA;
> +        Int halfFilterSize = (filterSize >> 1);
> +        Short *tmp    = (Short*)malloc(width * (height + filterSize - 1)
> * sizeof(Short));
> +
> +        x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(ref - (halfFilterSize - 1) * refStride) , refStride, tmp,
> tmpStride, width, height + filterSize - 1,
> TComInterpolationFilter::m_lumaFilter[xFrac]);
> +        x265::primitives.ipFilter_s_s[FILTER_V_S_S_8](g_bitDepthY, tmp +
> (halfFilterSize - 1) * tmpStride ,tmpStride, dst, dstStride, width, height,
> TComInterpolationFilter::m_lumaFilter[yFrac]);
> +
> +        free(tmp);
> +    }
>  }
>
>  /**
> @@ -607,38 +763,152 @@
>      Int filterSize = NTAPS_CHROMA;
>
>      Int halfFilterSize = (filterSize >> 1);
> -
> -    if (yFrac == 0)
> +    if(bi == false)
>      {
> -        if (xFrac == 0)
> +        if (yFrac == 0)
>          {
> -            x265::primitives.cpyblock(cxWidth, cxHeight, (pixel*)dstCb,
> dstStride, (pixel*)refCb, refStride);
> -            x265::primitives.cpyblock(cxWidth, cxHeight, (pixel*)dstCr,
> dstStride, (pixel*)refCr, refStride);
> +            if (xFrac == 0)
> +            {
> +                x265::primitives.cpyblock(cxWidth, cxHeight,
> (pixel*)dstCb, dstStride, (pixel*)refCb, refStride);
> +                x265::primitives.cpyblock(cxWidth, cxHeight,
> (pixel*)dstCr, dstStride, (pixel*)refCr, refStride);
> +            }
> +            else
> +            {
> +                primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> +                primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> +            }
> +        }
> +        else if (xFrac == 0)
> +        {
> +            primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> +            primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
>          }
>          else
>          {
> -            primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> -            primitives.ipFilter_p_p[FILTER_H_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr,  dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[xFrac]);
> +            Int     extStride = cxWidth;
> +            Short*  extY      = (Short*)xMalloc(Short, cxWidth *
> (cxHeight + filterSize - 1));
> +
> +            primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1, m_if.m_chromaFilter[xFrac]);
> +            primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCb, dstStride,
> cxWidth, cxHeight, m_if.m_chromaFilter[yFrac]);
> +
> +            primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1,  m_if.m_chromaFilter[xFrac]);
> +            primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCr, dstStride,
> cxWidth, cxHeight,  m_if.m_chromaFilter[yFrac]);
> +
> +            xFree(extY);
>          }
>      }
> -    else if (xFrac == 0)
> -    {
> -        primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCb, refStride, (pixel*)dstCb, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> -        primitives.ipFilter_p_p[FILTER_V_P_P_4](g_bitDepthC,
> (pixel*)refCr, refStride, (pixel*)dstCr, dstStride, cxWidth, cxHeight,
> m_if.m_chromaFilter[yFrac]);
> +    else  /* For biprediction. will work correctly only when HIGHBITDEPTH
> enabled. Will be removed once bipred is fixed.  */
> +    {
> +        Short* dstCb = (Short*)dstPic->getCbAddr(partAddr);
> +        Short* dstCr = (Short*)dstPic->getCrAddr(partAddr);
> +        if (yFrac == 0)
> +        {
> +            //m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> +            //m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> +            if(xFrac==0)
> +            {
> +                    //filterconvertpeltoshort
> +                x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight);
> +                x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight);
> +            }
> +            else
> +            {
> +                //filterhorizontalpelshort
> +
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC, (pixel*)refCb ,
> refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +
>  x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC, (pixel*)refCr ,
> refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +            }
> +        }
> +        else if (xFrac == 0)
> +        {
> +            //m_if.filterVerChroma(refCb, refStride, dstCb, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> +            //m_if.filterVerChroma(refCr, refStride, dstCr, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> +            x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCb, refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> +            x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCr, refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> +        }
> +        else
> +        {
> +            Int     extStride = cxWidth;
> +            Short*  extY      = (Short*)malloc(cxWidth * (cxHeight +
> filterSize - 1) * sizeof(Short));
> +            //m_if.filterHorChroma(refCb - (halfFilterSize - 1) *
> refStride, refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1,
> xFrac, false);
> +            //m_if.filterVerChroma(extY  + (halfFilterSize - 1) *
> extStride, extStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, false,
> !bi);
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +            x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY,
> extY  + (halfFilterSize - 1) * extStride, extStride, dstCb, dstStride,
> cxWidth, cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> +
> +            //m_if.filterHorChroma(refCr - (halfFilterSize - 1) *
> refStride, refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1,
> xFrac, false);
> +            //m_if.filterVerChroma(extY  + (halfFilterSize - 1) *
> extStride, extStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, false,
> !bi);
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +            x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY,
> extY  + (halfFilterSize - 1) * extStride, extStride, dstCr, dstStride,
> cxWidth, cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> +            free(extY);
> +        }
> +
>      }
> -    else
> -    {
> -        Int     extStride = cxWidth;
> -        Short*  extY      = (Short*)xMalloc(Short, cxWidth * (cxHeight +
> filterSize - 1));
> +}
>
> -        primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1, m_if.m_chromaFilter[xFrac]);
> -        primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCb, dstStride,
> cxWidth, cxHeight, m_if.m_chromaFilter[yFrac]);
> +//Generate motion compensated block when biprediction
> +Void TComPrediction::xPredInterChromaBlk(TComDataCU *cu, TComPicYuv
> *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TShortYUV
> *&dstPic, Bool bi)
> +{
> +    assert (bi==true);
>
> -        primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
> extStride, cxWidth, cxHeight + filterSize - 1,  m_if.m_chromaFilter[xFrac]);
> -        primitives.ipFilter_s_p[FILTER_V_S_P_4](g_bitDepthC, extY +
> (halfFilterSize - 1) * extStride, extStride, (pixel*)dstCr, dstStride,
> cxWidth, cxHeight,  m_if.m_chromaFilter[yFrac]);
> +    Int refStride = refPic->getCStride();
> +    Int dstStride = dstPic->getCStride();
>
> -        xFree(extY);
> -    }
> +    Int refOffset = (mv->getHor() >> 3) + (mv->getVer() >> 3) * refStride;
> +
> +    Pel* refCb = refPic->getCbAddr(cu->getAddr(), cu->getZorderIdxInCU()
> + partAddr) + refOffset;
> +    Pel* refCr = refPic->getCrAddr(cu->getAddr(), cu->getZorderIdxInCU()
> + partAddr) + refOffset;
> +
> +    Short* dstCb = dstPic->getCbAddr(partAddr);
> +    Short* dstCr = dstPic->getCrAddr(partAddr);
> +
> +    Int xFrac = mv->getHor() & 0x7;
> +    Int yFrac = mv->getVer() & 0x7;
> +    UInt cxWidth = width >> 1;
> +    UInt cxHeight = height >> 1;
> +
> +    Int filterSize = NTAPS_CHROMA;
> +
> +    Int halfFilterSize = (filterSize >> 1);
> +
> +    if (yFrac == 0)
> +    {
> +        //m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> +        //m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride,
> cxWidth, cxHeight, xFrac, !bi);
> +        if(xFrac==0)
> +        {
> +            //filterconvertpeltoshort
> +            x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight);
> +            x265::primitives.ipfilterConvert_p_s(g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight);
> +        }
> +        else
> +        {
> +            //filterhorizontalpelshort
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)refCb , refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +            x265::primitives.ipFilter_p_s[FILTER_H_P_S_4](g_bitDepthC,
> (pixel*)refCr , refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +        }
> +    }
> +    else if (xFrac == 0)
> +    {
> +        //m_if.filterVerChroma(refCb, refStride, dstCb, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> +        //m_if.filterVerChroma(refCr, refStride, dstCr, dstStride,
> cxWidth, cxHeight, yFrac, true, !bi);
> +        x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCb, refStride, dstCb, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> +        x265::primitives.ipFilter_p_s[FILTER_V_P_S_4](g_bitDepthC,
> (pixel*)refCr, refStride, dstCr, dstStride, cxWidth, cxHeight,
> TComInterpolationFilter::m_chromaFilter[yFrac]);
> +    }
> +    else
> +    {
> +        Int     extStride = cxWidth;
> +        Short*  extY      = (Short*)malloc(cxWidth * (cxHeight +
> filterSize - 1) * sizeof(Short));
> +        //m_if.filterHorChroma(refCb - (halfFilterSize - 1) * refStride,
> refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1, xFrac,
> false);
> +        //m_if.filterVerChroma(extY  + (halfFilterSize - 1) * extStride,
> extStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, false, !bi);
> +        x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCb - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +        x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY, extY
>  + (halfFilterSize - 1) * extStride, extStride, dstCb, dstStride, cxWidth,
> cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> +
> +        //m_if.filterHorChroma(refCr - (halfFilterSize - 1) * refStride,
> refStride, extY,  extStride, cxWidth, cxHeight + filterSize - 1, xFrac,
> false);
> +        //m_if.filterVerChroma(extY  + (halfFilterSize - 1) * extStride,
> extStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, false, !bi);
> +        x265::primitives.ipFilter_p_s[FILTER_H_P_S_8](g_bitDepthY,
> (pixel*)(refCr - (halfFilterSize - 1) * refStride), refStride, extY,
>  extStride, cxWidth, cxHeight + filterSize - 1,
> TComInterpolationFilter::m_chromaFilter[xFrac]);
> +        x265::primitives.ipFilter_s_s[FILTER_V_S_S_4](g_bitDepthY, extY
>  + (halfFilterSize - 1) * extStride, extStride, dstCr, dstStride, cxWidth,
> cxHeight, TComInterpolationFilter::m_chromaFilter[yFrac]);
> +        free(extY);
> +    }
> +
>  }
>
>  Void TComPrediction::xWeightedAverage(TComYuv* pcYuvSrc0, TComYuv*
> pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth, Int
> iHeight, TComYuv*& rpcYuvDst)
> diff -r 371e9320d819 -r caaf0b1a045c source/Lib/TLibCommon/TComPrediction.h
> --- a/source/Lib/TLibCommon/TComPrediction.h    Fri Jun 21 17:46:23 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComPrediction.h    Fri Jun 21 17:49:50 2013
> +0530
> @@ -81,9 +81,12 @@
>
>      // motion compensation functions
>      Void xPredInterUni(TComDataCU* pcCU,                          UInt
> uiPartAddr,               Int iWidth, Int iHeight, RefPicList eRefPicList,
> TComYuv*& rpcYuvPred, Bool bi = false);
> +    Void xPredInterUni(TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int
> iHeight, RefPicList eRefPicList, TShortYUV*& rpcYuvPred, Bool bi);
>      Void xPredInterBi(TComDataCU* pcCU,                          UInt
> uiPartAddr,               Int iWidth, Int iHeight,
> TComYuv*& rpcYuvPred);
>      Void xPredInterLumaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi);
> +    Void xPredInterLumaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, TComMv *mv, Int width, Int height, TShortYUV *&dstPic, Bool bi);
>      Void xPredInterChromaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi);
> +    Void xPredInterChromaBlk(TComDataCU *cu, TComPicYuv *refPic, UInt
> partAddr, TComMv *mv, Int width, Int height, TShortYUV *&dstPic, Bool bi);
>      Void xWeightedAverage(TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, Int
> iRefIdx0, Int iRefIdx1, UInt uiPartAddr, Int iWidth, Int iHeight, TComYuv*&
> rpcYuvDst);
>
>      Void xGetLLSPrediction(TComPattern* pcPattern, Int* pSrc0, Int
> iSrcStride, Pel* pDst0, Int iDstStride, UInt uiWidth, UInt uiHeight, UInt
> uiExt0);
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> http://mailman.videolan.org/listinfo/x265-devel
>
>


-- 
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20130621/50d63070/attachment-0001.html>


More information about the x265-devel mailing list