[x265] [PATCH x265] dynamic-refine: remove refine-inter level 0 from dynamic refinement

Ashok Kumar Mishra ashok at multicorewareinc.com
Mon Apr 2 13:17:12 CEST 2018


On Fri, Mar 30, 2018 at 5:27 PM, <bhavna at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Bhavna Hariharan <bhavna at multicorewareinc.com>
> # Date 1522408458 -19800
> #      Fri Mar 30 16:44:18 2018 +0530
> # Node ID 77d9a3c77e624cf593093c0c2176d155a0ccce68
> # Parent  ae72210ad6e846062572ef8a02970b74052c2f1c
> dynamic-refine: remove refine-inter level 0 from dynamic refinement.
>
> refine-inter 0 is no longer supported when scale factor is enabled.
> Hence, dynamic-refine is also modified such that the algorithm switches
> between
> inter-refine levels 1 and 3.
>
> diff -r ae72210ad6e8 -r 77d9a3c77e62 source/encoder/analysis.cpp
> --- a/source/encoder/analysis.cpp       Fri Mar 30 16:40:10 2018 +0530
> +++ b/source/encoder/analysis.cpp       Fri Mar 30 16:44:18 2018 +0530
> @@ -2419,7 +2419,7 @@
>      if (!m_param->bDynamicRefine)
>          m_refineLevel = m_param->interRefine;
>      else
> -        m_refineLevel = m_frame->m_classifyFrame ? 0 : 3;
> +        m_refineLevel = m_frame->m_classifyFrame ? 1 : 3;
>
>      int split = (m_refineLevel && cuGeom.log2CUSize ==
> (uint32_t)(g_log2Size[m_param->minCUSize] + 1) && bDecidedDepth);
>      td.split = split;
> @@ -2638,11 +2638,11 @@
>          uint64_t diffRefine[X265_REFINE_INTER_LEVELS];
>          uint64_t diffRefineRd[X265_REFINE_INTER_LEVELS];
>          float probRefine[X265_REFINE_INTER_LEVELS] = { 0 };
> -        uint8_t varRefineLevel = 0;
> -        uint8_t rdRefineLevel = 0;
> +        uint8_t varRefineLevel = 1;
> +        uint8_t rdRefineLevel = 1;
>          uint64_t cuCost = bestMode.rdCost;
>
> -        int offset = (depth * X265_REFINE_INTER_LEVELS) + 1;
> +        int offset = (depth * X265_REFINE_INTER_LEVELS);
>          if (cuCost < m_frame->m_classifyRd[offset])
>              m_refineLevel = 1;
>          else
> @@ -2669,10 +2669,11 @@
>                  P(c) is the prior probability of class.
>                  P(x|c) is the likelihood which is the probability of
> predictor given class.
>                  P(x) is the prior probability of predictor.*/
> -                if ((diffRefine[i] * probRefine[m_refineLevel]) <
> (diffRefine[m_refineLevel] * probRefine[i]))
> -                    varRefineLevel = i;
> -                if ((diffRefineRd[i] * probRefine[m_refineLevel]) <
> (diffRefineRd[m_refineLevel] * probRefine[i]))
> -                    rdRefineLevel = i;
> +                int curRefineLevel = m_refineLevel - 1;
> +                if ((diffRefine[i] * probRefine[curRefineLevel]) <
> (diffRefine[curRefineLevel] * probRefine[i]))
> +                    varRefineLevel = i + 1;
> +                if ((diffRefineRd[i] * probRefine[curRefineLevel]) <
> (diffRefineRd[curRefineLevel] * probRefine[i]))
> +                    rdRefineLevel = i + 1;
>              }
>              m_refineLevel = X265_MAX(varRefineLevel, rdRefineLevel);
>          }
> @@ -2682,13 +2683,19 @@
>  void Analysis::trainCU(const CUData& ctu, const CUGeom& cuGeom, const
> Mode& bestMode, TrainingData& trainData)
>  {
>      uint32_t depth = cuGeom.depth;
> -    int classify = 0;
> +    int classify = 1;
>      if (!m_frame->m_classifyFrame)
>      {
> -        if (trainData.predMode == ctu.m_predMode[cuGeom.absPartIdx] &&
> trainData.partSize == ctu.m_partSize[cuGeom.absPartIdx]
> -            && trainData.mergeFlag == ctu.m_mergeFlag[cuGeom.absPartIdx])
> -            classify = 0;
> -        else if ((depth == m_param->maxCUDepth - 1) && trainData.split)
> +        /* classify = 1 : CUs for which the save data matches with that
> after encoding with refine-inter 3
> +                          and CUs that has split.
> +           classify = 2 : CUs which are encoded as simple modes
> (Skip/Merge/2Nx2N).
> +           classify = 3 : CUs encoded as any other mode. */
> +
> +        bool refineInter0 = (trainData.predMode == ctu.m_predMode[cuGeom.absPartIdx]
> &&
> +            trainData.partSize == ctu.m_partSize[cuGeom.absPartIdx] &&
> +            trainData.mergeFlag == ctu.m_mergeFlag[cuGeom.absPartIdx]);
> +        bool refineInter1 = (depth == m_param->maxCUDepth - 1) &&
> trainData.split;
> +        if (refineInter0 || refineInter1)
>              classify = 1;
>          else if (trainData.partSize == SIZE_2Nx2N && trainData.partSize
> == ctu.m_partSize[cuGeom.absPartIdx])
>              classify = 2;
> @@ -2698,7 +2705,7 @@
>      else
>          classify = m_refineLevel;
>      uint64_t cuCost = bestMode.rdCost;
> -    int offset = (depth * X265_REFINE_INTER_LEVELS) + classify;
> +    int offset = (depth * X265_REFINE_INTER_LEVELS) + classify - 1;
>      ctu.m_collectCURd[offset] += cuCost;
>      ctu.m_collectCUVariance[offset] += trainData.cuVariance;
>      ctu.m_collectCUCount[offset]++;
> diff -r ae72210ad6e8 -r 77d9a3c77e62 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Fri Mar 30 16:40:10 2018 +0530
> +++ b/source/encoder/encoder.cpp        Fri Mar 30 16:44:18 2018 +0530
> @@ -2722,7 +2722,7 @@
>          }
>      }
>
> -    if (p->scaleFactor && p->analysisLoad && !p->interRefine)
> +    if (p->scaleFactor && p->analysisLoad && !p->interRefine &&
> !p->bDynamicRefine)
>      {
>          x265_log(p, X265_LOG_WARNING, "Inter refinement 0 is not
> supported with scaling. Enabling refine-inter 1.\n");
>          p->interRefine = 1;
> diff -r ae72210ad6e8 -r 77d9a3c77e62 source/x265.h
> --- a/source/x265.h     Fri Mar 30 16:40:10 2018 +0530
> +++ b/source/x265.h     Fri Mar 30 16:44:18 2018 +0530
> @@ -466,7 +466,7 @@
>
>  #define x265_ADAPT_RD_STRENGTH   4
>
> -#define X265_REFINE_INTER_LEVELS 4
> +#define X265_REFINE_INTER_LEVELS 3
>
>  /* NOTE! For this release only X265_CSP_I420 and X265_CSP_I444 are
> supported */
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
Pushed.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180402/9496c3ac/attachment.html>


More information about the x265-devel mailing list