[x265] [PATCH] stats: average residual energy after motion prediction per frame

Divya Manivannan divya at multicorewareinc.com
Fri Aug 7 08:46:15 CEST 2015


Thanks. resEnergy and lumaDistortion should be in uint64_t for main12.
Eventhough both are in uint64_t, it will fail in main12 because sse
function returns integer data type. So, I will fix the sse function in the
follow up patch.

On Thu, Aug 6, 2015 at 9:42 PM, Steve Borho <steve at borho.org> wrote:

> On 08/06, Divya Manivannan wrote:
> > # HG changeset patch
> > # User Divya Manivannan <divya at multicorewareinc.com>
> > # Date 1438844729 -19800
> > #      Thu Aug 06 12:35:29 2015 +0530
> > # Node ID 1ef3394a866a79dc9735ed61fe37f4a8c55b7a64
> > # Parent  377a996a8d74110f838ff2e3cef1c42781d6d730
> > stats: average residual energy after motion prediction per frame
> >
> > diff -r 377a996a8d74 -r 1ef3394a866a source/CMakeLists.txt
> > --- a/source/CMakeLists.txt   Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/CMakeLists.txt   Thu Aug 06 12:35:29 2015 +0530
> > @@ -30,7 +30,7 @@
> >  mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
> >
> >  # X265_BUILD must be incremented each time the public API is changed
> > -set(X265_BUILD 68)
> > +set(X265_BUILD 69)
> >  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
> >                 "${PROJECT_BINARY_DIR}/x265.def")
> >  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> > diff -r 377a996a8d74 -r 1ef3394a866a source/common/framedata.h
> > --- a/source/common/framedata.h       Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/common/framedata.h       Thu Aug 06 12:35:29 2015 +0530
> > @@ -55,6 +55,7 @@
> >      double      avgLumaDistortion;
> >      double      avgChromaDistortion;
> >      double      avgPsyEnergy;
> > +    double      avgResEnergy;
> >      double      avgLumaLevel;
> >      double      lumaLevel;
> >      double      percentIntraNxN;
> > @@ -69,6 +70,7 @@
> >      uint64_t    lumaDistortion;
> >      uint64_t    chromaDistortion;
> >      uint64_t    psyEnergy;
> > +    uint64_t    resEnergy;
> >      uint64_t    cntSkipCu[NUM_CU_DEPTH];
> >      uint64_t    cntMergeCu[NUM_CU_DEPTH];
> >      uint64_t    cntInter[NUM_CU_DEPTH];
> > diff -r 377a996a8d74 -r 1ef3394a866a source/encoder/encoder.cpp
> > --- a/source/encoder/encoder.cpp      Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/encoder/encoder.cpp      Thu Aug 06 12:35:29 2015 +0530
> > @@ -1168,6 +1168,7 @@
> >          frameStats->avgChromaDistortion     =
> curFrame->m_encData->m_frameStats.avgChromaDistortion;
> >          frameStats->avgLumaDistortion       =
> curFrame->m_encData->m_frameStats.avgLumaDistortion;
> >          frameStats->avgPsyEnergy            =
> curFrame->m_encData->m_frameStats.avgPsyEnergy;
> > +        frameStats->avgResEnergy            =
> curFrame->m_encData->m_frameStats.avgResEnergy;
> >          frameStats->avgLumaLevel            =
> curFrame->m_encData->m_frameStats.avgLumaLevel;
> >          frameStats->maxLumaLevel            =
> curFrame->m_encData->m_frameStats.maxLumaLevel;
> >          for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
> > diff -r 377a996a8d74 -r 1ef3394a866a source/encoder/frameencoder.cpp
> > --- a/source/encoder/frameencoder.cpp Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/encoder/frameencoder.cpp Thu Aug 06 12:35:29 2015 +0530
> > @@ -591,6 +591,7 @@
> >          m_frame->m_encData->m_frameStats.lumaDistortion   +=
> m_rows[i].rowStats.lumaDistortion;
> >          m_frame->m_encData->m_frameStats.chromaDistortion +=
> m_rows[i].rowStats.chromaDistortion;
> >          m_frame->m_encData->m_frameStats.psyEnergy        +=
> m_rows[i].rowStats.psyEnergy;
> > +        m_frame->m_encData->m_frameStats.resEnergy        +=
> m_rows[i].rowStats.resEnergy;
> >          m_frame->m_encData->m_frameStats.lumaLevel        +=
> m_rows[i].rowStats.lumaLevel;
> >
> >          if (m_rows[i].rowStats.maxLumaLevel >
> m_frame->m_encData->m_frameStats.maxLumaLevel)
> > @@ -608,6 +609,7 @@
> >      m_frame->m_encData->m_frameStats.avgLumaDistortion   =
> (double)(m_frame->m_encData->m_frameStats.lumaDistortion /
> m_frame->m_encData->m_frameStats.totalCtu);
> >      m_frame->m_encData->m_frameStats.avgChromaDistortion =
> (double)(m_frame->m_encData->m_frameStats.chromaDistortion /
> m_frame->m_encData->m_frameStats.totalCtu);
> >      m_frame->m_encData->m_frameStats.avgPsyEnergy        =
> (double)(m_frame->m_encData->m_frameStats.psyEnergy /
> m_frame->m_encData->m_frameStats.totalCtu);
> > +    m_frame->m_encData->m_frameStats.avgResEnergy        =
> (double)(m_frame->m_encData->m_frameStats.resEnergy /
> m_frame->m_encData->m_frameStats.totalCtu);
> >      m_frame->m_encData->m_frameStats.avgLumaLevel        =
> (double)(m_frame->m_encData->m_frameStats.lumaLevel /
> m_frame->m_encData->m_frameStats.totalCtu);
> >      m_frame->m_encData->m_frameStats.percentIntraNxN     =
> (double)(m_frame->m_encData->m_frameStats.cntIntraNxN * 100) /
> m_frame->m_encData->m_frameStats.totalCu;
> >      for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
> > @@ -977,6 +979,7 @@
> >          curRow.rowStats.lumaDistortion   += best.lumaDistortion;
> >          curRow.rowStats.chromaDistortion += best.chromaDistortion;
> >          curRow.rowStats.psyEnergy        += best.psyEnergy;
> > +        curRow.rowStats.resEnergy        += best.resEnergy;
> >          curRow.rowStats.cntIntraNxN      += frameLog.cntIntraNxN;
> >          curRow.rowStats.totalCu          += frameLog.totalCu;
> >          for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
> > diff -r 377a996a8d74 -r 1ef3394a866a source/encoder/search.cpp
> > --- a/source/encoder/search.cpp       Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/encoder/search.cpp       Thu Aug 06 12:35:29 2015 +0530
> > @@ -1190,6 +1190,8 @@
> >          const Yuv* fencYuv = intraMode.fencYuv;
> >          intraMode.psyEnergy = m_rdCost.psyCost(cuGeom.log2CUSize - 2,
> fencYuv->m_buf[0], fencYuv->m_size, intraMode.reconYuv.m_buf[0],
> intraMode.reconYuv.m_size);
> >      }
> > +    intraMode.resEnergy = primitives.cu[cuGeom.log2CUSize -
> 2].sse_pp(intraMode.fencYuv->m_buf[0], intraMode.fencYuv->m_size,
> intraMode.predYuv.m_buf[0], intraMode.predYuv.m_size);
> > +
> >      updateModeCost(intraMode);
> >      checkDQP(intraMode, cuGeom);
> >  }
> > @@ -1402,6 +1404,7 @@
> >          const Yuv* fencYuv = intraMode.fencYuv;
> >          intraMode.psyEnergy = m_rdCost.psyCost(cuGeom.log2CUSize - 2,
> fencYuv->m_buf[0], fencYuv->m_size, reconYuv->m_buf[0], reconYuv->m_size);
> >      }
> > +    intraMode.resEnergy = primitives.cu[cuGeom.log2CUSize -
> 2].sse_pp(intraMode.fencYuv->m_buf[0], intraMode.fencYuv->m_size,
> intraMode.predYuv.m_buf[0], intraMode.predYuv.m_size);
> >
> >      m_entropyCoder.store(intraMode.contexts);
> >      updateModeCost(intraMode);
> > @@ -2447,6 +2450,7 @@
> >      CUData& cu = interMode.cu;
> >      Yuv* reconYuv = &interMode.reconYuv;
> >      const Yuv* fencYuv = interMode.fencYuv;
> > +    Yuv* predYuv = &interMode.predYuv;
> >
> >      X265_CHECK(!cu.isIntra(0), "intra CU not expected\n");
> >
> > @@ -2480,6 +2484,7 @@
> >      interMode.totalBits = interMode.mvBits;
> >      if (m_rdCost.m_psyRd)
> >          interMode.psyEnergy = m_rdCost.psyCost(part, fencYuv->m_buf[0],
> fencYuv->m_size, reconYuv->m_buf[0], reconYuv->m_size);
> > +    interMode.resEnergy = primitives.cu[part].sse_pp(fencYuv->m_buf[0],
> fencYuv->m_size, predYuv->m_buf[0], predYuv->m_size);
> >
> >      updateModeCost(interMode);
> >      m_entropyCoder.store(interMode.contexts);
> > @@ -2592,6 +2597,7 @@
> >      bestChromaDist += m_rdCost.scaleChromaDist(2,
> primitives.chroma[m_csp].cu[sizeIdx].sse_pp(fencYuv->m_buf[2],
> fencYuv->m_csize, reconYuv->m_buf[2], reconYuv->m_csize));
> >      if (m_rdCost.m_psyRd)
> >          interMode.psyEnergy = m_rdCost.psyCost(sizeIdx,
> fencYuv->m_buf[0], fencYuv->m_size, reconYuv->m_buf[0], reconYuv->m_size);
> > +    interMode.resEnergy = primitives.cu[sizeIdx].sse_pp(fencYuv->m_buf[0],
> fencYuv->m_size, predYuv->m_buf[0], predYuv->m_size);
> >
> >      interMode.totalBits = bits;
> >      interMode.lumaDistortion = bestLumaDist;
> > diff -r 377a996a8d74 -r 1ef3394a866a source/encoder/search.h
> > --- a/source/encoder/search.h Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/encoder/search.h Thu Aug 06 12:35:29 2015 +0530
> > @@ -109,6 +109,7 @@
> >      uint64_t   sa8dCost;   // sum of partition sa8d distortion costs
>  (sa8d(fenc, pred) + lambda * bits)
> >      uint32_t   sa8dBits;   // signal bits used in sa8dCost calculation
> >      uint32_t   psyEnergy;  // sum of partition psycho-visual energy
> difference
> > +    uint64_t   resEnergy;  // sum of partition residual energy after
> motion prediction
> >      uint32_t   lumaDistortion;
>
> resEnergy uses the same primitive as lumaDistortion (one uses predYuv,
> the other uses reconYuv), so why does resEnergy need to be uint64_t?
>
> >      uint32_t   chromaDistortion;
> >      uint32_t   distortion; // sum of partition SSE distortion
> > @@ -122,6 +123,7 @@
> >          sa8dCost = 0;
> >          sa8dBits = 0;
> >          psyEnergy = 0;
> > +        resEnergy = 0;
> >          lumaDistortion = 0;
> >          chromaDistortion = 0;
> >          distortion = 0;
> > @@ -137,6 +139,7 @@
> >          sa8dCost = UINT64_MAX / 2;
> >          sa8dBits = MAX_UINT / 2;
> >          psyEnergy = MAX_UINT / 2;
> > +        resEnergy = UINT64_MAX / 2;
> >          lumaDistortion = MAX_UINT / 2;
> >          chromaDistortion = MAX_UINT / 2;
> >          distortion = MAX_UINT / 2;
> > @@ -151,6 +154,7 @@
> >                   sa8dCost >= UINT64_MAX / 2 ||
> >                   sa8dBits >= MAX_UINT / 2 ||
> >                   psyEnergy >= MAX_UINT / 2 ||
> > +                 resEnergy >= UINT64_MAX / 2 ||
> >                   lumaDistortion >= MAX_UINT / 2 ||
> >                   chromaDistortion >= MAX_UINT / 2 ||
> >                   distortion >= MAX_UINT / 2 ||
> > @@ -167,6 +171,7 @@
> >          sa8dCost += subMode.sa8dCost;
> >          sa8dBits += subMode.sa8dBits;
> >          psyEnergy += subMode.psyEnergy;
> > +        resEnergy += subMode.resEnergy;
> >          lumaDistortion += subMode.lumaDistortion;
> >          chromaDistortion += subMode.chromaDistortion;
> >          distortion += subMode.distortion;
> > diff -r 377a996a8d74 -r 1ef3394a866a source/x265-extras.cpp
> > --- a/source/x265-extras.cpp  Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/x265-extras.cpp  Thu Aug 06 12:35:29 2015 +0530
> > @@ -107,7 +107,7 @@
> >                          fprintf(csvfp, ", Merge %dx%d", size, size);
> >                          size /= 2;
> >                      }
> > -                    fprintf(csvfp, ", Avg Luma Distortion, Avg Chroma
> Distortion, Avg psyEnergy, Avg Luma Level, Max Luma Level");
> > +                    fprintf(csvfp, ", Avg Luma Distortion, Avg Chroma
> Distortion, Avg psyEnergy, Avg Luma Level, Max Luma Level, Avg Residual
> Energy");
> >                  }
> >                  fprintf(csvfp, "\n");
> >              }
> > @@ -179,7 +179,7 @@
> >              fprintf(csvfp, ", %5.2lf%%",
> frameStats->cuStats.percentSkipCu[depth]);
> >          for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
> >              fprintf(csvfp, ", %5.2lf%%",
> frameStats->cuStats.percentMergeCu[depth]);
> > -        fprintf(csvfp, ", %.2lf, %.2lf, %.2lf, %.2lf, %d",
> frameStats->avgLumaDistortion, frameStats->avgChromaDistortion,
> frameStats->avgPsyEnergy, frameStats->avgLumaLevel,
> frameStats->maxLumaLevel);
> > +        fprintf(csvfp, ", %.2lf, %.2lf, %.2lf, %.2lf, %d, %.2lf",
> frameStats->avgLumaDistortion, frameStats->avgChromaDistortion,
> frameStats->avgPsyEnergy, frameStats->avgLumaLevel,
> frameStats->maxLumaLevel, frameStats->avgResEnergy);
> >      }
> >      fprintf(csvfp, "\n");
> >      fflush(stderr);
> > diff -r 377a996a8d74 -r 1ef3394a866a source/x265.h
> > --- a/source/x265.h   Wed Aug 05 15:09:14 2015 +0530
> > +++ b/source/x265.h   Thu Aug 06 12:35:29 2015 +0530
> > @@ -132,6 +132,7 @@
> >      double           avgLumaDistortion;
> >      double           avgChromaDistortion;
> >      double           avgPsyEnergy;
> > +    double           avgResEnergy;
> >      double           avgLumaLevel;
> >      uint64_t         bits;
> >      int              encoderOrder;
> > _______________________________________________
> > x265-devel mailing list
> > x265-devel at videolan.org
> > https://mailman.videolan.org/listinfo/x265-devel
>
> --
> Steve Borho
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20150807/a721f4d6/attachment-0001.html>


More information about the x265-devel mailing list