[x265] [PATCH 5 of 5] integrated ssim computation for each CTURow

Steve Borho steve at borho.org
Mon Sep 30 22:14:18 CEST 2013


On Fri, Sep 27, 2013 at 11:52 PM, Aarthi Thirumalai <
aarthi at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Aarthi Thirumalai
> # Date 1380343885 -19800
> #      Sat Sep 28 10:21:25 2013 +0530
> # Node ID b1539ccab7bab1708433a9b8b18f5f8c090b1810
> # Parent  a8b00de495520f00a4648dac5d111e40b5570ca3
> integrated ssim computation for each CTURow
>
> diff -r a8b00de49552 -r b1539ccab7ba source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Sat Sep 28 10:18:23 2013 +0530
> +++ b/source/encoder/frameencoder.cpp   Sat Sep 28 10:21:25 2013 +0530
> @@ -91,6 +91,9 @@
>          delete[] m_rows;
>      }
>
> +    if (tempBuf)
>

X265_FREE does the NULL check for you


> +        X265_FREE(tempBuf);
> +
>      m_frameFilter.destroy();
>
>      // wait for worker thread to exit
> @@ -106,6 +109,8 @@
>                          2 : (m_cfg->param.bEnableSAO ||
> m_cfg->param.bEnableLoopFilter ? 1 : 0);
>
>      m_rows = new CTURow[m_numRows];
> +    if(m_cfg->param.bEnableSsim)
>

white-space


> +        CHECKED_MALLOC(tempBuf, int, m_cfg->param.bEnableSsim * 8 *
> (m_cfg->param.sourceWidth/4 + 3));
>      for (int i = 0; i < m_numRows; ++i)
>      {
>          m_rows[i].create(top);
> @@ -168,6 +173,8 @@
>          assert(0);
>      }
>      start();
> +fail:
> +    return;
>  }
>
>  int FrameEncoder::getStreamHeaders(NALUnitEBSP **nalunits)
> @@ -540,6 +547,31 @@
>          slice->setSaoEnabledFlag((saoParam->bSaoFlag[0] == 1) ? true :
> false);
>      }
>
> +    /*Compute SSIM if enabled*/
> +       if(m_cfg->param.bEnableSsim)
>
white-space

> +       {
> +            pixel *rec = (pixel*)m_pic->getPicYuvRec()->getLumaAddr();
> +            pixel *org = (pixel*)m_pic->getPicYuvOrg()->getLumaAddr();
> +            int stride = m_pic->getPicYuvOrg()->getStride();
> +           for(int row = 0; row < m_numRows; row++)
> +           {
> +               int bEnd = ((row + 1) == (this->m_numRows - 1));
> +               int bStart = (row == 0);
> +               int minPixY = row * 64 - 4 * !bStart;
> +               int maxPixY = (row + 1)* 64 - 4 * !bEnd;
> +               int ssim_cnt;
> +               x265_emms();
> +               /* offset by 2 pixels to avoid alignment of ssim blocks
> with dct blocks,
> +               * and overlap by 4 */
>

do you understand what this comment implies?  I don't and we probably should


> +                minPixY += bStart ? 2 : -6;
> +                slice->m_ssim +=
> +                calculateSSIM(
> +                rec + 2 + minPixY * stride, stride,
> +                org + 2 + minPixY * stride, stride,
> +                m_cfg->param.sourceWidth-2, maxPixY - minPixY, tempBuf,
> &ssim_cnt );
>

formatting


> +                slice->m_ssimCnt += ssim_cnt;
> +            }
> +       }
>      entropyCoder->setBitstream(NULL);
>
>      // Reconstruction slice
> @@ -687,6 +719,38 @@
>      delete bitstreamRedirect;
>  }
>
> +/* Function to calculate SSIM for each row */
> +float FrameEncoder::calculateSSIM( pixel *pix1, intptr_t stride1,
> +                                   pixel *pix2, intptr_t stride2,
> +                                   int width, int height, void *buf, int
> *cnt )
>
coding-style

> +{
> +    int z = 0;
> +    float ssim = 0.0;
> +    int (*sum0)[4] = (int (*)[4]) buf;
> +    int (*sum1)[4] = sum0 + (width >> 2) + 3;
> +    width >>= 2;
> +    height >>= 2;
> +    for( int y = 1; y < height; y++ )
> +    {
> +        for( ; z <= y; z++ )
> +        {
> +            void* swap = sum0;
> +            sum0 = sum1;
> +            sum1 = (int (*)[4])swap;
> +            for( int x = 0; x < width; x+=2 )
> +            {
> +                if(m_pic->getPicYuvRec() == 0 || x== 98){
> +                    int nullaalret = 1; nullaalret++;
> +                }
> +                primitives.ssim4x4x2Core( &pix1[4*(x+z*stride1)],
> stride1, &pix2[4*(x+z*stride2)], stride2, &sum0[x] );
> +            }
> +        }
> +        for( int x = 0; x < width-1; x += 4 )
> +            ssim += primitives.ssimEnd4( sum0+x, sum1+x,
> X265_MIN(4,width-x-1) );
> +    }
> +    *cnt = (height-1) * (width-1);
> +    return ssim;
> +}
>  void FrameEncoder::encodeSlice(TComOutputBitstream* substreams)
>  {
>      // choose entropy coder
> diff -r a8b00de49552 -r b1539ccab7ba source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h     Sat Sep 28 10:18:23 2013 +0530
> +++ b/source/encoder/frameencoder.h     Sat Sep 28 10:21:25 2013 +0530
> @@ -153,6 +153,10 @@
>      // worker thread
>      void threadMain();
>
> +    /* called by compressFrame to calculate SSIM for each row after
> applying deblock filter and SAO. */
> +    float calculateSSIM(pixel *pix1, intptr_t stride1,pixel *pix2,
> intptr_t stride2,
> +                        int width, int height, void *buf, int *cnt );
> +
>      Event                    m_enable;
>      Event                    m_done;
>      bool                     m_threadActive;
> @@ -185,6 +189,9 @@
>      int                      m_filterRowDelay;
>      CTURow*                  m_rows;
>      Event                    m_completionEvent;
> +
> +    /* Temp Storage that doesnt need repeated malloc */
> +    void *                   tempBuf;
>  };
>  }
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>



-- 
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20130930/9f94de1f/attachment-0001.html>


More information about the x265-devel mailing list