[x265] [PATCH] stats: fix use of uninitialized pixels in maximum and average luma level calculation
kavitha at multicorewareinc.com
kavitha at multicorewareinc.com
Thu Aug 13 09:17:28 CEST 2015
# HG changeset patch
# User Kavitha Sampath <kavitha at multicorewareinc.com>
# Date 1439450035 -19800
# Thu Aug 13 12:43:55 2015 +0530
# Node ID ac3966a43ba77b609d0e209df80f3a3aac234c08
# Parent bc5a7c2ac38b06d2a232b983f10bc0394d252ad7
stats: fix use of uninitialized pixels in maximum and average luma level calculation
To avoid complexity in determining pixels of border CUs that lie outside the frame,
luma level calculations are performed at the frame level, immediately after
copying the picture into PicYuv
diff -r bc5a7c2ac38b -r ac3966a43ba7 source/common/picyuv.cpp
--- a/source/common/picyuv.cpp Wed Aug 12 15:13:51 2015 +0530
+++ b/source/common/picyuv.cpp Thu Aug 13 12:43:55 2015 +0530
@@ -42,6 +42,9 @@
m_cuOffsetC = NULL;
m_buOffsetY = NULL;
m_buOffsetC = NULL;
+
+ maxLumaLevel = 0;
+ avgLumaLevel = 0;
}
bool PicYuv::create(uint32_t picWidth, uint32_t picHeight, uint32_t picCsp)
@@ -235,17 +238,25 @@
pixel *U = m_picOrg[1];
pixel *V = m_picOrg[2];
+ uint64_t sumLuma = 0;
for (int r = 0; r < height; r++)
{
- /* Clip luma of source picture to max and min values before extending edges of picYuv */
- for (int c = 0; c < m_stride; c++)
+ for (int c = 0; c < width; c++)
+ {
+ /* Clip luma of source picture to max and min values before extending edges of picYuv */
Y[c] = x265_clip3((pixel)param.minLuma, (pixel)param.maxLuma, Y[c]);
+ /* Determine maximum and average luma level in a picture */
+ maxLumaLevel = X265_MAX(Y[c], maxLumaLevel);
+ sumLuma += Y[c];
+ }
+
for (int x = 0; x < padx; x++)
Y[width + x] = Y[width - 1];
Y += m_stride;
}
+ avgLumaLevel = (double)sumLuma / (m_picHeight * m_picWidth);
for (int r = 0; r < height >> m_vChromaShift; r++)
{
diff -r bc5a7c2ac38b -r ac3966a43ba7 source/common/picyuv.h
--- a/source/common/picyuv.h Wed Aug 12 15:13:51 2015 +0530
+++ b/source/common/picyuv.h Thu Aug 13 12:43:55 2015 +0530
@@ -60,6 +60,9 @@
uint32_t m_chromaMarginX;
uint32_t m_chromaMarginY;
+ uint16_t maxLumaLevel;
+ double avgLumaLevel;
+
PicYuv();
bool create(uint32_t picWidth, uint32_t picHeight, uint32_t csp);
diff -r bc5a7c2ac38b -r ac3966a43ba7 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Wed Aug 12 15:13:51 2015 +0530
+++ b/source/encoder/encoder.cpp Thu Aug 13 12:43:55 2015 +0530
@@ -1163,8 +1163,8 @@
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->avgLumaLevel = curFrame->m_encData->m_frameStats.avgLumaLevel;
- frameStats->maxLumaLevel = curFrame->m_encData->m_frameStats.maxLumaLevel;
+ frameStats->avgLumaLevel = curFrame->m_fencPic->avgLumaLevel;
+ frameStats->maxLumaLevel = curFrame->m_fencPic->maxLumaLevel;
for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
{
frameStats->cuStats.percentSkipCu[depth] = curFrame->m_encData->m_frameStats.percentSkipCu[depth];
diff -r bc5a7c2ac38b -r ac3966a43ba7 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Wed Aug 12 15:13:51 2015 +0530
+++ b/source/encoder/frameencoder.cpp Thu Aug 13 12:43:55 2015 +0530
@@ -592,10 +592,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.lumaLevel += m_rows[i].rowStats.lumaLevel;
- if (m_rows[i].rowStats.maxLumaLevel > m_frame->m_encData->m_frameStats.maxLumaLevel)
- m_frame->m_encData->m_frameStats.maxLumaLevel = m_rows[i].rowStats.maxLumaLevel;
for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)
{
m_frame->m_encData->m_frameStats.cntSkipCu[depth] += m_rows[i].rowStats.cntSkipCu[depth];
@@ -609,7 +606,6 @@
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.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++)
{
@@ -990,17 +986,6 @@
curRow.rowStats.cuIntraDistribution[depth][n] += frameLog.cuIntraDistribution[depth][n];
}
- /* calculate maximum and average luma levels */
- uint32_t ctuLumaLevel = 0;
- uint32_t ctuNoOfPixels = best.fencYuv->m_size * best.fencYuv->m_size;
- for (uint32_t i = 0; i < ctuNoOfPixels; i++)
- {
- pixel p = best.fencYuv->m_buf[0][i];
- ctuLumaLevel += p;
- curRow.rowStats.maxLumaLevel = X265_MAX(p, curRow.rowStats.maxLumaLevel);
- }
- curRow.rowStats.lumaLevel += (double)(ctuLumaLevel) / ctuNoOfPixels;
-
curEncData.m_cuStat[cuAddr].totalBits = best.totalBits;
x265_emms();
More information about the x265-devel
mailing list