Re: [x265] [PATCH] use MV from analysis-save encode as MVP in load mode for refine-inter levels
On Mon, Mar 5, 2018 at 3:27 PM, wrote: > # HG changeset patch > # User Santhoshini Sekar > # 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.cppWed Feb 28 11:09:18 2018 +0530 > +++ b/source/encoder/encoder.cppThu 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(
[x265] [PATCH] use MV from analysis-save encode as MVP in load mode for refine-inter levels
# HG changeset patch # User Santhoshini Sekar # 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.cppWed Feb 28 11:09:18 2018 +0530 +++ b/source/encoder/encoder.cppThu 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 bC