[x265] [PATCH] use MV from analysis-save encode as MVP in load mode for refine-inter levels

2018-03-05 Thread bhavna
# 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

Re: [x265] [PATCH] use MV from analysis-save encode as MVP in load mode for refine-inter levels

2018-03-05 Thread Ashok Kumar Mishra
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(