On Mon, Mar 5, 2018 at 3:27 PM, <bha...@multicorewareinc.com> wrote: > # HG changeset patch > # User Santhoshini Sekar <santhosh...@multicorewareinc.com> > # Date 1516860441 -19800 > # Thu Jan 25 11:37:21 2018 +0530 > # Node ID a12d4abf477016158397064730afa160a067c3e9 > # Parent 55eb3992299530de882829de0d3c0fea6d58b70d > use MV from analysis-save encode as MVP in load mode for refine-inter > levels > > diff -r 55eb39922995 -r a12d4abf4770 source/encoder/analysis.cpp > --- a/source/encoder/analysis.cpp Wed Feb 28 11:09:18 2018 +0530 > +++ b/source/encoder/analysis.cpp Thu Jan 25 11:37:21 2018 +0530 > @@ -2455,7 +2455,7 @@ > } > if (!mode.cu.m_mergeFlag[pu.puAbsPartIdx]) > { > - if (m_param->mvRefine) > + if (m_param->mvRefine || m_param->interRefine == > 1) > m_me.setSourcePU(*mode.fencYuv, pu.ctuAddr, > pu.cuAbsPartIdx, pu.puAbsPartIdx, pu.width, pu.height, > m_param->searchMethod, m_param->subpelRefine, false); > //AMVP > MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 2]; > @@ -2465,15 +2465,20 @@ > int ref = mode.cu.m_refIdx[list][pu. > puAbsPartIdx]; > if (ref == -1) > continue; > - mode.cu.getPMV(mode.interNeighbours, list, > ref, mode.amvpCand[list][ref], mvc); > - MV mvp = mode.amvpCand[list][ref][mode. > cu.m_mvpIdx[list][pu.puAbsPartIdx]]; > - if (m_param->mvRefine) > + MV mvp; > + > + int numMvc = mode.cu.getPMV(mode.interNeighbours, > list, ref, mode.amvpCand[list][ref], mvc); > + if (m_param->interRefine != 1) > + mvp = mode.amvpCand[list][ref][mode. > cu.m_mvpIdx[list][pu.puAbsPartIdx]]; > + else > + mvp = interDataCTU->mv[list][cuIdx + > part]; > + if (m_param->mvRefine || m_param->interRefine > == 1) > { > MV outmv; > - searchMV(mode, pu, list, ref, outmv); > + searchMV(mode, pu, list, ref, outmv, mvp, > numMvc, mvc); > mode.cu.setPUMv(list, outmv, > pu.puAbsPartIdx, part); > } > - mode.cu.m_mvd[list][pu.puAbsPartIdx] = > mode.cu.m_mv[list][pu.puAbsPartIdx] - mvp; > + mode.cu.m_mvd[list][pu.puAbsPartIdx] = > mode.cu.m_mv[list][pu.puAbsPartIdx] - mode.amvpCand[list][ref][mode. > cu.m_mvpIdx[list][pu.puAbsPartIdx]]/*mvp*/; > } > } > else if(m_param->scaleFactor) > diff -r 55eb39922995 -r a12d4abf4770 source/encoder/encoder.cpp > --- a/source/encoder/encoder.cpp Wed Feb 28 11:09:18 2018 +0530 > +++ b/source/encoder/encoder.cpp Thu Jan 25 11:37:21 2018 +0530 > @@ -3096,9 +3096,8 @@ > if (m_param->analysisReuseLevel > 4) > { > CHECKED_MALLOC(interData->partSize, uint8_t, > analysis->numPartitions * analysis->numCUsInFrame); > - CHECKED_MALLOC(interData->mergeFlag, uint8_t, > analysis->numPartitions * analysis->numCUsInFrame); > + CHECKED_MALLOC_ZERO(interData->mergeFlag, uint8_t, > analysis->numPartitions * analysis->numCUsInFrame); > } > - > if (m_param->analysisReuseLevel >= 7) > { > CHECKED_MALLOC(interData->interDir, uint8_t, > analysis->numPartitions * analysis->numCUsInFrame); > diff -r 55eb39922995 -r a12d4abf4770 source/encoder/search.cpp > --- a/source/encoder/search.cpp Wed Feb 28 11:09:18 2018 +0530 > +++ b/source/encoder/search.cpp Thu Jan 25 11:37:21 2018 +0530 > @@ -2107,18 +2107,24 @@ > bestME[list].mvCost = mvCost; > } > } > - > -void Search::searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv) > +void Search::searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc) > { > CUData& cu = interMode.cu; > const Slice *slice = m_slice; > - MV mv = cu.m_mv[list][pu.puAbsPartIdx]; > + MV mv; > + if (m_param->interRefine == 1) > + mv = mvp; > + else > + mv = cu.m_mv[list][pu.puAbsPartIdx]; > cu.clipMv(mv); > MV mvmin, mvmax; > setSearchRange(cu, mv, m_param->searchRange, mvmin, mvmax); > - m_me.refineMV(&slice->m_mref[list][ref], mvmin, mvmax, mv, outmv); > + if (m_param->interRefine == 1) > + m_me.motionEstimate(&m_slice->m_mref[list][ref], mvmin, mvmax, > mv, numMvc, mvc, m_param->searchRange, outmv, m_param->maxSlices, > + m_param->bSourceReferenceEstimation ? > m_slice->m_refFrameList[list][ref]->m_fencPic->getLumaAddr(0) : 0); > + else > + m_me.refineMV(&slice->m_mref[list][ref], mvmin, mvmax, mv, > outmv); > } > - > /* find the best inter prediction for each PU of specified mode */ > void Search::predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool > bChromaMC, uint32_t refMasks[2]) > { > @@ -2138,20 +2144,29 @@ > int totalmebits = 0; > MV mvzero(0, 0); > Yuv& tmpPredYuv = m_rqt[cuGeom.depth].tmpPredYuv; > - > MergeData merge; > memset(&merge, 0, sizeof(merge)); > - > + bool useAsMVP = false; > for (int puIdx = 0; puIdx < numPart; puIdx++) > { > MotionData* bestME = interMode.bestME[puIdx]; > PredictionUnit pu(cu, cuGeom, puIdx); > - > m_me.setSourcePU(*interMode.fencYuv, pu.ctuAddr, > pu.cuAbsPartIdx, pu.puAbsPartIdx, pu.width, pu.height, > m_param->searchMethod, m_param->subpelRefine, bChromaMC); > - > + useAsMVP = false; > + analysis_inter_data* interDataCTU = NULL; > + int cuIdx; > + cuIdx = (interMode.cu.m_cuAddr * m_param->num4x4Partitions) + > cuGeom.absPartIdx; > + if (m_param->analysisReuseLevel == 10 && m_param->interRefine > 1) > + { > + interDataCTU = (analysis_inter_data*)m_frame- > >m_analysisData.interData; > + if ((cu.m_predMode[pu.puAbsPartIdx] == > interDataCTU->modes[cuIdx + pu.puAbsPartIdx]) > + && (cu.m_partSize[pu.puAbsPartIdx] == > interDataCTU->partSize[cuIdx + pu.puAbsPartIdx]) > + && !(interDataCTU->mergeFlag[cuIdx + puIdx]) > + && (cu.m_cuDepth[0] == interDataCTU->depth[cuIdx])) > + useAsMVP = true; > + } > /* find best cost merge candidate. note: 2Nx2N merge and bidir > are handled as separate modes */ > uint32_t mrgCost = numPart == 1 ? MAX_UINT : mergeEstimation(cu, > cuGeom, pu, puIdx, merge); > - > bestME[0].cost = MAX_UINT; > bestME[1].cost = MAX_UINT; > > @@ -2159,26 +2174,37 @@ > bool bDoUnidir = true; > > cu.getNeighbourMV(puIdx, pu.puAbsPartIdx, > interMode.interNeighbours); > - > /* Uni-directional prediction */ > if ((m_param->analysisLoad && m_param->analysisReuseLevel > 1 && > m_param->analysisReuseLevel != 10) > - || (m_param->analysisMultiPassRefine && > m_param->rc.bStatRead) || (m_param->bMVType == AVC_INFO)) > + || (m_param->analysisMultiPassRefine && > m_param->rc.bStatRead) || (m_param->bMVType == AVC_INFO) || (useAsMVP)) > { > for (int list = 0; list < numPredDir; list++) > { > - int ref = bestME[list].ref; > + > + int ref = -1; > + if (useAsMVP) > + ref = interDataCTU->refIdx[list][cuIdx + puIdx]; > + > + else > + ref = bestME[list].ref; > if (ref < 0) > + { > continue; > - > + } > uint32_t bits = m_listSelBits[list] + MVP_IDX_BITS; > bits += getTUBits(ref, numRefIdx[list]); > > int numMvc = cu.getPMV(interMode.interNeighbours, list, > ref, interMode.amvpCand[list][ref], mvc); > - > const MV* amvp = interMode.amvpCand[list][ref]; > int mvpIdx = selectMVP(cu, pu, amvp, list, ref); > - MV mvmin, mvmax, outmv, mvp = amvp[mvpIdx]; > - > + MV mvmin, mvmax, outmv, mvp; > + if (useAsMVP) > + { > + mvp = interDataCTU->mv[list][cuIdx + puIdx]; > + mvpIdx = interDataCTU->mvpIdx[list][cuIdx + puIdx]; > + } > + else > + mvp = amvp[mvpIdx]; > if (m_param->searchMethod == X265_SEA) > { > int puX = puIdx & 1; > @@ -2198,9 +2224,8 @@ > bits += m_me.bitcost(outmv); > uint32_t mvCost = m_me.mvcost(outmv); > uint32_t cost = (satdCost - mvCost) + > m_rdCost.getCost(bits); > - > /* Refine MVP selection, updates: mvpIdx, bits, cost */ > - if (!m_param->analysisMultiPassRefine) > + if (!(m_param->analysisMultiPassRefine || useAsMVP)) > mvp = checkBestMVP(amvp, outmv, mvpIdx, bits, cost); > else > { > @@ -2225,6 +2250,7 @@ > bestME[list].cost = cost; > bestME[list].bits = bits; > bestME[list].mvCost = mvCost; > + bestME[list].ref = ref; > } > bDoUnidir = false; > } > diff -r 55eb39922995 -r a12d4abf4770 source/encoder/search.h > --- a/source/encoder/search.h Wed Feb 28 11:09:18 2018 +0530 > +++ b/source/encoder/search.h Thu Jan 25 11:37:21 2018 +0530 > @@ -310,8 +310,7 @@ > > // estimation inter prediction (non-skip) > void predInterSearch(Mode& interMode, const CUGeom& cuGeom, bool > bChromaMC, uint32_t masks[2]); > - > - void searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv); > + void searchMV(Mode& interMode, const PredictionUnit& pu, int > list, int ref, MV& outmv, MV mvp, int numMvc, MV* mvc); > // encode residual and compute rd-cost for inter mode > void encodeResAndCalcRdInterCU(Mode& interMode, const CUGeom& > cuGeom); > void encodeResAndCalcRdSkipCU(Mode& interMode); > > _______________________________________________ > x265-devel mailing list > x265-devel@videolan.org > https://mailman.videolan.org/listinfo/x265-devel > >
Pushed.
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel