[x265] [PATCH] Fix memory leak in hdr10plus

Pradeep Ramachandran pradeep at multicorewareinc.com
Mon Jul 24 08:22:11 CEST 2017


On Mon, Jul 24, 2017 at 11:08 AM, <bhavna at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Bhavna Hariharan <bhavna at multicorewareinc.com>
> # Date 1500874610 -19800
> #      Mon Jul 24 11:06:50 2017 +0530
> # Branch stable
> # Node ID c28a95a9ebbf5bf6bb5c9a357fc11e3c3bdea35c
> # Parent  bce945545c241ce4bb87d56d283ac8226d862ed5
> Fix memory leak in hdr10plus
>

> Rename numCimInfo and cim to m_numCimInfo and m_cim respectively.
>
> Fixes memory leaks cause due to incorrect handling of m_cim and m_userSEI
> memory allocation.
>
> Handle crash when empty json file is parsed.
>

Pushed on appropriate parent in stable branch and merged with latest stable
and default tips.


>
> diff -r bce945545c24 -r c28a95a9ebbf source/dynamicHDR10/JsonHelper.cpp
> --- a/source/dynamicHDR10/JsonHelper.cpp        Wed Jun 07 16:29:15 2017
> +0530
> +++ b/source/dynamicHDR10/JsonHelper.cpp        Mon Jul 24 11:06:50 2017
> +0530
> @@ -188,9 +188,15 @@
>
>      tfile.close();
>
> -    size_t beginning = json_str2.find_first_of("[");
> -    int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0;
> -    return Json::parse(json_str2.substr(beginning,json_str2.size() -
> fixchar),err).array_items();
> +    vector<Json> data;
> +    if (json_str2.size() != 0)
> +    {
> +        size_t beginning = json_str2.find_first_of("[");
> +        int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0;
> +        return Json::parse(json_str2.substr(beginning, json_str2.size()
> - fixchar), err).array_items();
> +    }
> +    else
> +        return data;
>  }
>
>  bool JsonHelper::validatePathExtension(string &path)
> diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Wed Jun 07 16:29:15 2017 +0530
> +++ b/source/encoder/encoder.cpp        Mon Jul 24 11:06:50 2017 +0530
> @@ -88,8 +88,8 @@
>
>  #if ENABLE_DYNAMIC_HDR10
>      m_hdr10plus_api = hdr10plus_api_get();
> -    numCimInfo = 0;
> -    cim = NULL;
> +    m_numCimInfo = 0;
> +    m_cim = NULL;
>  #endif
>
>      m_prevTonemapPayload.payload = NULL;
> @@ -403,6 +403,11 @@
>      m_nalList.m_annexB = !!m_param->bAnnexB;
>
>      m_emitCLLSEI = p->maxCLL || p->maxFALL;
> +
> +#if ENABLE_DYNAMIC_HDR10
> +    if (m_bToneMap)
> +        m_numCimInfo = m_hdr10plus_api->hdr10plus_
> json_to_movie_cim(m_param->toneMapFile, m_cim);
> +#endif
>  }
>
>  void Encoder::stopJobs()
> @@ -434,7 +439,8 @@
>  void Encoder::destroy()
>  {
>  #if ENABLE_DYNAMIC_HDR10
> -    m_hdr10plus_api->hdr10plus_clear_movie(cim, numCimInfo);
> +    if (m_bToneMap)
> +        m_hdr10plus_api->hdr10plus_clear_movie(m_cim, m_numCimInfo);
>  #endif
>
>      if (m_exportedPic)
> @@ -610,19 +616,18 @@
>  #if ENABLE_DYNAMIC_HDR10
>          if (m_bToneMap)
>          {
> -            if (pic_in->poc == 0)
> -                numCimInfo = m_hdr10plus_api->hdr10plus_
> json_to_movie_cim(m_param->toneMapFile, cim);
> -            if (pic_in->poc < numCimInfo)
> +            int currentPOC = m_pocLast + 1;
> +            if (currentPOC < m_numCimInfo)
>              {
>                  int32_t i = 0;
>                  toneMap.payloadSize = 0;
> -                while (cim[pic_in->poc][i] == 0xFF)
> -                    toneMap.payloadSize += cim[pic_in->poc][i++] + 1;
> -                toneMap.payloadSize += cim[pic_in->poc][i] + 1;
> +                while (m_cim[currentPOC][i] == 0xFF)
> +                    toneMap.payloadSize += m_cim[currentPOC][i++] + 1;
> +                toneMap.payloadSize += m_cim[currentPOC][i] + 1;
>
>                  toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t)
> * toneMap.payloadSize);
>                  toneMap.payloadType = USER_DATA_REGISTERED_ITU_T_T35;
> -                memcpy(toneMap.payload, cim[pic_in->poc],
> toneMap.payloadSize);
> +                memcpy(toneMap.payload, m_cim[currentPOC],
> toneMap.payloadSize);
>              }
>          }
>  #endif
> @@ -716,7 +721,12 @@
>
>          if (inFrame->m_userSEI.numPayloads)
>          {
> -            inFrame->m_userSEI.payloads = new
> x265_sei_payload[numPayloads];
> +            if (!inFrame->m_userSEI.payloads)
> +            {
> +                inFrame->m_userSEI.payloads = new
> x265_sei_payload[numPayloads];
> +                for (int i = 0; i < numPayloads; i++)
> +                    inFrame->m_userSEI.payloads[i].payload = NULL;
> +            }
>              for (int i = 0; i < numPayloads; i++)
>              {
>                  x265_sei_payload input;
> @@ -726,7 +736,8 @@
>                      input = pic_in->userSEI.payloads[i];
>                  int size = inFrame->m_userSEI.payloads[i].payloadSize =
> input.payloadSize;
>                  inFrame->m_userSEI.payloads[i].payloadType =
> input.payloadType;
> -                inFrame->m_userSEI.payloads[i].payload = new
> uint8_t[size];
> +                if (!inFrame->m_userSEI.payloads[i].payload)
> +                    inFrame->m_userSEI.payloads[i].payload = new
> uint8_t[size];
>                  memcpy(inFrame->m_userSEI.payloads[i].payload,
> input.payload, size);
>              }
>              if (toneMap.payload)
> diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.h
> --- a/source/encoder/encoder.h  Wed Jun 07 16:29:15 2017 +0530
> +++ b/source/encoder/encoder.h  Mon Jul 24 11:06:50 2017 +0530
> @@ -178,8 +178,8 @@
>
>  #ifdef ENABLE_DYNAMIC_HDR10
>      const hdr10plus_api     *m_hdr10plus_api;
> -    uint8_t                 **cim;
> -    int                     numCimInfo;
> +    uint8_t                 **m_cim;
> +    int                     m_numCimInfo;
>  #endif
>
>      x265_sei_payload        m_prevTonemapPayload;
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20170724/795795bf/attachment.html>


More information about the x265-devel mailing list