[x265] [PATCH] SAO: initialize bottom and right line numbers to be skipped for SAO statistics calculation only once
ashok at multicorewareinc.com
ashok at multicorewareinc.com
Thu Nov 19 11:03:09 CET 2015
# HG changeset patch
# User Ashok Kumar Mishra<ashok at multicorewareinc.com>
# Date 1446119115 -19800
# Thu Oct 29 17:15:15 2015 +0530
# Node ID 4a273947c8d54b4de3c05e0e04c9c915f554e6e5
# Parent f722fb55404bb80b26a55ba0a0a1b98d8f20b362
SAO: initialize bottom and right line numbers to be skipped for SAO statistics calculation only once
diff -r f722fb55404b -r 4a273947c8d5 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Wed Nov 18 12:28:03 2015 +0530
+++ b/source/encoder/frameencoder.cpp Thu Oct 29 17:15:15 2015 +0530
@@ -1091,7 +1091,7 @@
/* SAO parameter estimation using non-deblocked pixels for CTU bottom and right boundary areas */
if (m_param->bEnableSAO && m_param->bSaoNonDeblocked)
- m_frameFilter.m_sao.calcSaoStatsCu_BeforeDblk(m_frame, col, row);
+ m_frameFilter.m_sao.calcPreDeblockSaoStatsCu(m_frame, col, row);
if (m_param->bEnableWavefront && curRow.completed >= 2 && row < m_numRows - 1 &&
(!m_bAllRowsStop || intRow + 1 < m_vbvResetTriggerRow))
diff -r f722fb55404b -r 4a273947c8d5 source/encoder/sao.cpp
--- a/source/encoder/sao.cpp Wed Nov 18 12:28:03 2015 +0530
+++ b/source/encoder/sao.cpp Thu Oct 29 17:15:15 2015 +0530
@@ -138,6 +138,68 @@
CHECKED_MALLOC(m_countPreDblk, PerPlane, numCtu);
CHECKED_MALLOC(m_offsetOrgPreDblk, PerPlane, numCtu);
+ for (int typeIdc = 0; typeIdc < MAX_NUM_SAO_TYPE; typeIdc++)
+ {
+ m_skipLinesR[TEXT_LUMA][typeIdc] = 5;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 3;
+
+ m_skipLinesB[TEXT_LUMA ][typeIdc] = 4;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 2;
+
+ if (!m_param->bSaoNonDeblocked)
+ {
+ for (int typeIdc = 0; typeIdc < MAX_NUM_SAO_TYPE; typeIdc++)
+ {
+ m_skipLinesR[TEXT_LUMA][typeIdc] = 5;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 3;
+
+ m_skipLinesB[TEXT_LUMA ][typeIdc] = 4;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 2;
+ }
+ }
+ else
+ {
+ for (int typeIdc = 0; typeIdc < MAX_NUM_SAO_TYPE; typeIdc++)
+ {
+ switch (typeIdc)
+ {
+ case SAO_EO_0:
+ m_skipLinesR[TEXT_LUMA ][typeIdc] = 5;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 3;
+
+ m_skipLinesB[TEXT_LUMA ][typeIdc] = 3;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 1;
+ break;
+ case SAO_EO_1:
+ m_skipLinesR[TEXT_LUMA][typeIdc] = 4;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 2;
+
+ m_skipLinesB[TEXT_LUMA][typeIdc] = 4;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 2;
+ break;
+ case SAO_EO_2:
+ case SAO_EO_3:
+ m_skipLinesR[TEXT_LUMA][typeIdc] = 5;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 3;
+
+ m_skipLinesB[TEXT_LUMA][typeIdc] = 4;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 2;
+ break;
+ case SAO_BO:
+ m_skipLinesR[TEXT_LUMA][typeIdc] = 4;
+ m_skipLinesR[TEXT_CHROMA_U][typeIdc] = m_skipLinesR[TEXT_CHROMA_V][typeIdc] = 2;
+
+ m_skipLinesB[TEXT_LUMA][typeIdc] = 3;
+ m_skipLinesB[TEXT_CHROMA_U][typeIdc] = m_skipLinesB[TEXT_CHROMA_V][typeIdc] = 1;
+ break;
+ default:
+ X265_CHECK(0, "Not a supported type");
+ break;
+ }
+ }
+ }
+ }
+
m_clipTable = &(m_clipTableBase[rangeExt]);
for (int i = 0; i < rangeExt; i++)
@@ -701,14 +763,9 @@
ctuWidth = rpelx - lpelx;
ctuHeight = bpely - tpely;
- int startX;
- int startY;
- int endX;
- int endY;
-
- const int plane_offset = plane ? 2 : 0;
- int skipB = 4;
- int skipR = 5;
+ int startX, startY, endX, endY;
+ int* skipLinesR = m_skipLinesR[plane];
+ int* skipLinesB = m_skipLinesB[plane];
int8_t _upBuff[2 * (MAX_CU_SIZE + 16 + 16)], *upBuff1 = _upBuff + 16, *upBufft = upBuff1 + (MAX_CU_SIZE + 16 + 16);
@@ -738,14 +795,8 @@
// SAO_BO:
{
- if (m_param->bSaoNonDeblocked)
- {
- skipB = 3;
- skipR = 4;
- }
-
- endX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipR + plane_offset;
- endY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipB + plane_offset;
+ endX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipLinesR[SAO_BO];
+ endY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipLinesB[SAO_BO];
primitives.saoCuStatsBO(diff, rec0, stride, endX, endY, m_offsetOrg[plane][SAO_BO], m_count[plane][SAO_BO]);
}
@@ -753,31 +804,19 @@
{
// SAO_EO_0: // dir: -
{
- if (m_param->bSaoNonDeblocked)
- {
- skipB = 3;
- skipR = 5;
- }
+ startX = !lpelx;
+ endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_0];
- startX = !lpelx;
- endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR + plane_offset;
-
- primitives.saoCuStatsE0(diff + startX, rec0 + startX, stride, endX - startX, ctuHeight - skipB + plane_offset, m_offsetOrg[plane][SAO_EO_0], m_count[plane][SAO_EO_0]);
+ primitives.saoCuStatsE0(diff + startX, rec0 + startX, stride, endX - startX, ctuHeight - skipLinesB[SAO_EO_0], m_offsetOrg[plane][SAO_EO_0], m_count[plane][SAO_EO_0]);
}
// SAO_EO_1: // dir: |
{
- if (m_param->bSaoNonDeblocked)
- {
- skipB = 4;
- skipR = 4;
- }
-
rec = rec0;
startY = !tpely;
- endX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipR + plane_offset;
- endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB + plane_offset;
+ endX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipLinesR[SAO_EO_1];
+ endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_1];
if (!tpely)
{
rec += stride;
@@ -790,20 +829,14 @@
// SAO_EO_2: // dir: 135
{
- if (m_param->bSaoNonDeblocked)
- {
- skipB = 4;
- skipR = 5;
- }
-
fenc = fenc0;
rec = rec0;
startX = !lpelx;
- endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR + plane_offset;
+ endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_2];
startY = !tpely;
- endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB + plane_offset;
+ endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_2];
if (!tpely)
{
fenc += stride;
@@ -817,20 +850,14 @@
// SAO_EO_3: // dir: 45
{
- if (m_param->bSaoNonDeblocked)
- {
- skipB = 4;
- skipR = 5;
- }
-
fenc = fenc0;
rec = rec0;
startX = !lpelx;
- endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR + plane_offset;
+ endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_3];
startY = !tpely;
- endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB + plane_offset;
+ endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_3];
if (!tpely)
{
@@ -845,11 +872,9 @@
}
}
-void SAO::calcSaoStatsCu_BeforeDblk(Frame* frame, int idxX, int idxY)
+void SAO::calcPreDeblockSaoStatsCu(Frame* frame, int idxX, int idxY)
{
int addr = idxX + m_numCuInWidth * idxY;
-
- int x, y;
const CUData* cu = frame->m_encData->getPicCTU(addr);
const PicYuv* reconPic = m_frame->m_reconPic;
const pixel* fenc;
@@ -866,16 +891,10 @@
ctuWidth = rpelx - lpelx;
ctuHeight = bpely - tpely;
- int startX;
- int startY;
- int endX;
- int endY;
- int firstX, firstY;
+ int startX, startY, endX, endY, firstX, firstY;
int32_t* stats;
int32_t* count;
- int skipB, skipR;
-
int32_t _upBuff1[MAX_CU_SIZE + 2], *upBuff1 = _upBuff1 + 1;
int32_t _upBufft[MAX_CU_SIZE + 2], *upBufft = _upBufft + 1;
@@ -884,7 +903,6 @@
memset(m_countPreDblk[addr], 0, sizeof(PerPlane));
memset(m_offsetOrgPreDblk[addr], 0, sizeof(PerPlane));
- int plane_offset = 0;
for (int plane = 0; plane < NUM_PLANE; plane++)
{
if (plane == 1)
@@ -900,11 +918,10 @@
bpely >>= m_vChromaShift;
}
+ int* skipLinesR = m_skipLinesR[plane];
+ int* skipLinesB = m_skipLinesB[plane];
+
// SAO_BO:
-
- skipB = 3 - plane_offset;
- skipR = 4 - plane_offset;
-
stats = m_offsetOrgPreDblk[addr][plane][SAO_BO];
count = m_countPreDblk[addr][plane][SAO_BO];
@@ -913,12 +930,12 @@
fenc = fenc0;
rec = rec0;
- startX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipR;
- startY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipB;
+ startX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipLinesR[SAO_BO];
+ startY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipLinesB[SAO_BO];
- for (y = 0; y < ctuHeight; y++)
+ for (int y = 0; y < ctuHeight; y++)
{
- for (x = (y < startY ? startX : 0); x < ctuWidth; x++)
+ for (int x = (y < startY ? startX : 0); x < ctuWidth; x++)
{
int classIdx = 1 + (rec[x] >> boShift);
stats[classIdx] += (fenc[x] - rec[x]);
@@ -931,24 +948,21 @@
// SAO_EO_0: // dir: -
{
- skipB = 3 - plane_offset;
- skipR = 5 - plane_offset;
-
stats = m_offsetOrgPreDblk[addr][plane][SAO_EO_0];
count = m_countPreDblk[addr][plane][SAO_EO_0];
fenc = fenc0;
rec = rec0;
- startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR;
- startY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipB;
+ startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_0];
+ startY = (bpely == picHeight) ? ctuHeight : ctuHeight - skipLinesB[SAO_EO_0];
firstX = !lpelx;
// endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth;
endX = ctuWidth - 1; // not refer right CTU
- for (y = 0; y < ctuHeight; y++)
+ for (int y = 0; y < ctuHeight; y++)
{
- x = (y < startY ? startX : firstX);
+ int x = (y < startY ? startX : firstX);
int signLeft = signOf(rec[x] - rec[x - 1]);
for (; x < endX; x++)
{
@@ -967,17 +981,14 @@
// SAO_EO_1: // dir: |
{
- skipB = 4 - plane_offset;
- skipR = 4 - plane_offset;
-
stats = m_offsetOrgPreDblk[addr][plane][SAO_EO_1];
count = m_countPreDblk[addr][plane][SAO_EO_1];
fenc = fenc0;
rec = rec0;
- startX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipR;
- startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB;
+ startX = (rpelx == picWidth) ? ctuWidth : ctuWidth - skipLinesR[SAO_EO_1];
+ startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_1];
firstY = !tpely;
// endY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight;
endY = ctuHeight - 1; // not refer below CTU
@@ -987,12 +998,12 @@
rec += stride;
}
- for (x = startX; x < ctuWidth; x++)
+ for (int x = startX; x < ctuWidth; x++)
upBuff1[x] = signOf(rec[x] - rec[x - stride]);
- for (y = firstY; y < endY; y++)
+ for (int y = firstY; y < endY; y++)
{
- for (x = (y < startY - 1 ? startX : 0); x < ctuWidth; x++)
+ for (int x = (y < startY - 1 ? startX : 0); x < ctuWidth; x++)
{
int signDown = signOf(rec[x] - rec[x + stride]);
int edgeType = signDown + upBuff1[x] + 2;
@@ -1012,17 +1023,14 @@
// SAO_EO_2: // dir: 135
{
- skipB = 4 - plane_offset;
- skipR = 5 - plane_offset;
-
stats = m_offsetOrgPreDblk[addr][plane][SAO_EO_2];
count = m_countPreDblk[addr][plane][SAO_EO_2];
fenc = fenc0;
rec = rec0;
- startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR;
- startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB;
+ startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_2];
+ startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_2];
firstX = !lpelx;
firstY = !tpely;
// endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth;
@@ -1035,12 +1043,12 @@
rec += stride;
}
- for (x = startX; x < endX; x++)
+ for (int x = startX; x < endX; x++)
upBuff1[x] = signOf(rec[x] - rec[x - stride - 1]);
- for (y = firstY; y < endY; y++)
+ for (int y = firstY; y < endY; y++)
{
- x = (y < startY - 1 ? startX : firstX);
+ int x = (y < startY - 1 ? startX : firstX);
upBufft[x] = signOf(rec[x + stride] - rec[x - 1]);
for (; x < endX; x++)
{
@@ -1064,17 +1072,14 @@
// SAO_EO_3: // dir: 45
{
- skipB = 4 - plane_offset;
- skipR = 5 - plane_offset;
-
stats = m_offsetOrgPreDblk[addr][plane][SAO_EO_3];
count = m_countPreDblk[addr][plane][SAO_EO_3];
fenc = fenc0;
rec = rec0;
- startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipR;
- startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipB;
+ startX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth - skipLinesR[SAO_EO_3];
+ startY = (bpely == picHeight) ? ctuHeight - 1 : ctuHeight - skipLinesB[SAO_EO_3];
firstX = !lpelx;
firstY = !tpely;
// endX = (rpelx == picWidth) ? ctuWidth - 1 : ctuWidth;
@@ -1087,12 +1092,12 @@
rec += stride;
}
- for (x = startX - 1; x < endX; x++)
+ for (int x = startX - 1; x < endX; x++)
upBuff1[x] = signOf(rec[x] - rec[x - stride + 1]);
- for (y = firstY; y < endY; y++)
+ for (int y = firstY; y < endY; y++)
{
- for (x = (y < startY - 1 ? startX : firstX); x < endX; x++)
+ for (int x = (y < startY - 1 ? startX : firstX); x < endX; x++)
{
int signDown = signOf(rec[x] - rec[x + stride - 1]);
int edgeType = signDown + upBuff1[x] + 2;
@@ -1111,7 +1116,6 @@
fenc += stride;
}
}
- plane_offset = 2;
}
}
diff -r f722fb55404b -r 4a273947c8d5 source/encoder/sao.h
--- a/source/encoder/sao.h Wed Nov 18 12:28:03 2015 +0530
+++ b/source/encoder/sao.h Thu Oct 29 17:15:15 2015 +0530
@@ -97,6 +97,9 @@
pixel* m_tmpL1;
pixel* m_tmpL2;
+ int m_skipLinesR[MAX_NUM_COMPONENT][MAX_NUM_SAO_TYPE];
+ int m_skipLinesB[MAX_NUM_COMPONENT][MAX_NUM_SAO_TYPE];
+
public:
struct SAOContexts
@@ -136,7 +139,7 @@
void copySaoUnit(SaoCtuParam* saoUnitDst, const SaoCtuParam* saoUnitSrc);
void calcSaoStatsCu(int addr, int plane);
- void calcSaoStatsCu_BeforeDblk(Frame* pic, int idxX, int idxY);
+ void calcPreDeblockSaoStatsCu(Frame* pic, int idxX, int idxY);
void saoComponentParamDist(SAOParam* saoParam, int addr, int addrUp, int addrLeft, SaoCtuParam mergeSaoParam[2], double* mergeDist);
void sao2ChromaParamDist(SAOParam* saoParam, int addr, int addrUp, int addrLeft, SaoCtuParam mergeSaoParam[][2], double* mergeDist);
More information about the x265-devel
mailing list