[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