# HG changeset patch # User Deepthi Nandakumar <deep...@multicorewareinc.com> # Date 1406028818 -19800 # Tue Jul 22 17:03:38 2014 +0530 # Node ID a5422a41c85ac06fc773f1179e6fbea1a80a5e98 # Parent d8d26a695cf6734ad2180c4694360ef6e71ead81 TComPrediction: save CU data (partAddr, width, height) as member fields
Before motion compensation, save CU related data inside the TComPrediction structure diff -r d8d26a695cf6 -r a5422a41c85a source/Lib/TLibCommon/TComPrediction.cpp --- a/source/Lib/TLibCommon/TComPrediction.cpp Mon Jul 21 16:06:31 2014 +0530 +++ b/source/Lib/TLibCommon/TComPrediction.cpp Tue Jul 22 17:03:38 2014 +0530 @@ -223,18 +223,18 @@ * \param TComDataCU* cu * \param uint32_t PartAddr */ -bool TComPrediction::xCheckIdenticalMotion(TComDataCU* cu, uint32_t partAddr) +bool TComPrediction::xCheckIdenticalMotion(TComDataCU* cu) { X265_CHECK(cu->m_slice->isInterB(), "identical motion check in P frame\n"); if (!cu->m_slice->m_pps->bUseWeightedBiPred) { - int refIdxL0 = cu->getCUMvField(0)->getRefIdx(partAddr); - int refIdxL1 = cu->getCUMvField(1)->getRefIdx(partAddr); + int refIdxL0 = cu->getCUMvField(0)->getRefIdx(m_partAddr); + int refIdxL1 = cu->getCUMvField(1)->getRefIdx(m_partAddr); if (refIdxL0 >= 0 && refIdxL1 >= 0) { int refPOCL0 = cu->m_slice->m_refPOCList[0][refIdxL0]; int refPOCL1 = cu->m_slice->m_refPOCList[1][refIdxL1]; - if (refPOCL0 == refPOCL1 && cu->getCUMvField(0)->getMv(partAddr) == cu->getCUMvField(1)->getMv(partAddr)) + if (refPOCL0 == refPOCL1 && cu->getCUMvField(0)->getMv(m_partAddr) == cu->getCUMvField(1)->getMv(m_partAddr)) return true; } } @@ -243,89 +243,83 @@ void TComPrediction::motionCompensation(TComDataCU* cu, TComYuv* predYuv, int list, int partIdx, bool bLuma, bool bChroma) { - int width; - int height; - uint32_t partAddr; + X265_CHECK(partIdx >= 0, "partidx is not positive\n"); + + if (cu->m_slice->isInterP()) + list = REF_PIC_LIST_0; + if (list != REF_PIC_LIST_X) + { + if (cu->m_slice->m_pps->bUseWeightPred) + { + ShortYuv* shortYuv = &m_predShortYuv[0]; + int refId = cu->getCUMvField(list)->getRefIdx(m_partAddr); + X265_CHECK(refId >= 0, "refidx is not positive\n"); - X265_CHECK(partIdx >= 0, "partidx is not positive\n"); - { - cu->getPartIndexAndSize(partIdx, partAddr, width, height); - if (cu->m_slice->isInterP()) - list = REF_PIC_LIST_0; - if (list != REF_PIC_LIST_X) - { - if (cu->m_slice->m_pps->bUseWeightPred) - { - ShortYuv* shortYuv = &m_predShortYuv[0]; - int refId = cu->getCUMvField(list)->getRefIdx(partAddr); - X265_CHECK(refId >= 0, "refidx is not positive\n"); + MV mv = cu->getCUMvField(list)->getMv(m_partAddr); + cu->clipMv(mv); + if (bLuma) + xPredInterLumaBlk(cu->m_slice->m_refPicList[list][refId]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), + &mv, shortYuv); + if (bChroma) + xPredInterChromaBlk(cu->m_slice->m_refPicList[list][refId]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), + &mv, shortYuv); - MV mv = cu->getCUMvField(list)->getMv(partAddr); - cu->clipMv(mv); - if (bLuma) - xPredInterLumaBlk(cu->m_slice->m_refPicList[list][refId]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, shortYuv); - if (bChroma) - xPredInterChromaBlk(cu->m_slice->m_refPicList[list][refId]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, shortYuv); - - xWeightedPredictionUni(cu, shortYuv, partAddr, width, height, list, predYuv, -1, bLuma, bChroma); - } - else - xPredInterUni(cu, partAddr, width, height, list, predYuv, bLuma, bChroma); + xWeightedPredictionUni(cu, shortYuv, m_partAddr, m_width, m_height, list, predYuv, -1, bLuma, bChroma); } else - { - if (xCheckIdenticalMotion(cu, partAddr)) - xPredInterUni(cu, partAddr, width, height, REF_PIC_LIST_0, predYuv, bLuma, bChroma); - else - xPredInterBi(cu, partAddr, width, height, predYuv, bLuma, bChroma); - } + xPredInterUni(cu, list, predYuv, bLuma, bChroma); + } + else + { + if (xCheckIdenticalMotion(cu)) + xPredInterUni(cu, REF_PIC_LIST_0, predYuv, bLuma, bChroma); + else + xPredInterBi(cu, predYuv, bLuma, bChroma); } } -void TComPrediction::xPredInterUni(TComDataCU* cu, uint32_t partAddr, int width, int height, int list, TComYuv* outPredYuv, bool bLuma, bool bChroma) +void TComPrediction::xPredInterUni(TComDataCU* cu, int list, TComYuv* outPredYuv, bool bLuma, bool bChroma) { - int refIdx = cu->getCUMvField(list)->getRefIdx(partAddr); + int refIdx = cu->getCUMvField(list)->getRefIdx(m_partAddr); X265_CHECK(refIdx >= 0, "refidx is not positive\n"); - MV mv = cu->getCUMvField(list)->getMv(partAddr); + MV mv = cu->getCUMvField(list)->getMv(m_partAddr); cu->clipMv(mv); if (bLuma) xPredInterLumaBlk(cu->m_slice->m_refPicList[list][refIdx]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, outPredYuv); + &mv, outPredYuv); if (bChroma) xPredInterChromaBlk(cu->m_slice->m_refPicList[list][refIdx]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, outPredYuv); + &mv, outPredYuv); } -void TComPrediction::xPredInterUni(TComDataCU* cu, uint32_t partAddr, int width, int height, int list, ShortYuv* outPredYuv, bool bLuma, bool bChroma) +void TComPrediction::xPredInterUni(TComDataCU* cu, int list, ShortYuv* outPredYuv, bool bLuma, bool bChroma) { - int refIdx = cu->getCUMvField(list)->getRefIdx(partAddr); + int refIdx = cu->getCUMvField(list)->getRefIdx(m_partAddr); X265_CHECK(refIdx >= 0, "refidx is not positive\n"); - MV mv = cu->getCUMvField(list)->getMv(partAddr); + MV mv = cu->getCUMvField(list)->getMv(m_partAddr); cu->clipMv(mv); if (bLuma) xPredInterLumaBlk(cu->m_slice->m_refPicList[list][refIdx]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, outPredYuv); + &mv, outPredYuv); if (bChroma) xPredInterChromaBlk(cu->m_slice->m_refPicList[list][refIdx]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), - partAddr, &mv, width, height, outPredYuv); + &mv, outPredYuv); } -void TComPrediction::xPredInterBi(TComDataCU* cu, uint32_t partAddr, int width, int height, TComYuv* outPredYuv, bool bLuma, bool bChroma) +void TComPrediction::xPredInterBi(TComDataCU* cu, TComYuv* outPredYuv, bool bLuma, bool bChroma) { X265_CHECK(cu->m_slice->isInterB(), "biprediction in P frame\n"); int refIdx[2]; - refIdx[0] = cu->getCUMvField(REF_PIC_LIST_0)->getRefIdx(partAddr); - refIdx[1] = cu->getCUMvField(REF_PIC_LIST_1)->getRefIdx(partAddr); + refIdx[0] = cu->getCUMvField(REF_PIC_LIST_0)->getRefIdx(m_partAddr); + refIdx[1] = cu->getCUMvField(REF_PIC_LIST_1)->getRefIdx(m_partAddr); if (refIdx[0] >= 0 && refIdx[1] >= 0) { @@ -333,13 +327,13 @@ { X265_CHECK(refIdx[list] < cu->m_slice->m_numRefIdx[list], "refidx out of range\n"); - xPredInterUni(cu, partAddr, width, height, list, &m_predShortYuv[list], bLuma, bChroma); + xPredInterUni(cu, list, &m_predShortYuv[list], bLuma, bChroma); } if (cu->m_slice->m_pps->bUseWeightedBiPred) - xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1], refIdx[0], refIdx[1], partAddr, width, height, outPredYuv, bLuma, bChroma); + xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1], refIdx[0], refIdx[1], m_partAddr, m_width, m_height, outPredYuv, bLuma, bChroma); else - outPredYuv->addAvg(&m_predShortYuv[0], &m_predShortYuv[1], partAddr, width, height, bLuma, bChroma); + outPredYuv->addAvg(&m_predShortYuv[0], &m_predShortYuv[1], m_partAddr, m_width, m_height, bLuma, bChroma); } else if (cu->m_slice->m_pps->bUseWeightedBiPred) { @@ -349,10 +343,10 @@ X265_CHECK(refIdx[list] < cu->m_slice->m_numRefIdx[list], "refidx out of range\n"); - xPredInterUni(cu, partAddr, width, height, list, &m_predShortYuv[list], bLuma, bChroma); + xPredInterUni(cu, list, &m_predShortYuv[list], bLuma, bChroma); } - xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1], refIdx[0], refIdx[1], partAddr, width, height, outPredYuv, bLuma, bChroma); + xWeightedPredictionBi(cu, &m_predShortYuv[0], &m_predShortYuv[1], refIdx[0], refIdx[1], m_partAddr, m_width, m_height, outPredYuv, bLuma, bChroma); } else if (refIdx[0] >= 0) { @@ -360,7 +354,7 @@ X265_CHECK(refIdx[list] < cu->m_slice->m_numRefIdx[list], "refidx out of range\n"); - xPredInterUni(cu, partAddr, width, height, list, outPredYuv, bLuma, bChroma); + xPredInterUni(cu, list, outPredYuv, bLuma, bChroma); } else { @@ -370,7 +364,7 @@ X265_CHECK(refIdx[list] < cu->m_slice->m_numRefIdx[list], "refidx out of range\n"); - xPredInterUni(cu, partAddr, width, height, list, outPredYuv, bLuma, bChroma); + xPredInterUni(cu, list, outPredYuv, bLuma, bChroma); } } @@ -385,15 +379,15 @@ * \param height Height of block * \param dstPic Pointer to destination picture */ -void TComPrediction::xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, TComYuv *dstPic) +void TComPrediction::xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, TComYuv *dstPic) { int dstStride = dstPic->getStride(); - pixel *dst = dstPic->getLumaAddr(partAddr); + pixel *dst = dstPic->getLumaAddr(m_partAddr); int srcStride = refPic->getStride(); int srcOffset = (mv->x >> 2) + (mv->y >> 2) * srcStride; - int partEnum = partitionFromSizes(width, height); - pixel* src = refPic->getLumaAddr(cuAddr, zOrderIdxinCU + partAddr) + srcOffset; + int partEnum = partitionFromSizes(m_width, m_height); + pixel* src = refPic->getLumaAddr(cuAddr, zOrderIdxinCU + m_partAddr) + srcOffset; int xFrac = mv->x & 0x3; int yFrac = mv->y & 0x3; @@ -412,7 +406,7 @@ } else { - int tmpStride = width; + int tmpStride = m_width; int filterSize = NTAPS_LUMA; int halfFilterSize = (filterSize >> 1); primitives.luma_hps[partEnum](src, srcStride, m_immedVals, tmpStride, xFrac, 1); @@ -421,26 +415,26 @@ } //Motion compensated block for biprediction -void TComPrediction::xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, ShortYuv *dstPic) +void TComPrediction::xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, ShortYuv *dstPic) { int refStride = refPic->getStride(); int refOffset = (mv->x >> 2) + (mv->y >> 2) * refStride; - pixel *ref = refPic->getLumaAddr(cuAddr, zOrderIdxinCU + partAddr) + refOffset; + pixel *ref = refPic->getLumaAddr(cuAddr, zOrderIdxinCU + m_partAddr) + refOffset; int dstStride = dstPic->m_width; - int16_t *dst = dstPic->getLumaAddr(partAddr); + int16_t *dst = dstPic->getLumaAddr(m_partAddr); int xFrac = mv->x & 0x3; int yFrac = mv->y & 0x3; - int partEnum = partitionFromSizes(width, height); + int partEnum = partitionFromSizes(m_width, m_height); - X265_CHECK((width % 4) + (height % 4) == 0, "width or height not divisible by 4\n"); + X265_CHECK((m_width % 4) + (m_height % 4) == 0, "width or height not divisible by 4\n"); X265_CHECK(dstStride == MAX_CU_SIZE, "stride expected to be max cu size\n"); if ((yFrac | xFrac) == 0) { - primitives.luma_p2s(ref, refStride, dst, width, height); + primitives.luma_p2s(ref, refStride, dst, m_width, m_height); } else if (yFrac == 0) { @@ -452,7 +446,7 @@ } else { - int tmpStride = width; + int tmpStride = m_width; int filterSize = NTAPS_LUMA; int halfFilterSize = (filterSize >> 1); primitives.luma_hps[partEnum](ref, refStride, m_immedVals, tmpStride, xFrac, 1); @@ -471,7 +465,7 @@ * \param height Height of block * \param dstPic Pointer to destination picture */ -void TComPrediction::xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, TComYuv *dstPic) +void TComPrediction::xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, TComYuv *dstPic) { int refStride = refPic->getCStride(); int dstStride = dstPic->getCStride(); @@ -481,16 +475,16 @@ int refOffset = (mv->x >> shiftHor) + (mv->y >> shiftVer) * refStride; - pixel* refCb = refPic->getCbAddr(cuAddr, zOrderIdxinCU + partAddr) + refOffset; - pixel* refCr = refPic->getCrAddr(cuAddr, zOrderIdxinCU + partAddr) + refOffset; + pixel* refCb = refPic->getCbAddr(cuAddr, zOrderIdxinCU + m_partAddr) + refOffset; + pixel* refCr = refPic->getCrAddr(cuAddr, zOrderIdxinCU + m_partAddr) + refOffset; - pixel* dstCb = dstPic->getCbAddr(partAddr); - pixel* dstCr = dstPic->getCrAddr(partAddr); + pixel* dstCb = dstPic->getCbAddr(m_partAddr); + pixel* dstCr = dstPic->getCrAddr(m_partAddr); int xFrac = mv->x & ((1 << shiftHor) - 1); int yFrac = mv->y & ((1 << shiftVer) - 1); - int partEnum = partitionFromSizes(width, height); + int partEnum = partitionFromSizes(m_width, m_height); if ((yFrac | xFrac) == 0) { @@ -509,7 +503,7 @@ } else { - int extStride = width >> m_hChromaShift; + int extStride = m_width >> m_hChromaShift; int filterSize = NTAPS_CHROMA; int halfFilterSize = (filterSize >> 1); @@ -522,7 +516,7 @@ } // Generate motion compensated block when biprediction -void TComPrediction::xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, ShortYuv *dstPic) +void TComPrediction::xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, ShortYuv *dstPic) { int refStride = refPic->getCStride(); int dstStride = dstPic->m_cwidth; @@ -532,19 +526,19 @@ int refOffset = (mv->x >> shiftHor) + (mv->y >> shiftVer) * refStride; - pixel* refCb = refPic->getCbAddr(cuAddr, zOrderIdxinCU + partAddr) + refOffset; - pixel* refCr = refPic->getCrAddr(cuAddr, zOrderIdxinCU + partAddr) + refOffset; + pixel* refCb = refPic->getCbAddr(cuAddr, zOrderIdxinCU + m_partAddr) + refOffset; + pixel* refCr = refPic->getCrAddr(cuAddr, zOrderIdxinCU + m_partAddr) + refOffset; - int16_t* dstCb = dstPic->getCbAddr(partAddr); - int16_t* dstCr = dstPic->getCrAddr(partAddr); + int16_t* dstCb = dstPic->getCbAddr(m_partAddr); + int16_t* dstCr = dstPic->getCrAddr(m_partAddr); int xFrac = mv->x & ((1 << shiftHor) - 1); int yFrac = mv->y & ((1 << shiftVer) - 1); - int partEnum = partitionFromSizes(width, height); + int partEnum = partitionFromSizes(m_width, m_height); - uint32_t cxWidth = width >> m_hChromaShift; - uint32_t cxHeight = height >> m_vChromaShift; + uint32_t cxWidth = m_width >> m_hChromaShift; + uint32_t cxHeight = m_height >> m_vChromaShift; X265_CHECK(((cxWidth | cxHeight) % 2) == 0, "chroma block size expected to be multiple of 2\n"); diff -r d8d26a695cf6 -r a5422a41c85a source/Lib/TLibCommon/TComPrediction.h --- a/source/Lib/TLibCommon/TComPrediction.h Mon Jul 21 16:06:31 2014 +0530 +++ b/source/Lib/TLibCommon/TComPrediction.h Tue Jul 22 17:03:38 2014 +0530 @@ -73,19 +73,26 @@ int m_vChromaShift; int m_csp; + /* CU information for prediction */ + int m_width; + int m_height; + uint32_t m_partAddr; + + /* ME information for prediction */ + // motion compensation functions - void xPredInterUni(TComDataCU* cu, uint32_t partAddr, int width, int height, int picList, TComYuv* outPredYuv, bool bLuma, bool bChroma); - void xPredInterUni(TComDataCU* cu, uint32_t partAddr, int width, int height, int picList, ShortYuv* outPredYuv, bool bLuma, bool bChroma); - void xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, TComYuv *dstPic); - void xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, ShortYuv *dstPic); - void xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, TComYuv *dstPic); - void xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, uint32_t partAddr, MV *mv, int width, int height, ShortYuv *dstPic); + void xPredInterUni(TComDataCU *cu, int picList, TComYuv* outPredYuv, bool bLuma, bool bChroma); + void xPredInterUni(TComDataCU *cu, int picList, ShortYuv* outPredYuv, bool bLuma, bool bChroma); + void xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, TComYuv *dstPic); + void xPredInterLumaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, ShortYuv *dstPic); + void xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, TComYuv *dstPic); + void xPredInterChromaBlk(TComPicYuv *refPic, uint32_t cuAddr, uint32_t zOrderIdxinCU, MV *mv, ShortYuv *dstPic); - void xPredInterBi(TComDataCU* cu, uint32_t partAddr, int width, int height, TComYuv* outPredYuv, bool bLuma, bool bChroma); + void xPredInterBi(TComDataCU* cu, TComYuv* outPredYuv, bool bLuma, bool bChroma); void xGetLLSPrediction(TComPattern* pcPattern, int* src0, int srcstride, pixel* dst0, int dststride, uint32_t width, uint32_t height, uint32_t ext0); - bool xCheckIdenticalMotion(TComDataCU* cu, uint32_t PartAddr); + bool xCheckIdenticalMotion(TComDataCU* cu); public: diff -r d8d26a695cf6 -r a5422a41c85a source/Lib/TLibEncoder/TEncSearch.cpp --- a/source/Lib/TLibEncoder/TEncSearch.cpp Mon Jul 21 16:06:31 2014 +0530 +++ b/source/Lib/TLibEncoder/TEncSearch.cpp Tue Jul 22 17:03:38 2014 +0530 @@ -1911,6 +1911,11 @@ uint32_t partAddr; int roiWidth, roiHeight; cu->getPartIndexAndSize(partIdx, partAddr, roiWidth, roiHeight); + + /* Prediction data for each partition */ + m_partAddr = partAddr; + m_width = roiWidth; + m_height = roiHeight; pixel* pu = fenc->getLumaAddr(cu->getAddr(), cu->getZorderIdxInCU() + partAddr); m_me.setSourcePU(pu - fenc->getLumaAddr(), roiWidth, roiHeight); @@ -1979,7 +1984,7 @@ // TODO: skip mvCand if Y is > merange and -FN>1 cu->clipMv(mvCand); - xPredInterLumaBlk(cu->m_slice->m_refPicList[l][ref]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), partAddr, &mvCand, roiWidth, roiHeight, &m_predTempYuv); + xPredInterLumaBlk(cu->m_slice->m_refPicList[l][ref]->getPicYuvRec(), cu->getAddr(), cu->getZorderIdxInCU(), &mvCand, &m_predTempYuv); uint32_t cost = m_me.bufSAD(m_predTempYuv.getLumaAddr(partAddr), m_predTempYuv.getStride()); cost = m_rdCost.calcRdSADCost(cost, MVP_IDX_BITS); @@ -2026,8 +2031,8 @@ // Generate reference subpels TComPicYuv *refPic0 = cu->m_slice->m_refPicList[0][list[0].ref]->getPicYuvRec(); TComPicYuv *refPic1 = cu->m_slice->m_refPicList[1][list[1].ref]->getPicYuvRec(); - xPredInterLumaBlk(refPic0, cu->getAddr(), cu->getZorderIdxInCU(), partAddr, &list[0].mv, roiWidth, roiHeight, &m_predYuv[0]); - xPredInterLumaBlk(refPic1, cu->getAddr(), cu->getZorderIdxInCU(), partAddr, &list[1].mv, roiWidth, roiHeight, &m_predYuv[1]); + xPredInterLumaBlk(refPic0, cu->getAddr(), cu->getZorderIdxInCU(), &list[0].mv, &m_predYuv[0]); + xPredInterLumaBlk(refPic1, cu->getAddr(), cu->getZorderIdxInCU(), &list[1].mv, &m_predYuv[1]); pixel *pred0 = m_predYuv[0].getLumaAddr(partAddr); pixel *pred1 = m_predYuv[1].getLumaAddr(partAddr); diff -r d8d26a695cf6 -r a5422a41c85a source/encoder/analysis.cpp --- a/source/encoder/analysis.cpp Mon Jul 21 16:06:31 2014 +0530 +++ b/source/encoder/analysis.cpp Tue Jul 22 17:03:38 2014 +0530 @@ -683,7 +683,10 @@ // calculate the motion compensation for chroma for the best mode selected int numPart = outBestCU->getNumPartInter(); for (int partIdx = 0; partIdx < numPart; partIdx++) + { + outBestCU->getPartIndexAndSize(partIdx, m_partAddr, m_width, m_height); motionCompensation(outBestCU, m_bestPredYuv[depth], REF_PIC_LIST_X, partIdx, false, true); + } encodeResAndCalcRdInterCU(outBestCU, m_origYuv[depth], m_bestPredYuv[depth], m_tmpResiYuv[depth], m_bestResiYuv[depth], m_bestRecoYuv[depth], false, true); @@ -753,7 +756,10 @@ { int numPart = outBestCU->getNumPartInter(); for (int partIdx = 0; partIdx < numPart; partIdx++) + { + outBestCU->getPartIndexAndSize(partIdx, m_partAddr, m_width, m_height); motionCompensation(outBestCU, m_bestPredYuv[depth], REF_PIC_LIST_X, partIdx, false, true); + } encodeResAndCalcRdInterCU(outBestCU, m_origYuv[depth], m_bestPredYuv[depth], m_tmpResiYuv[depth], m_bestResiYuv[depth], m_bestRecoYuv[depth], false, true); @@ -775,7 +781,10 @@ { int numPart = outBestCU->getNumPartInter(); for (int partIdx = 0; partIdx < numPart; partIdx++) + { + outBestCU->getPartIndexAndSize(partIdx, m_partAddr, m_width, m_height); motionCompensation(outBestCU, m_bestPredYuv[depth], REF_PIC_LIST_X, partIdx, false, true); + } m_tmpResiYuv[depth]->subtract(m_origYuv[depth], m_bestPredYuv[depth], outBestCU->getLog2CUSize(0)); generateCoeffRecon(outBestCU, m_origYuv[depth], m_bestPredYuv[depth], m_tmpResiYuv[depth], m_bestRecoYuv[depth], false); @@ -789,7 +798,10 @@ { int numPart = outBestCU->getNumPartInter(); for (int partIdx = 0; partIdx < numPart; partIdx++) + { + outBestCU->getPartIndexAndSize(partIdx, m_partAddr, m_width, m_height); motionCompensation(outBestCU, m_bestPredYuv[depth], REF_PIC_LIST_X, partIdx, false, true); + } } } } @@ -1381,6 +1393,8 @@ outTempCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField(mvFieldNeighbours[mergeCand][1], SIZE_2Nx2N, 0, 0); // interprets depth relative to rpcTempCU level // do MC only for Luma part + /* Set CU parameters for motion compensation */ + outTempCU->getPartIndexAndSize(0, m_partAddr, m_width, m_height); motionCompensation(outTempCU, m_tmpPredYuv[depth], REF_PIC_LIST_X, 0, true, false); uint32_t bitsCand = getTUBits(mergeCand, maxNumMergeCand); outTempCU->m_totalBits = bitsCand; @@ -1418,7 +1432,10 @@ //calculate the motion compensation for chroma for the best mode selected int numPart = outBestCU->getNumPartInter(); for (int partIdx = 0; partIdx < numPart; partIdx++) + { + outBestCU->getPartIndexAndSize(partIdx, m_partAddr, m_width, m_height); motionCompensation(outBestCU, bestPredYuv, REF_PIC_LIST_X, partIdx, false, true); + } if (outTempCU->isLosslessCoded(0)) outBestCU->m_totalRDCost = MAX_INT64; @@ -1490,6 +1507,7 @@ outTempCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField(mvFieldNeighbours[mergeCand][1], SIZE_2Nx2N, 0, 0); // interprets depth relative to outTempCU level // do MC + outTempCU->getPartIndexAndSize(0, m_partAddr, m_width, m_height); motionCompensation(outTempCU, m_tmpPredYuv[depth], REF_PIC_LIST_X, 0); // estimate residual and encode everything encodeResAndCalcRdInterCU(outTempCU, _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel