[x265] [PATCH] SAO: initialize bottom and right line numbers to be skipped for SAO statistics calculation only once
Ashok Kumar Mishra
ashok at multicorewareinc.com
Thu Nov 19 12:32:28 CET 2015
Please ignore the this patch. I'll resend this patch with few minor
corrections.
Thanks
Ashok
On Thu, Nov 19, 2015 at 3:33 PM, <ashok at multicorewareinc.com> wrote:
> # 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);
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20151119/a8d1a7a3/attachment-0001.html>
More information about the x265-devel
mailing list