[x265] [PATCH] stats: count of each CU partition per frame
Divya Manivannan
divya at multicorewareinc.com
Mon Jul 13 08:54:54 CEST 2015
I will update and send the patch again.
On Mon, Jul 13, 2015 at 11:47 AM, Deepthi Nandakumar <
deepthi at multicorewareinc.com> wrote:
>
>
> On Mon, Jul 6, 2015 at 10:59 AM, Divya Manivannan <
> divya at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Divya Manivannan <divya at multicorewareinc.com>
>> # Date 1435741578 -19800
>> # Wed Jul 01 14:36:18 2015 +0530
>> # Node ID fab7c493b7ce3845565f9fbe07ebc183c22e928c
>> # Parent 1162fb0b99f82d32529f396e3afb6966cc38ec02
>> stats: count of each CU partition per frame
>>
>> diff -r 1162fb0b99f8 -r fab7c493b7ce doc/reST/api.rst
>> --- a/doc/reST/api.rst Fri Jul 03 13:43:47 2015 -0500
>> +++ b/doc/reST/api.rst Wed Jul 01 14:36:18 2015 +0530
>> @@ -338,10 +338,6 @@
>> Cleanup
>> =======
>>
>> - /* x265_encoder_log:
>> - * This function is now deprecated */
>> - void x265_encoder_log(x265_encoder *encoder, int argc, char
>> **argv);
>> -
>> Finally, the encoder must be closed in order to free all of its
>> resources. An encoder that has been flushed cannot be restarted and
>> reused. Once **x265_encoder_close()** has been called, the encoder
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/CMakeLists.txt
>> --- a/source/CMakeLists.txt Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/CMakeLists.txt Wed Jul 01 14:36:18 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 63)
>> +set(X265_BUILD 64)
>> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>> "${PROJECT_BINARY_DIR}/x265.def")
>> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/common/framedata.h
>> --- a/source/common/framedata.h Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/common/framedata.h Wed Jul 01 14:36:18 2015 +0530
>> @@ -34,6 +34,9 @@
>> class PicYuv;
>> class JobProvider;
>>
>> +#define INTER_MODES 4 // 2Nx2N, 2NxN, Nx2N, AMP modes
>> +#define INTRA_MODES 3 // DC, Planar, Angular modes
>> +
>> /* Current frame stats for 2 pass */
>> struct FrameStats
>> {
>> @@ -49,6 +52,25 @@
>> double percent8x8Intra;
>> double percent8x8Inter;
>> double percent8x8Skip;
>> + double percentIntraNxN;
>> + double percentSkipCu[NUM_CU_DEPTH];
>> + double percentMergeCu[NUM_CU_DEPTH];
>> + double percentIntraDistribution[NUM_CU_DEPTH][INTRA_MODES];
>> + double percentInterDistribution[NUM_CU_DEPTH][3]; //
>> 2Nx2N, RECT, AMP modes percentage
>> +
>> + uint64_t cntIntraNxN;
>> + uint64_t totalCu;
>> + uint64_t cntSkipCu[NUM_CU_DEPTH];
>> + uint64_t cntMergeCu[NUM_CU_DEPTH];
>> + uint64_t cntInter[NUM_CU_DEPTH];
>> + uint64_t cntIntra[NUM_CU_DEPTH];
>> + uint64_t cuInterDistribution[NUM_CU_DEPTH][INTER_MODES];
>> + uint64_t cuIntraDistribution[NUM_CU_DEPTH][INTRA_MODES];
>> +
>> + FrameStats()
>> + {
>> + memset(this, 0, sizeof(FrameStats));
>> + }
>> };
>>
>> /* Per-frame data that is used during encodes and referenced while the
>> picture
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/encoder/encoder.cpp
>> --- a/source/encoder/encoder.cpp Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/encoder/encoder.cpp Wed Jul 01 14:36:18 2015 +0530
>> @@ -1163,6 +1163,18 @@
>> else
>> frameStats->avgWPP = 1;
>> frameStats->countRowBlocks = curEncoder->m_countRowBlocks;
>> +
>> + frameStats->cuStats.percentIntraNxN =
>> curFrame->m_encData->m_frameStats.percentIntraNxN;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + {
>> + frameStats->cuStats.percentSkipCu[depth] =
>> curFrame->m_encData->m_frameStats.percentSkipCu[depth];
>> + frameStats->cuStats.percentMergeCu[depth] =
>> curFrame->m_encData->m_frameStats.percentMergeCu[depth];
>> + frameStats->cuStats.percentInterDistribution[depth][0] =
>> curFrame->m_encData->m_frameStats.percentInterDistribution[depth][0];
>> + frameStats->cuStats.percentInterDistribution[depth][1] =
>> curFrame->m_encData->m_frameStats.percentInterDistribution[depth][1];
>> + frameStats->cuStats.percentInterDistribution[depth][2] =
>> curFrame->m_encData->m_frameStats.percentInterDistribution[depth][2];
>> + for (int n = 0; n < INTRA_MODES; n++)
>> + frameStats->cuStats.percentIntraDistribution[depth][n] =
>> curFrame->m_encData->m_frameStats.percentIntraDistribution[depth][n];
>> + }
>> }
>> }
>>
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/encoder/frameencoder.cpp
>> --- a/source/encoder/frameencoder.cpp Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/encoder/frameencoder.cpp Wed Jul 01 14:36:18 2015 +0530
>> @@ -583,6 +583,33 @@
>> m_frame->m_encData->m_frameStats.percent8x8Inter =
>> (double)totalP / totalCuCount;
>> m_frame->m_encData->m_frameStats.percent8x8Skip =
>> (double)totalSkip / totalCuCount;
>> }
>> + for (uint32_t i = 0; i < m_numRows; i++)
>> + {
>> + m_frame->m_encData->m_frameStats.cntIntraNxN +=
>> m_rows[i].rowStats.cntIntraNxN;
>> + m_frame->m_encData->m_frameStats.totalCu +=
>> m_rows[i].rowStats.totalCu;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + {
>> + m_frame->m_encData->m_frameStats.cntSkipCu[depth] +=
>> m_rows[i].rowStats.cntSkipCu[depth];
>> + m_frame->m_encData->m_frameStats.cntMergeCu[depth] +=
>> m_rows[i].rowStats.cntMergeCu[depth];
>> + for (int m = 0; m < INTER_MODES; m++)
>> +
>> m_frame->m_encData->m_frameStats.cuInterDistribution[depth][m] +=
>> m_rows[i].rowStats.cuInterDistribution[depth][m];
>> + for (int n = 0; n < INTRA_MODES; n++)
>> +
>> m_frame->m_encData->m_frameStats.cuIntraDistribution[depth][n] +=
>> m_rows[i].rowStats.cuIntraDistribution[depth][n];
>> + }
>> + }
>> + 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++)
>> + {
>> + m_frame->m_encData->m_frameStats.percentSkipCu[depth] =
>> (double)(m_frame->m_encData->m_frameStats.cntSkipCu[depth] * 100) /
>> m_frame->m_encData->m_frameStats.totalCu;
>> + m_frame->m_encData->m_frameStats.percentMergeCu[depth] =
>> (double)(m_frame->m_encData->m_frameStats.cntMergeCu[depth] * 100) /
>> m_frame->m_encData->m_frameStats.totalCu;
>> + for (int n = 0; n < INTRA_MODES; n++)
>> +
>> m_frame->m_encData->m_frameStats.percentIntraDistribution[depth][n] =
>> (double)(m_frame->m_encData->m_frameStats.cuIntraDistribution[depth][n] *
>> 100) / m_frame->m_encData->m_frameStats.totalCu;
>> + uint64_t cuInterRectCnt = 0; // sum of Nx2N, 2NxN counts
>> + cuInterRectCnt +=
>> m_frame->m_encData->m_frameStats.cuInterDistribution[depth][1] +
>> m_frame->m_encData->m_frameStats.cuInterDistribution[depth][2];
>> +
>> m_frame->m_encData->m_frameStats.percentInterDistribution[depth][0] =
>> (double)(m_frame->m_encData->m_frameStats.cuInterDistribution[depth][0] *
>> 100) / m_frame->m_encData->m_frameStats.totalCu;
>> +
>> m_frame->m_encData->m_frameStats.percentInterDistribution[depth][1] =
>> (double)(cuInterRectCnt * 100) / m_frame->m_encData->m_frameStats.totalCu;
>> +
>> m_frame->m_encData->m_frameStats.percentInterDistribution[depth][2] =
>> (double)(m_frame->m_encData->m_frameStats.cuInterDistribution[depth][3] *
>> 100) / m_frame->m_encData->m_frameStats.totalCu;
>> + }
>>
>> m_bs.resetBits();
>> m_entropyCoder.load(m_initSliceContext);
>> @@ -838,13 +865,6 @@
>> const uint32_t lineStartCUAddr = row * numCols;
>> bool bIsVbv = m_param->rc.vbvBufferSize > 0 &&
>> m_param->rc.vbvMaxBitrate > 0;
>>
>> - /* These store the count of inter, intra and skip cus within quad
>> tree structure of each CTU */
>> - uint32_t qTreeInterCnt[NUM_CU_DEPTH];
>> - uint32_t qTreeIntraCnt[NUM_CU_DEPTH];
>> - uint32_t qTreeSkipCnt[NUM_CU_DEPTH];
>> - for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> - qTreeIntraCnt[depth] = qTreeInterCnt[depth] =
>> qTreeSkipCnt[depth] = 0;
>> -
>> while (curRow.completed < numCols)
>> {
>> ProfileScopeEvent(encodeCTU);
>> @@ -916,30 +936,42 @@
>> // Completed CU processing
>> curRow.completed++;
>>
>> - if (m_param->rc.bStatWrite)
>> - curEncData.m_rowStat[row].sumQpAq +=
>> collectCTUStatistics(*ctu, qTreeInterCnt, qTreeIntraCnt, qTreeSkipCnt);
>> - else if (m_param->rc.aqMode)
>> - curEncData.m_rowStat[row].sumQpAq += calcCTUQP(*ctu);
>> + FrameStats frameLog;
>> + curEncData.m_rowStat[row].sumQpAq += collectCTUStatistics(*ctu,
>> &frameLog);
>>
>> // copy no. of intra, inter Cu cnt per row into frame stats for
>> 2 pass
>> if (m_param->rc.bStatWrite)
>> {
>> - curRow.rowStats.mvBits += best.mvBits;
>> + curRow.rowStats.mvBits += best.mvBits;
>> curRow.rowStats.coeffBits += best.coeffBits;
>> - curRow.rowStats.miscBits += best.totalBits - (best.mvBits +
>> best.coeffBits);
>> + curRow.rowStats.miscBits += best.totalBits - (best.mvBits +
>> best.coeffBits);
>>
>> for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> {
>> /* 1 << shift == number of 8x8 blocks at current depth */
>> int shift = 2 * (g_maxCUDepth - depth);
>> - curRow.rowStats.intra8x8Cnt += qTreeIntraCnt[depth] <<
>> shift;
>> - curRow.rowStats.inter8x8Cnt += qTreeInterCnt[depth] <<
>> shift;
>> - curRow.rowStats.skip8x8Cnt += qTreeSkipCnt[depth] <<
>> shift;
>> + int cuSize = g_maxCUSize >> depth;
>>
>> - // clear the row cu data from thread local object
>> - qTreeIntraCnt[depth] = qTreeInterCnt[depth] =
>> qTreeSkipCnt[depth] = 0;
>> + if (cuSize == 8)
>> + curRow.rowStats.intra8x8Cnt +=
>> (int)(frameLog.cntIntra[depth] + frameLog.cntIntraNxN);
>> + else
>> + curRow.rowStats.intra8x8Cnt +=
>> (int)(frameLog.cntIntra[depth] << shift);
>> +
>> + curRow.rowStats.inter8x8Cnt +=
>> (int)(frameLog.cntInter[depth] << shift);
>> + curRow.rowStats.skip8x8Cnt +=
>> (int)(frameLog.cntSkipCu[depth] << shift);
>> }
>> }
>> + curRow.rowStats.cntIntraNxN += frameLog.cntIntraNxN;
>> + curRow.rowStats.totalCu += frameLog.totalCu;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + {
>> + curRow.rowStats.cntSkipCu[depth] +=
>> frameLog.cntSkipCu[depth];
>> + curRow.rowStats.cntMergeCu[depth] +=
>> frameLog.cntMergeCu[depth];
>> + for (int m = 0; m < INTER_MODES; m++)
>> + curRow.rowStats.cuInterDistribution[depth][m] +=
>> frameLog.cuInterDistribution[depth][m];
>> + for (int n = 0; n < INTRA_MODES; n++)
>> + curRow.rowStats.cuIntraDistribution[depth][n] +=
>> frameLog.cuIntraDistribution[depth][n];
>> + }
>>
>> curEncData.m_cuStat[cuAddr].totalBits = best.totalBits;
>> x265_emms();
>> @@ -1115,11 +1147,9 @@
>> }
>>
>> /* collect statistics about CU coding decisions, return total QP */
>> -int FrameEncoder::collectCTUStatistics(const CUData& ctu, uint32_t*
>> qtreeInterCnt, uint32_t* qtreeIntraCnt, uint32_t* qtreeSkipCnt)
>> +int FrameEncoder::collectCTUStatistics(const CUData& ctu, FrameStats*
>> log)
>> {
>> - StatisticLog* log = &m_sliceTypeLog[ctu.m_slice->m_sliceType];
>> int totQP = 0;
>> -
>> if (ctu.m_slice->m_sliceType == I_SLICE)
>> {
>> uint32_t depth = 0;
>> @@ -1129,14 +1159,12 @@
>>
>> log->totalCu++;
>> log->cntIntra[depth]++;
>> - qtreeIntraCnt[depth]++;
>> totQP += ctu.m_qp[absPartIdx] * (ctu.m_numPartitions >>
>> (depth * 2));
>>
>> if (ctu.m_predMode[absPartIdx] == MODE_NONE)
>> {
>> log->totalCu--;
>> log->cntIntra[depth]--;
>> - qtreeIntraCnt[depth]--;
>> }
>> else if (ctu.m_partSize[absPartIdx] != SIZE_2Nx2N)
>> {
>> @@ -1159,24 +1187,20 @@
>> depth = ctu.m_cuDepth[absPartIdx];
>>
>> log->totalCu++;
>> - log->cntTotalCu[depth]++;
>> totQP += ctu.m_qp[absPartIdx] * (ctu.m_numPartitions >>
>> (depth * 2));
>>
>> if (ctu.m_predMode[absPartIdx] == MODE_NONE)
>> - {
>> log->totalCu--;
>> - log->cntTotalCu[depth]--;
>> - }
>> else if (ctu.isSkipped(absPartIdx))
>> {
>> - log->totalCu--;
>> - log->cntSkipCu[depth]++;
>> - qtreeSkipCnt[depth]++;
>> + if (ctu.m_mergeFlag[0])
>> + log->cntMergeCu[depth]++;
>> + else
>> + log->cntSkipCu[depth]++;
>> }
>> else if (ctu.isInter(absPartIdx))
>> {
>> log->cntInter[depth]++;
>> - qtreeInterCnt[depth]++;
>>
>> if (ctu.m_partSize[absPartIdx] < AMP_ID)
>>
>> log->cuInterDistribution[depth][ctu.m_partSize[absPartIdx]]++;
>> @@ -1186,7 +1210,6 @@
>> else if (ctu.isIntra(absPartIdx))
>> {
>> log->cntIntra[depth]++;
>> - qtreeIntraCnt[depth]++;
>>
>> if (ctu.m_partSize[absPartIdx] != SIZE_2Nx2N)
>> {
>> @@ -1206,21 +1229,6 @@
>> return totQP;
>> }
>>
>> -/* iterate over coded CUs and determine total QP */
>> -int FrameEncoder::calcCTUQP(const CUData& ctu)
>> -{
>> - int totQP = 0;
>> - uint32_t depth = 0, numParts = ctu.m_numPartitions;
>> -
>> - for (uint32_t absPartIdx = 0; absPartIdx < ctu.m_numPartitions;
>> absPartIdx += numParts)
>> - {
>> - depth = ctu.m_cuDepth[absPartIdx];
>> - numParts = ctu.m_numPartitions >> (depth * 2);
>> - totQP += ctu.m_qp[absPartIdx] * numParts;
>> - }
>> - return totQP;
>> -}
>> -
>> /* DCT-domain noise reduction / adaptive deadzone from libavcodec */
>> void FrameEncoder::noiseReductionUpdate()
>> {
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/encoder/frameencoder.h
>> --- a/source/encoder/frameencoder.h Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/encoder/frameencoder.h Wed Jul 01 14:36:18 2015 +0530
>> @@ -49,8 +49,6 @@
>>
>> #define ANGULAR_MODE_ID 2
>> #define AMP_ID 3
>> -#define INTER_MODES 4
>> -#define INTRA_MODES 3
>>
>> struct StatisticLog
>> {
>> @@ -156,7 +154,6 @@
>> MD5Context m_state[3];
>> uint32_t m_crc[3];
>> uint32_t m_checksum[3];
>> - StatisticLog m_sliceTypeLog[3]; // per-slice type CU
>> statistics
>>
>> volatile int m_activeWorkerCount; // count of
>> workers currently encoding or filtering CTUs
>> volatile int m_totalActiveWorkerCount; // sum of
>> m_activeWorkerCount sampled at end of each CTU
>> @@ -220,8 +217,7 @@
>> void encodeSlice();
>>
>> void threadMain();
>> - int collectCTUStatistics(const CUData& ctu, uint32_t*
>> qtreeInterCnt, uint32_t* qtreeIntraCnt, uint32_t* qtreeSkipCnt);
>> - int calcCTUQP(const CUData& ctu);
>> + int collectCTUStatistics(const CUData& ctu, FrameStats* frameLog);
>> void noiseReductionUpdate();
>>
>> /* Called by WaveFront::findJob() */
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/x265.cpp
>> --- a/source/x265.cpp Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/x265.cpp Wed Jul 01 14:36:18 2015 +0530
>>
>
> Thanks, Divya - ready to be pushed. Can you move the portions below into
> x265-extras.cpp and update this patch?
>
>
>> @@ -171,7 +171,49 @@
>> fprintf(csvfpt, "RateFactor, ");
>> fprintf(csvfpt, "Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM,
>> SSIM (dB), List 0, List 1");
>> /* detailed performance statistics */
>> - fprintf(csvfpt, ", DecideWait (ms), Row0Wait (ms), Wall
>> time (ms), Ref Wait Wall (ms), Total CTU time (ms), Stall Time (ms), Avg
>> WPP, Row Blocks\n");
>> + fprintf(csvfpt, ", DecideWait (ms), Row0Wait (ms), Wall
>> time (ms), Ref Wait Wall (ms), Total CTU time (ms), Stall Time (ms), Avg
>> WPP, Row Blocks");
>> + if (csvLogLevel >= 2)
>> + {
>> + uint32_t size = param->maxCUSize;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth;
>> depth++)
>> + {
>> + fprintf(csvfpt, ", Intra %dx%d DC, Intra %dx%d
>> Planar, Intra %dx%d Ang", size, size, size, size, size, size);
>> + size /= 2;
>> + }
>> + fprintf(csvfpt, ", 4x4");
>> + size = param->maxCUSize;
>> + if (param->bEnableRectInter)
>> + {
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth;
>> depth++)
>> + {
>> + fprintf(csvfpt, ", Inter %dx%d, Inter %dx%d
>> (Rect)", size, size, size, size);
>> + if (param->bEnableAMP)
>> + fprintf(csvfpt, ", Inter %dx%d (Amp)",
>> size, size);
>> + size /= 2;
>> + }
>> + }
>> + else
>> + {
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth;
>> depth++)
>> + {
>> + fprintf(csvfpt, ", Inter %dx%d", size, size);
>> + size /= 2;
>> + }
>> + }
>> + size = param->maxCUSize;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth;
>> depth++)
>> + {
>> + fprintf(csvfpt, ", Skip %dx%d", size, size);
>> + size /= 2;
>> + }
>> + size = param->maxCUSize;
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth;
>> depth++)
>> + {
>> + fprintf(csvfpt, ", Merge %dx%d", size, size);
>> + size /= 2;
>> + }
>> + }
>> + fprintf(csvfpt, "\n");
>> }
>> else
>> fputs(summaryCSVHeader, csvfpt);
>> @@ -312,6 +354,30 @@
>> }
>> fprintf(csvfpt, " %.1lf, %.1lf, %.1lf, %.1lf, %.1lf, %.1lf,",
>> frameStats->decideWaitTime, frameStats->row0WaitTime, frameStats->wallTime,
>> frameStats->refWaitWallTime, frameStats->totalCTUTime,
>> frameStats->stallTime);
>> fprintf(csvfpt, " %.3lf, %d", frameStats->avgWPP,
>> frameStats->countRowBlocks);
>> + if (csvLogLevel >= 2)
>> + {
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + fprintf(csvfpt, ", %5.2lf%%, %5.2lf%%, %5.2lf%%",
>> frameStats->cuStats.percentIntraDistribution[depth][0],
>> frameStats->cuStats.percentIntraDistribution[depth][1],
>> frameStats->cuStats.percentIntraDistribution[depth][2]);
>> + fprintf(csvfpt, ", %5.2lf%%",
>> frameStats->cuStats.percentIntraNxN);
>> + if (param->bEnableRectInter)
>> + {
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + {
>> + fprintf(csvfpt, ", %5.2lf%%, %5.2lf%%",
>> frameStats->cuStats.percentInterDistribution[depth][0],
>> frameStats->cuStats.percentInterDistribution[depth][1]);
>> + if (param->bEnableAMP)
>> + fprintf(csvfpt, ", %5.2lf%%",
>> frameStats->cuStats.percentInterDistribution[depth][2]);
>> + }
>> + }
>> + else
>> + {
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + fprintf(csvfpt, ", %5.2lf%%",
>> frameStats->cuStats.percentInterDistribution[depth][0]);
>> + }
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + fprintf(csvfpt, ", %5.2lf%%",
>> frameStats->cuStats.percentSkipCu[depth]);
>> + for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
>> + fprintf(csvfpt, ", %5.2lf%%",
>> frameStats->cuStats.percentMergeCu[depth]);
>> + }
>> fprintf(csvfpt, "\n");
>> fflush(stderr);
>> }
>> @@ -703,17 +769,6 @@
>> if (cliopt.reconPlayCmd)
>> reconPlay = new ReconPlay(cliopt.reconPlayCmd, *param);
>>
>> - if (cliopt.csvfn)
>> - {
>> - if (cliopt.parseCSVFile())
>> - {
>> - cliopt.destroy();
>> - if (cliopt.api)
>> - cliopt.api->param_free(cliopt.param);
>> - exit(5);
>> - }
>> - }
>> -
>> /* note: we could try to acquire a different libx265 API here based
>> on
>> * the profile found during option parsing, but it must be done
>> before
>> * opening an encoder */
>> @@ -731,6 +786,17 @@
>> /* get the encoder parameters post-initialization */
>> api->encoder_parameters(encoder, param);
>>
>> + if (cliopt.csvfn)
>> + {
>> + if (cliopt.parseCSVFile())
>> + {
>> + cliopt.destroy();
>> + if (cliopt.api)
>> + cliopt.api->param_free(cliopt.param);
>> + exit(5);
>> + }
>> + }
>> +
>> /* Control-C handler */
>> if (signal(SIGINT, sigint_handler) == SIG_ERR)
>> x265_log(param, X265_LOG_ERROR, "Unable to register CTRL+C
>> handler: %s\n", strerror(errno));
>> diff -r 1162fb0b99f8 -r fab7c493b7ce source/x265.h
>> --- a/source/x265.h Fri Jul 03 13:43:47 2015 -0500
>> +++ b/source/x265.h Wed Jul 01 14:36:18 2015 +0530
>> @@ -100,6 +100,18 @@
>> uint32_t numPartitions;
>> } x265_analysis_data;
>>
>> +/* cu statistics */
>> +typedef struct x265_cu_stats
>> +{
>> + double percentSkipCu[4]; // Percentage of skip
>> cu in all depths
>> + double percentMergeCu[4]; // Percentage of merge
>> cu in all depths
>> + double percentIntraDistribution[4][3]; // Percentage of DC,
>> Planar, Angular intra modes in all depths
>> + double percentInterDistribution[4][3]; // Percentage of 2Nx2N
>> inter, rect and amp in all depths
>> + double percentIntraNxN; // Percentage of 4x4 cu
>> +
>> + /* All the above values will add up to 100%. */
>> +} x265_cu_stats;
>> +
>> /* Frame level statistics */
>> typedef struct x265_frame_stats
>> {
>> @@ -124,6 +136,7 @@
>> int list0POC[16];
>> int list1POC[16];
>> char sliceType;
>> + x265_cu_stats cuStats;
>> } x265_frame_stats;
>>
>> /* Used to pass pictures into the encoder, and to get picture data back
>> out of
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> _______________________________________________
> 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/20150713/a0bf40ff/attachment-0001.html>
More information about the x265-devel
mailing list