[x265] [PATCH] histscenecut: Fixes Segmentation fault for 16bpp build in Windows/Mac

Srikanth Kurapati srikanth.kurapati at multicorewareinc.com
Tue Feb 11 07:05:11 CET 2020


Yes. I have corrected the commit message.

On Thu, Feb 6, 2020 at 9:42 AM Aruna Matheswaran <aruna at multicorewareinc.com>
wrote:

> On Thu, Jan 30, 2020 at 10:57 AM <srikanth.kurapati at multicorewareinc.com>
> wrote:
>
>> # HG changeset patch
>> # User Srikanth Kurapati
>> # Date 1580113966 -19800
>> #      Mon Jan 27 14:02:46 2020 +0530
>> # Node ID 4da3cbc7346953a596e5b208be3607037b67307c
>> # Parent  802600c8e5dcc1eff03725af6f399a72c09d24f6
>> histscenecut: Fixes Segmentation fault for 16bpp build in Windows/Mac.
>>
>
>  From your fix, it looks like the issue is OS agnostic. Please clarify.
>
>>
>> Adds functionality to handle mismatch of bit depths between encoder and
>> input for
>> histogram based scenecut method.
>>
>> diff -r 802600c8e5dc -r 4da3cbc73469 source/encoder/encoder.cpp
>> --- a/source/encoder/encoder.cpp        Sat Jan 25 18:08:03 2020 +0530
>> +++ b/source/encoder/encoder.cpp        Mon Jan 27 14:02:46 2020 +0530
>> @@ -220,9 +220,9 @@
>>      {
>>          for (int i = 0; i < x265_cli_csps[m_param->internalCsp].planes;
>> i++)
>>          {
>> -            m_planeSizes[i] = m_param->sourceWidth *
>> m_param->sourceHeight >> x265_cli_csps[m_param->internalCsp].height[i];
>> -        }
>> -        uint32_t pixelbytes = m_param->sourceBitDepth > 8 ? 2 : 1;
>> +            m_planeSizes[i] = (m_param->sourceWidth >>
>> x265_cli_csps[p->internalCsp].width[i]) * (m_param->sourceHeight >>
>> x265_cli_csps[m_param->internalCsp].height[i]);
>> +        }
>> +        uint32_t pixelbytes = m_param->internalBitDepth > 8 ? 2 : 1;
>>          m_edgePic = X265_MALLOC(pixel, m_planeSizes[0] * pixelbytes);
>>          m_edgeHistThreshold = m_param->edgeTransitionThreshold;
>>          m_chromaHistThreshold = m_edgeHistThreshold * 10.0;
>> @@ -231,6 +231,23 @@
>>          m_scaledEdgeThreshold = x265_min(m_scaledEdgeThreshold,
>> MAX_SCENECUT_THRESHOLD);
>>          m_scaledChromaThreshold = m_chromaHistThreshold *
>> SCENECUT_STRENGTH_FACTOR;
>>          m_scaledChromaThreshold = x265_min(m_scaledChromaThreshold,
>> MAX_SCENECUT_THRESHOLD);
>> +        if (!(m_param->sourceBitDepth == 8 && m_param->internalBitDepth
>> == 8))
>> +        {
>>
> +            int size = m_param->sourceWidth * m_param->sourceHeight;
>> +            int hshift = CHROMA_H_SHIFT(m_param->internalCsp);
>> +            int vshift = CHROMA_V_SHIFT(m_param->internalCsp);
>> +            int widthC = m_param->sourceWidth >> hshift;
>> +            int heightC = m_param->sourceHeight >> vshift;
>> +
>> +            m_inputPic[0] = X265_MALLOC(pixel, size);
>> +            if (m_param->internalCsp != X265_CSP_I400)
>> +            {
>> +                for (int j = 1; j < 3; j++)
>> +                {
>> +                    m_inputPic[j] = X265_MALLOC(pixel, widthC * heightC);
>> +                }
>> +            }
>> +        }
>>      }
>>
>>      // Do not allow WPP if only one row or fewer than 3 columns, it is
>> pointless and unstable
>> @@ -874,6 +891,21 @@
>>          {
>>              X265_FREE_ZERO(m_edgePic);
>>          }
>> +
>> +        if (!(m_param->sourceBitDepth == 8 && m_param->internalBitDepth
>> == 8))
>> +        {
>> +            for (int i = 0; i < 3; i++)
>> +            {
>> +                if (i == 0)
>> +                {
>> +                    X265_FREE_ZERO(m_inputPic[i]);
>> +                }
>> +                else if (i >= 1 && m_param->internalCsp != X265_CSP_I400)
>> +                {
>> +                    X265_FREE_ZERO(m_inputPic[i]);
>> +                }
>> +            }
>> +        }
>>      }
>>
>>      for (int i = 0; i < m_param->frameNumThreads; i++)
>> @@ -1337,11 +1369,87 @@
>>
>>  bool Encoder::computeHistograms(x265_picture *pic)
>>  {
>> -    pixel *src = (pixel *) pic->planes[0];
>> +    pixel *src = NULL, *planeV = NULL, *planeU = NULL;
>> +    uint32_t widthC, heightC;
>> +    int hshift, vshift;
>> +
>> +    hshift = CHROMA_H_SHIFT(pic->colorSpace);
>> +    vshift = CHROMA_V_SHIFT(pic->colorSpace);
>> +    widthC = pic->width >> hshift;
>> +    heightC = pic->height >> vshift;
>> +
>> +    if (pic->bitDepth == 8 && X265_DEPTH == 8)
>> +    {
>> +        src = (pixel*)pic->planes[0];
>> +        if (m_param->internalCsp != X265_CSP_I400)
>> +        {
>> +            planeU = (pixel*)pic->planes[1];
>> +            planeV = (pixel*)pic->planes[2];
>> +        }
>> +    }
>> +    else if (pic->bitDepth == 8 && X265_DEPTH > 8)
>> +    {
>> +        int shift = (X265_DEPTH - 8);
>> +        uint8_t *yChar, *uChar, *vChar;
>> +
>> +        yChar = (uint8_t*)pic->planes[0];
>> +        primitives.planecopy_cp(yChar, pic->stride[0] / sizeof(*yChar),
>> m_inputPic[0], pic->stride[0] / sizeof(*yChar), pic->width, pic->height,
>> shift);
>> +
>> +        if (m_param->internalCsp != X265_CSP_I400)
>> +        {
>> +            uChar = (uint8_t*)pic->planes[1];
>> +            vChar = (uint8_t*)pic->planes[2];
>> +            primitives.planecopy_cp(uChar, pic->stride[1] /
>> sizeof(*uChar), m_inputPic[1], pic->stride[1] / sizeof(*uChar), widthC,
>> heightC, shift);
>> +            primitives.planecopy_cp(vChar, pic->stride[2] /
>> sizeof(*vChar), m_inputPic[2], pic->stride[2] / sizeof(*vChar), widthC,
>> heightC, shift);
>> +        }
>> +    }
>> +    else
>> +    {
>> +        uint16_t *yShort, *uShort, *vShort;
>> +        /* mask off bits that are supposed to be zero */
>> +        uint16_t mask = (1 << X265_DEPTH) - 1;
>> +        int shift = abs(pic->bitDepth - X265_DEPTH);
>> +
>> +        yShort = (uint16_t*)pic->planes[0];
>> +        if (pic->bitDepth > X265_DEPTH)
>> +        {
>> +            /* shift right and mask pixels to final size */
>> +            primitives.planecopy_sp(yShort, pic->stride[0] /
>> sizeof(*yShort), m_inputPic[0], pic->stride[0] / sizeof(*yShort),
>> pic->width, pic->height, shift, mask);
>> +        }
>> +        else /* Case for (pic.bitDepth <= X265_DEPTH) */
>> +        {
>> +            /* shift left and mask pixels to final size */
>> +            primitives.planecopy_sp_shl(yShort, pic->stride[0] /
>> sizeof(*yShort), m_inputPic[0], pic->stride[0] / sizeof(*yShort),
>> pic->width, pic->height, shift, mask);
>> +        }
>> +
>> +        if (m_param->internalCsp != X265_CSP_I400)
>> +        {
>> +            uShort = (uint16_t*)pic->planes[1];
>> +            vShort = (uint16_t*)pic->planes[2];
>> +
>> +            if (pic->bitDepth > X265_DEPTH)
>> +            {
>> +                primitives.planecopy_sp(uShort, pic->stride[1] /
>> sizeof(*uShort), m_inputPic[1], pic->stride[1] / sizeof(*uShort), widthC,
>> heightC, shift, mask);
>> +                primitives.planecopy_sp(vShort, pic->stride[2] /
>> sizeof(*vShort), m_inputPic[2], pic->stride[2] / sizeof(*vShort), widthC,
>> heightC, shift, mask);
>> +            }
>> +            else /* Case for (pic.bitDepth <= X265_DEPTH) */
>> +            {
>> +                primitives.planecopy_sp_shl(uShort, pic->stride[1] /
>> sizeof(*uShort), m_inputPic[1], pic->stride[1] / sizeof(*uShort), widthC,
>> heightC, shift, mask);
>> +                primitives.planecopy_sp_shl(vShort, pic->stride[2] /
>> sizeof(*vShort), m_inputPic[2], pic->stride[2] / sizeof(*vShort), widthC,
>> heightC, shift, mask);
>> +            }
>> +        }
>> +    }
>> +
>> +    if (!(pic->bitDepth == 8 && X265_DEPTH == 8))
>> +    {
>> +        src = m_inputPic[0];
>> +        planeU = m_inputPic[1];
>> +        planeV = m_inputPic[2];
>> +    }
>> +
>>      size_t bufSize = sizeof(pixel) * m_planeSizes[0];
>>      int32_t planeCount = x265_cli_csps[m_param->internalCsp].planes;
>> -    int32_t numBytes = m_param->sourceBitDepth > 8 ? 2 : 1;
>> -    memset(m_edgePic, 0, bufSize * numBytes);
>> +    memset(m_edgePic, 0, bufSize);
>>
>>      if (!computeEdge(m_edgePic, src, NULL, pic->width, pic->height,
>> pic->width, false))
>>      {
>> @@ -1350,10 +1458,9 @@
>>      }
>>
>>      pixel pixelVal;
>> -    int64_t size = pic->height * (pic->stride[0] >> SHIFT);
>>      int32_t *edgeHist = m_curEdgeHist;
>>      memset(edgeHist, 0, 2 * sizeof(int32_t));
>> -    for (int64_t i = 0; i < size; i++)
>> +    for (int64_t i = 0; i < m_planeSizes[0]; i++)
>>      {
>>          if (!m_edgePic[i])
>>             edgeHist[0]++;
>> @@ -1364,16 +1471,12 @@
>>      if (pic->colorSpace != X265_CSP_I400)
>>      {
>>          /* U Histogram Calculation */
>> -        int32_t HeightL = (pic->height >>
>> x265_cli_csps[pic->colorSpace].height[1]);
>> -        size = HeightL * (pic->stride[1] >> SHIFT);
>>          int32_t *uHist = m_curUVHist[0];
>> -        pixel *chromaPlane = (pixel *) pic->planes[1];
>> -
>>          memset(uHist, 0, HISTOGRAM_BINS * sizeof(int32_t));
>>
>> -        for (int64_t i = 0; i < size; i++)
>> -        {
>> -            pixelVal = chromaPlane[i];
>> +        for (int64_t i = 0; i < m_planeSizes[1]; i++)
>> +        {
>> +            pixelVal = planeU[i];
>>              uHist[pixelVal]++;
>>          }
>>
>> @@ -1381,15 +1484,12 @@
>>          if (planeCount == 3)
>>          {
>>              pixelVal = 0;
>> -            int32_t heightV = (pic->height >>
>> x265_cli_csps[pic->colorSpace].height[2]);
>> -            size = heightV * (pic->stride[2] >> SHIFT);
>>              int32_t *vHist = m_curUVHist[1];
>> -            chromaPlane = (pixel *) pic->planes[2];
>> -
>>              memset(vHist, 0, HISTOGRAM_BINS * sizeof(int32_t));
>> -            for (int64_t i = 0; i < size; i++)
>> +
>> +            for (int64_t i = 0; i < m_planeSizes[2]; i++)
>>              {
>> -                pixelVal = chromaPlane[i];
>> +                pixelVal = planeV[i];
>>                  vHist[pixelVal]++;
>>              }
>>              for (int i = 0; i < HISTOGRAM_BINS; i++)
>> @@ -1402,6 +1502,7 @@
>>              memcpy(m_curMaxUVHist, m_curUVHist[0], HISTOGRAM_BINS *
>> sizeof(int32_t));
>>          }
>>      }
>> +
>>      return true;
>>  }
>>
>> diff -r 802600c8e5dc -r 4da3cbc73469 source/encoder/encoder.h
>> --- a/source/encoder/encoder.h  Sat Jan 25 18:08:03 2020 +0530
>> +++ b/source/encoder/encoder.h  Mon Jan 27 14:02:46 2020 +0530
>> @@ -255,6 +255,7 @@
>>
>>      /* For histogram based scene-cut detection */
>>      pixel*             m_edgePic;
>> +    pixel*             m_inputPic[3];
>>      int32_t            m_curUVHist[2][HISTOGRAM_BINS];
>>      int32_t            m_curMaxUVHist[HISTOGRAM_BINS];
>>      int32_t            m_prevMaxUVHist[HISTOGRAM_BINS];
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> --
> Regards,
> *Aruna Matheswaran,*
> Video Codec Engineer,
> Media & AI analytics BU,
>
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>


-- 
*With Regards,*
*Srikanth Kurapati.*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200211/71d12ab5/attachment-0001.html>


More information about the x265-devel mailing list