[x265] [PATCH] make cu level stats logging run time configurable

Steve Borho steve at borho.org
Sat Jun 21 00:30:24 CEST 2014


On Fri, Jun 20, 2014 at 2:05 PM,  <aarthi at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Aarthi Thirumalai<aarthi at multicorewareinc.com>
> # Date 1403263555 -19800
> #      Fri Jun 20 16:55:55 2014 +0530
> # Node ID 71a8e0d9f931dfccf77db25e575841fdfe6baba4
> # Parent  c2ebebb66bf4fd92c83288e821e98a24a4ba2610
> make cu level stats logging run time configurable

I've queued this with a few changes:

* changed --log-stats to --cu-stats to prevent --log from being an
ambiguous completion of --log-level
* bumped X265_BUILD
* added more detail to the commit message about *why* this was necessary

> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/CMakeLists.txt
> --- a/source/CMakeLists.txt     Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/CMakeLists.txt     Fri Jun 20 16:55:55 2014 +0530
> @@ -183,12 +183,7 @@
>      endif()
>  endif(WARNINGS_AS_ERRORS)
>
> -option(LOG_CU_STATISTICS "Log Mode Decision Statistics at the CU Level" OFF)
> -if(LOG_CU_STATISTICS)
> -    add_definitions(-DLOG_CU_STATISTICS=1)
> -else(LOG_CU_STATISTICS)
> -    add_definitions(-DLOG_CU_STATISTICS=0)
> -endif(LOG_CU_STATISTICS)
> +
>
>  option(ENABLE_PPA "Enable PPA profiling instrumentation" OFF)
>  if(ENABLE_PPA)
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/Lib/TLibEncoder/TEncCu.cpp
> --- a/source/Lib/TLibEncoder/TEncCu.cpp Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/Lib/TLibEncoder/TEncCu.cpp Fri Jun 20 16:55:55 2014 +0530
> @@ -317,36 +317,35 @@
>      m_tempCU[0]->initCU(cu->getPic(), cu->getAddr());
>
>      // analysis of CU
> -#if LOG_CU_STATISTICS
>      int numPartition = cu->getTotalNumPart();
> -#endif
>
>      if (m_bestCU[0]->getSlice()->getSliceType() == I_SLICE)
>      {
>          xCompressIntraCU(m_bestCU[0], m_tempCU[0], 0, false);
> -#if LOG_CU_STATISTICS
> -        int i = 0, part;
> -        do
> +        if (m_param->bLogCuStats || m_param->rc.bStatWrite)
>          {
> -            m_log->totalCu++;
> -            part = cu->getDepth(i);
> -            int next = numPartition >> (part * 2);
> -            if (part == g_maxCUDepth - 1 && cu->getPartitionSize(i) != SIZE_2Nx2N)
> +            int i = 0, part;
> +            do
>              {
> -                m_log->cntIntraNxN++;
> +                m_log->totalCu++;
> +                part = cu->getDepth(i);
> +                int next = numPartition >> (part * 2);
> +                if (part == g_maxCUDepth - 1 && cu->getPartitionSize(i) != SIZE_2Nx2N)
> +                {
> +                    m_log->cntIntraNxN++;
> +                }
> +                else
> +                {
> +                    m_log->cntIntra[part]++;
> +                    if (cu->getLumaIntraDir()[i] > 1)
> +                        m_log->cuIntraDistribution[part][ANGULAR_MODE_ID]++;
> +                    else
> +                        m_log->cuIntraDistribution[part][cu->getLumaIntraDir()[i]]++;
> +                }
> +                i += next;
>              }
> -            else
> -            {
> -                m_log->cntIntra[part]++;
> -                if (cu->getLumaIntraDir()[i] > 1)
> -                    m_log->cuIntraDistribution[part][ANGULAR_MODE_ID]++;
> -                else
> -                    m_log->cuIntraDistribution[part][cu->getLumaIntraDir()[i]]++;
> -            }
> -            i += next;
> +            while (i < numPartition);
>          }
> -        while (i < numPartition);
> -#endif // if LOG_CU_STATISTICS
>      }
>      else
>      {
> @@ -360,48 +359,49 @@
>          }
>          else
>              xCompressCU(m_bestCU[0], m_tempCU[0], 0, false);
> -#if LOG_CU_STATISTICS
> -        int i = 0, part;
> -        do
> +        if (m_param->bLogCuStats || m_param->rc.bStatWrite)
>          {
> -            part = cu->getDepth(i);
> -            m_log->cntTotalCu[part]++;
> -            int next = numPartition >> (part * 2);
> -            if (cu->isSkipped(i))
> +            int i = 0, part;
> +            do
>              {
> -                m_log->cntSkipCu[part]++;
> -            }
> -            else
> -            {
> -                m_log->totalCu++;
> -                if (cu->getPredictionMode(0) == MODE_INTER)
> +                part = cu->getDepth(i);
> +                m_log->cntTotalCu[part]++;
> +                int next = numPartition >> (part * 2);
> +                if (cu->isSkipped(i))
>                  {
> -                    m_log->cntInter[part]++;
> -                    if (cu->getPartitionSize(0) < AMP_ID)
> -                        m_log->cuInterDistribution[part][cu->getPartitionSize(0)]++;
> -                    else
> -                        m_log->cuInterDistribution[part][AMP_ID]++;
> +                    m_log->cntSkipCu[part]++;
>                  }
> -                else if (cu->getPredictionMode(0) == MODE_INTRA)
> +                else
>                  {
> -                    if (part == g_maxCUDepth - 1 && cu->getPartitionSize(0) == SIZE_NxN)
> +                    m_log->totalCu++;
> +                    if (cu->getPredictionMode(0) == MODE_INTER)
>                      {
> -                        m_log->cntIntraNxN++;
> +                        m_log->cntInter[part]++;
> +                        if (cu->getPartitionSize(0) < AMP_ID)
> +                            m_log->cuInterDistribution[part][cu->getPartitionSize(0)]++;
> +                        else
> +                            m_log->cuInterDistribution[part][AMP_ID]++;
>                      }
> -                    else
> +                    else if (cu->getPredictionMode(0) == MODE_INTRA)
>                      {
> -                        m_log->cntIntra[part]++;
> -                        if (cu->getLumaIntraDir()[0] > 1)
> -                            m_log->cuIntraDistribution[part][ANGULAR_MODE_ID]++;
> +                        if (part == g_maxCUDepth - 1 && cu->getPartitionSize(0) == SIZE_NxN)
> +                        {
> +                            m_log->cntIntraNxN++;
> +                        }
>                          else
> -                            m_log->cuIntraDistribution[part][cu->getLumaIntraDir()[0]]++;
> +                        {
> +                            m_log->cntIntra[part]++;
> +                            if (cu->getLumaIntraDir()[0] > 1)
> +                                m_log->cuIntraDistribution[part][ANGULAR_MODE_ID]++;
> +                            else
> +                                m_log->cuIntraDistribution[part][cu->getLumaIntraDir()[0]]++;
> +                        }
>                      }
>                  }
> +                i = i + next;
>              }
> -            i = i + next;
> +            while (i < numPartition);
>          }
> -        while (i < numPartition);
> -#endif // if LOG_CU_STATISTICS
>      }
>  }
>
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/Lib/TLibEncoder/TEncCu.h
> --- a/source/Lib/TLibEncoder/TEncCu.h   Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/Lib/TLibEncoder/TEncCu.h   Fri Jun 20 16:55:55 2014 +0530
> @@ -131,10 +131,9 @@
>
>  public:
>
> -#if LOG_CU_STATISTICS
>      StatisticLog  m_sliceTypeLog[3];
>      StatisticLog* m_log;
> -#endif
> +
>      TEncCu();
>
>      void init(Encoder* top);
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/common/param.cpp
> --- a/source/common/param.cpp   Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/common/param.cpp   Fri Jun 20 16:55:55 2014 +0530
> @@ -103,6 +103,7 @@
>      param->frameNumThreads = 0;
>      param->poolNumThreads = 0;
>      param->csvfn = NULL;
> +    param->bLogCuStats = 0;
>
>      /* Source specifications */
>      param->internalBitDepth = x265_max_bit_depth;
> @@ -559,6 +560,7 @@
>              p->logLevel = parseName(value, logLevelNames, bError) - 1;
>          }
>      }
> +    OPT("log-stats") p->bLogCuStats = atobool(value);
>      OPT("repeat-headers") p->bRepeatHeaders = atobool(value);
>      OPT("wpp") p->bEnableWavefront = atobool(value);
>      OPT("ctu") p->maxCUSize = (uint32_t)atoi(value);
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/encoder/encoder.cpp        Fri Jun 20 16:55:55 2014 +0530
> @@ -522,154 +522,154 @@
>
>  void Encoder::printSummary()
>  {
> -#if LOG_CU_STATISTICS
> -    for (int sliceType = 2; sliceType >= 0; sliceType--)
> +    if (m_param->bLogCuStats)
>      {
> -        if (sliceType == P_SLICE && !m_analyzeP.m_numPics)
> -            continue;
> -        if (sliceType == B_SLICE && !m_analyzeB.m_numPics)
> -            continue;
> +        for (int sliceType = 2; sliceType >= 0; sliceType--)
> +        {
> +            if (sliceType == P_SLICE && !m_analyzeP.m_numPics)
> +                continue;
> +            if (sliceType == B_SLICE && !m_analyzeB.m_numPics)
> +                continue;
>
> -        StatisticLog finalLog;
> -        for (int depth = 0; depth < (int)g_maxCUDepth; depth++)
> -        {
> -            for (int j = 0; j < m_totalFrameThreads; j++)
> +            StatisticLog finalLog;
> +            for (int depth = 0; depth < (int)g_maxCUDepth; depth++)
>              {
> -                for (int row = 0; row < m_frameEncoder[0].m_numRows; row++)
> +                for (int j = 0; j < m_totalFrameThreads; j++)
>                  {
> -                    StatisticLog& enclog = m_frameEncoder[j].m_rows[row].m_cuCoder.m_sliceTypeLog[sliceType];
> -                    if (depth == 0)
> -                        finalLog.totalCu += enclog.totalCu;
> -                    finalLog.cntIntra[depth] += enclog.cntIntra[depth];
> -                    for (int m = 0; m < INTER_MODES; m++)
> +                    for (int row = 0; row < m_frameEncoder[0].m_numRows; row++)
>                      {
> -                        if (m < INTRA_MODES)
> +                        StatisticLog& enclog = m_frameEncoder[j].m_rows[row].m_cuCoder.m_sliceTypeLog[sliceType];
> +                        if (depth == 0)
> +                            finalLog.totalCu += enclog.totalCu;
> +                        finalLog.cntIntra[depth] += enclog.cntIntra[depth];
> +                        for (int m = 0; m < INTER_MODES; m++)
>                          {
> -                            finalLog.cuIntraDistribution[depth][m] += enclog.cuIntraDistribution[depth][m];
> +                            if (m < INTRA_MODES)
> +                            {
> +                                finalLog.cuIntraDistribution[depth][m] += enclog.cuIntraDistribution[depth][m];
> +                            }
> +                            finalLog.cuInterDistribution[depth][m] += enclog.cuInterDistribution[depth][m];
>                          }
> -                        finalLog.cuInterDistribution[depth][m] += enclog.cuInterDistribution[depth][m];
> -                    }
>
> -                    if (depth == (int)g_maxCUDepth - 1)
> -                        finalLog.cntIntraNxN += enclog.cntIntraNxN;
> -                    if (sliceType != I_SLICE)
> -                    {
> -                        finalLog.cntTotalCu[depth] += enclog.cntTotalCu[depth];
> -                        finalLog.cntInter[depth] += enclog.cntInter[depth];
> -                        finalLog.cntSkipCu[depth] += enclog.cntSkipCu[depth];
> +                        if (depth == (int)g_maxCUDepth - 1)
> +                            finalLog.cntIntraNxN += enclog.cntIntraNxN;
> +                        if (sliceType != I_SLICE)
> +                        {
> +                            finalLog.cntTotalCu[depth] += enclog.cntTotalCu[depth];
> +                            finalLog.cntInter[depth] += enclog.cntInter[depth];
> +                            finalLog.cntSkipCu[depth] += enclog.cntSkipCu[depth];
> +                        }
>                      }
>                  }
> -            }
>
> -            uint64_t cntInter, cntSkipCu, cntIntra = 0, cntIntraNxN = 0, encCu = 0;
> -            uint64_t cuInterDistribution[INTER_MODES], cuIntraDistribution[INTRA_MODES];
> +                uint64_t cntInter, cntSkipCu, cntIntra = 0, cntIntraNxN = 0, encCu = 0;
> +                uint64_t cuInterDistribution[INTER_MODES], cuIntraDistribution[INTRA_MODES];
>
> -            // check for 0/0, if true assign 0 else calculate percentage
> -            for (int n = 0; n < INTER_MODES; n++)
> -            {
> -                if (finalLog.cntInter[depth] == 0)
> -                    cuInterDistribution[n] = 0;
> +                // check for 0/0, if true assign 0 else calculate percentage
> +                for (int n = 0; n < INTER_MODES; n++)
> +                {
> +                    if (finalLog.cntInter[depth] == 0)
> +                        cuInterDistribution[n] = 0;
> +                    else
> +                        cuInterDistribution[n] = (finalLog.cuInterDistribution[depth][n] * 100) / finalLog.cntInter[depth];
> +                    if (n < INTRA_MODES)
> +                    {
> +                        if (finalLog.cntIntra[depth] == 0)
> +                        {
> +                            cntIntraNxN = 0;
> +                            cuIntraDistribution[n] = 0;
> +                        }
> +                        else
> +                        {
> +                            cntIntraNxN = (finalLog.cntIntraNxN * 100) / finalLog.cntIntra[depth];
> +                            cuIntraDistribution[n] = (finalLog.cuIntraDistribution[depth][n] * 100) / finalLog.cntIntra[depth];
> +                        }
> +                    }
> +                }
> +
> +                if (finalLog.totalCu == 0)
> +                {
> +                    encCu = 0;
> +                }
>                  else
> -                    cuInterDistribution[n] = (finalLog.cuInterDistribution[depth][n] * 100) / finalLog.cntInter[depth];
> -                if (n < INTRA_MODES)
>                  {
> -                    if (finalLog.cntIntra[depth] == 0)
> +                    if (sliceType == I_SLICE)
>                      {
> -                        cntIntraNxN = 0;
> -                        cuIntraDistribution[n] = 0;
> +                        cntIntra = (finalLog.cntIntra[depth] * 100) / finalLog.totalCu;
> +                        cntIntraNxN = (finalLog.cntIntraNxN * 100) / finalLog.totalCu;
>                      }
>                      else
>                      {
> -                        cntIntraNxN = (finalLog.cntIntraNxN * 100) / finalLog.cntIntra[depth];
> -                        cuIntraDistribution[n] = (finalLog.cuIntraDistribution[depth][n] * 100) / finalLog.cntIntra[depth];
> +                        encCu = ((finalLog.cntIntra[depth] + finalLog.cntInter[depth]) * 100) / finalLog.totalCu;
>                      }
>                  }
> -            }
> -
> -            if (finalLog.totalCu == 0)
> -            {
> -                encCu = 0;
> -            }
> -            else
> -            {
>                  if (sliceType == I_SLICE)
>                  {
> -                    cntIntra = (finalLog.cntIntra[depth] * 100) / finalLog.totalCu;
> -                    cntIntraNxN = (finalLog.cntIntraNxN * 100) / finalLog.totalCu;
> -                }
> -                else
> -                {
> -                    encCu = ((finalLog.cntIntra[depth] + finalLog.cntInter[depth]) * 100) / finalLog.totalCu;
> -                }
> -            }
> -            if (sliceType == I_SLICE)
> -            {
> -                cntInter = 0;
> -                cntSkipCu = 0;
> -            }
> -            else
> -            {
> -                if (finalLog.cntTotalCu[depth] == 0)
> -                {
>                      cntInter = 0;
> -                    cntIntra = 0;
>                      cntSkipCu = 0;
>                  }
>                  else
>                  {
> -                    cntInter = (finalLog.cntInter[depth] * 100) / finalLog.cntTotalCu[depth];
> -                    cntIntra = (finalLog.cntIntra[depth] * 100) / finalLog.cntTotalCu[depth];
> -                    cntSkipCu = (finalLog.cntSkipCu[depth] * 100) / finalLog.cntTotalCu[depth];
> +                    if (finalLog.cntTotalCu[depth] == 0)
> +                    {
> +                        cntInter = 0;
> +                        cntIntra = 0;
> +                        cntSkipCu = 0;
> +                    }
> +                    else
> +                    {
> +                        cntInter = (finalLog.cntInter[depth] * 100) / finalLog.cntTotalCu[depth];
> +                        cntIntra = (finalLog.cntIntra[depth] * 100) / finalLog.cntTotalCu[depth];
> +                        cntSkipCu = (finalLog.cntSkipCu[depth] * 100) / finalLog.cntTotalCu[depth];
> +                    }
>                  }
> -            }
> -            // print statistics
> -            int cuSize = g_maxCUSize >> depth;
> -            char stats[256] = { 0 };
> -            int len = 0;
> -            if (sliceType != I_SLICE)
> -            {
> -                len += sprintf(stats + len, "EncCU "X265_LL "%% Merge "X265_LL "%%", encCu, cntSkipCu);
> -            }
> -            if (cntInter)
> -            {
> -                len += sprintf(stats + len, " Inter "X265_LL "%%", cntInter);
> -                if (m_param->bEnableAMP)
> -                    len += sprintf(stats + len, "(%dx%d "X265_LL "%% %dx%d "X265_LL "%% %dx%d "X265_LL "%% AMP "X265_LL "%%)",
> -                                   cuSize, cuSize, cuInterDistribution[0],
> -                                   cuSize / 2, cuSize, cuInterDistribution[2],
> -                                   cuSize, cuSize / 2, cuInterDistribution[1],
> -                                   cuInterDistribution[3]);
> -                else if (m_param->bEnableRectInter)
> -                    len += sprintf(stats + len, "(%dx%d "X265_LL "%% %dx%d "X265_LL "%% %dx%d "X265_LL "%%)",
> -                                   cuSize, cuSize, cuInterDistribution[0],
> -                                   cuSize / 2, cuSize, cuInterDistribution[2],
> -                                   cuSize, cuSize / 2, cuInterDistribution[1]);
> -            }
> -            if (cntIntra)
> -            {
> -                len += sprintf(stats + len, " Intra "X265_LL "%%(DC "X265_LL "%% P "X265_LL "%% Ang "X265_LL "%%",
> -                               cntIntra, cuIntraDistribution[0],
> -                               cuIntraDistribution[1], cuIntraDistribution[2]);
> +                // print statistics
> +                int cuSize = g_maxCUSize >> depth;
> +                char stats[256] = { 0 };
> +                int len = 0;
>                  if (sliceType != I_SLICE)
>                  {
> -                    if (depth == (int)g_maxCUDepth - 1)
> -                        len += sprintf(stats + len, " %dx%d "X265_LL "%%", cuSize / 2, cuSize / 2, cntIntraNxN);
> +                    len += sprintf(stats + len, "EncCU "X265_LL "%% Merge "X265_LL "%%", encCu, cntSkipCu);
>                  }
> +                if (cntInter)
> +                {
> +                    len += sprintf(stats + len, " Inter "X265_LL "%%", cntInter);
> +                    if (m_param->bEnableAMP)
> +                        len += sprintf(stats + len, "(%dx%d "X265_LL "%% %dx%d "X265_LL "%% %dx%d "X265_LL "%% AMP "X265_LL "%%)",
> +                                       cuSize, cuSize, cuInterDistribution[0],
> +                                       cuSize / 2, cuSize, cuInterDistribution[2],
> +                                       cuSize, cuSize / 2, cuInterDistribution[1],
> +                                       cuInterDistribution[3]);
> +                    else if (m_param->bEnableRectInter)
> +                        len += sprintf(stats + len, "(%dx%d "X265_LL "%% %dx%d "X265_LL "%% %dx%d "X265_LL "%%)",
> +                                       cuSize, cuSize, cuInterDistribution[0],
> +                                       cuSize / 2, cuSize, cuInterDistribution[2],
> +                                       cuSize, cuSize / 2, cuInterDistribution[1]);
> +                }
> +                if (cntIntra)
> +                {
> +                    len += sprintf(stats + len, " Intra "X265_LL "%%(DC "X265_LL "%% P "X265_LL "%% Ang "X265_LL "%%",
> +                                   cntIntra, cuIntraDistribution[0],
> +                                   cuIntraDistribution[1], cuIntraDistribution[2]);
> +                    if (sliceType != I_SLICE)
> +                    {
> +                        if (depth == (int)g_maxCUDepth - 1)
> +                            len += sprintf(stats + len, " %dx%d "X265_LL "%%", cuSize / 2, cuSize / 2, cntIntraNxN);
> +                    }
>
> -                len += sprintf(stats + len, ")");
> -                if (sliceType == I_SLICE)
> -                {
> -                    if (depth == (int)g_maxCUDepth - 1)
> -                        len += sprintf(stats + len, " %dx%d: "X265_LL "%%", cuSize / 2, cuSize / 2, cntIntraNxN);
> +                    len += sprintf(stats + len, ")");
> +                    if (sliceType == I_SLICE)
> +                    {
> +                        if (depth == (int)g_maxCUDepth - 1)
> +                            len += sprintf(stats + len, " %dx%d: "X265_LL "%%", cuSize / 2, cuSize / 2, cntIntraNxN);
> +                    }
>                  }
> +                const char slicechars[] = "BPI";
> +                if (stats[0])
> +                    x265_log(m_param, X265_LOG_INFO, "%c%-2d: %s\n", slicechars[sliceType], cuSize, stats);
>              }
> -            const char slicechars[] = "BPI";
> -            if (stats[0])
> -                x265_log(m_param, X265_LOG_INFO, "%c%-2d: %s\n", slicechars[sliceType], cuSize, stats);
>          }
>      }
> -
> -#endif // if LOG_CU_STATISTICS
>      if (m_param->logLevel >= X265_LOG_INFO)
>      {
>          char buffer[200];
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/encoder/frameencoder.cpp   Fri Jun 20 16:55:55 2014 +0530
> @@ -259,13 +259,16 @@
>
>      slice->setScalingList(m_top->getScalingList());
>      slice->getScalingList()->setUseTransformSkip(m_pps.getUseTransformSkip());
> -#if LOG_CU_STATISTICS
> -    for (int i = 0; i < m_numRows; i++)
> +
> +    /* We also need analysis of cu distribution across various modes in multipass encodes */
> +    if (m_param->bLogCuStats || m_param->rc.bStatWrite)
>      {
> -        m_rows[i].m_cuCoder.m_log = &m_rows[i].m_cuCoder.m_sliceTypeLog[sliceType];
> +        for (int i = 0; i < m_numRows; i++)
> +        {
> +            m_rows[i].m_cuCoder.m_log = &m_rows[i].m_cuCoder.m_sliceTypeLog[sliceType];
> +        }
>      }
>
> -#endif
>      if (slice->getPPS()->getDeblockingFilterControlPresentFlag())
>      {
>          slice->getPPS()->setDeblockingFilterOverrideEnabledFlag(!m_top->m_loopFilterOffsetInPPS);
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/x265.cpp
> --- a/source/x265.cpp   Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/x265.cpp   Fri Jun 20 16:55:55 2014 +0530
> @@ -71,6 +71,8 @@
>      { "log-level",      required_argument, NULL, 0 },
>      { "level",          required_argument, NULL, 0 },
>      { "csv",            required_argument, NULL, 0 },
> +    { "no-log-stats",         no_argument, NULL, 0 },
> +    { "log-stats",            no_argument, NULL, 0 },
>      { "y4m",                  no_argument, NULL, 0 },
>      { "no-progress",          no_argument, NULL, 0 },
>      { "output",         required_argument, NULL, 'o' },
> @@ -315,6 +317,7 @@
>      H0("   --log-level <string>          Logging level: none error warning info debug full. Default %s\n", logLevelNames[param->logLevel + 1]);
>      H0("   --csv <filename>              Comma separated log file, log level >= 3 frame log, else one line per run\n");
>      H0("   --no-progress                 Disable CLI progress reports\n");
> +    H0("   --[no-]log-stats              Enable logging stats about distribution of cu across all modes. Default %s\n",OPT(param->bLogCuStats));
>      H0("-o/--output <filename>           Bitstream output file name\n");
>      H0("\nInput Options:\n");
>      H0("   --input <filename>            Raw YUV or Y4M input file name. `-` for stdin\n");
> diff -r c2ebebb66bf4 -r 71a8e0d9f931 source/x265.h
> --- a/source/x265.h     Fri Jun 20 12:29:37 2014 +0530
> +++ b/source/x265.h     Fri Jun 20 16:55:55 2014 +0530
> @@ -674,6 +674,9 @@
>       * chosen, the cu-transquant-bypass flag is set for that CU. */
>      int       bCULossless;
>
> +    /* Enable analysis and logging distribution of Cus encoded across various modes during mode decision.*/
> +    int       bLogCuStats;
> +
>      /*== Rate Control ==*/
>
>      struct
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel



-- 
Steve Borho


More information about the x265-devel mailing list