[x265] [PATCH] Encoder: Removed STL Container Classes and Replaced with Non STL Classes

Steve Borho steve at borho.org
Wed Sep 4 18:19:57 CEST 2013


On Wed, Sep 4, 2013 at 5:20 AM, Gopu Govindaswamy <gopu at multicorewareinc.com
> wrote:

> # HG changeset patch
> # User Gopu Govindaswamy <gopu at multicorewareinc.com>
> # Date 1378290027 -19800
> # Node ID c35e5d8148f07bd13297cc7daa0c9b4f9e288f6a
> # Parent  06862133aeccae74f24b792e1df45e81188f6d0e
> Encoder: Removed STL Container Classes and Replaced with Non STL Classes
>
> diff -r 06862133aecc -r c35e5d8148f0 source/Lib/TLibCommon/CommonDef.h
> --- a/source/Lib/TLibCommon/CommonDef.h Wed Sep 04 13:25:03 2013 +0530
> +++ b/source/Lib/TLibCommon/CommonDef.h Wed Sep 04 15:50:27 2013 +0530
> @@ -148,10 +148,12 @@
>  // for use in HM, replaces old xMalloc/xFree macros
>  #define X265_MALLOC(type, count)    x265_malloc(sizeof(type) * (count))
>  #define X265_FREE(ptr)              x265_free(ptr)
> +#define X265_REALLOC(Address, type, count)  x265_realloc(Address,
> sizeof(type) * (count))
>
>  // new code can use these functions directly
>  extern void  x265_free(void *);
>  extern void *x265_malloc(size_t size);
> +extern void *x265_realloc(void *, size_t size);
>
>  //
> ====================================================================================================================
>  // Coding tool configuration
> diff -r 06862133aecc -r c35e5d8148f0 source/common/common.cpp
> --- a/source/common/common.cpp  Wed Sep 04 13:25:03 2013 +0530
> +++ b/source/common/common.cpp  Wed Sep 04 15:50:27 2013 +0530
> @@ -61,6 +61,11 @@
>      return _aligned_malloc(size, ALIGNBYTES);
>  }
>
> +void *x265_realloc(void *startAddr, size_t size)
> +{
> +    return _aligned_realloc(startAddr,size, ALIGNBYTES);
> +}
> +
>  void x265_free(void *ptr)
>  {
>      if (ptr) _aligned_free(ptr);
> @@ -88,27 +93,27 @@
>  {
>      if (level > param->logLevel)
>          return;
> -    std::string log_level;
> +    char log_level[25];
>

this can be done with a simple const char *.  strcpy() is not required


>      switch (level)
>      {
>      case X265_LOG_ERROR:
> -        log_level = "error";
> +        strcpy(log_level,"error");
>          break;
>      case X265_LOG_WARNING:
> -        log_level = "warning";
> +        strcpy(log_level, "warning");
>          break;
>      case X265_LOG_INFO:
> -        log_level = "info";
> +        strcpy(log_level, "info");
>          break;
>      case X265_LOG_DEBUG:
> -        log_level = "debug";
> +        strcpy(log_level, "debug");
>          break;
>      default:
> -        log_level = "unknown";
> +        strcpy(log_level, "unknown");
>          break;
>      }
>
> -    fprintf(stderr, "x265 [%s]: ", log_level.c_str());
> +    fprintf(stderr, "x265 [%s]: ", log_level);
>      va_list arg;
>      va_start(arg, fmt);
>      vfprintf(stderr, fmt, arg);
> diff -r 06862133aecc -r c35e5d8148f0 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Wed Sep 04 13:25:03 2013 +0530
> +++ b/source/encoder/encoder.cpp        Wed Sep 04 15:50:27 2013 +0530
> @@ -40,18 +40,28 @@
>  struct x265_t : public TEncTop
>  {
>      x265_t();
> +    ~x265_t();
>
> -    std::vector<x265_nal_t> m_nals;
> -    std::string             m_packetData;
> -
> +    x265_nal_t *m_nals;
> +    char *m_packetData;
> +
>      void configure(x265_param_t *param);
>      void determineLevelAndProfile(x265_param_t *param);
>  };
>
>  x265_t::x265_t()
>  {
> -    m_packetData.reserve(4096);
> -    m_nals.reserve(4);
> +    m_nals = (x265_nal_t *) X265_MALLOC(x265_nal_t, 1);
> +    m_packetData = (char *) X265_MALLOC(char, 1);
> +}
> +
> +x265_t::~x265_t()
> +{
> +    if (m_packetData)
> +        X265_FREE(m_packetData);
> +
> +    if(m_nals)
> +        X265_FREE(m_nals);
>  }
>
>  void x265_t::determineLevelAndProfile(x265_param_t *_param)
> @@ -324,10 +334,20 @@
>
>      AccessUnit au;
>      if (encoder->getStreamHeaders(au) == 0)
> -    {
> -        encoder->m_nals.clear();
> -        encoder->m_packetData.clear();
> -
> +    {
> +        int memsize = 0;
> +        int nalcount = 0;
> +        for (AccessUnit::const_iterator t = au.begin(); t != au.end();
> t++)
> +        {
> +            const NALUnitEBSP& temp = **t;
> +            memsize += (int) temp.m_nalUnitData.str().size();
> +            nalcount++;
> +        }
> +        encoder->m_packetData = (char *)
> X265_REALLOC(encoder->m_packetData, char, memsize);
> +        encoder->m_nals = (x265_nal_t *) X265_REALLOC(encoder->m_nals,
> x265_nal_t, nalcount);
> +        nalcount = 0;
> +        memsize = 0;
> +
>          /* Copy NAL output packets into x265_nal_t structures */
>          for (AccessUnit::const_iterator it = au.begin(); it != au.end();
> it++)
>          {
> @@ -345,35 +365,34 @@
>                      *    unit of an access unit in decoding order, as
> specified by subclause
>                      *    7.4.1.2.3.
>                      */
> -                encoder->m_packetData.append(start_code_prefix, 4);
> +                ::memcpy(encoder->m_packetData + memsize,
> start_code_prefix, 4);
>                  size += 4;
>              }
>              else
>              {
> -                encoder->m_packetData.append(start_code_prefix + 1, 3);
> +                ::memcpy(encoder->m_packetData + memsize,
> start_code_prefix + 1, 3);
>                  size += 3;
>              }
> +            memsize += size;
>              size_t nalSize = nalu.m_nalUnitData.str().size();
> -
>  encoder->m_packetData.append(nalu.m_nalUnitData.str().c_str(), nalSize);
> -            size += (int)nalSize;
> +            ::memcpy(encoder->m_packetData + memsize,
> nalu.m_nalUnitData.str().c_str(), nalSize);
> +            size += (int)nalSize;
> +            memsize += (int)nalSize;
>
> -            x265_nal_t nal;
> -            nal.i_type = nalu.m_nalUnitType;
> -            nal.i_payload = size;
> -            encoder->m_nals.push_back(nal);
> +            encoder->m_nals[nalcount].i_type = nalu.m_nalUnitType;
> +            encoder->m_nals[nalcount].i_payload = size;
> +            nalcount++;
>          }
> -
> -        /* Setup payload pointers, now that we're done adding content to
> m_packetData */
> +
>          size_t offset = 0;
> -        for (size_t i = 0; i < encoder->m_nals.size(); i++)
> +        for (size_t i = 0; i < (size_t)nalcount; i++)
>          {
> -            x265_nal_t& nal = encoder->m_nals[i];
> -            nal.p_payload = (uint8_t*)encoder->m_packetData.c_str() +
> offset;
> -            offset += nal.i_payload;
> +            encoder->m_nals[i].p_payload =
> (uint8_t*)encoder->m_packetData + offset;
> +            offset += encoder->m_nals[i].i_payload;
>          }
>
>          *pp_nal = &encoder->m_nals[0];
> -        if (pi_nal) *pi_nal = (int)encoder->m_nals.size();
> +        if (pi_nal) *pi_nal = nalcount;
>          return 0;
>      }
>      else
> @@ -388,9 +407,21 @@
>      int numEncoded = encoder->encode(!pic_in, pic_in, pic_out, au);
>      if (pp_nal && numEncoded)
>      {
> -        encoder->m_nals.clear();
> -        encoder->m_packetData.clear();
> +        int memsize = 0;
> +        int nalcount = 0;
> +
> +        for (AccessUnit::const_iterator t = au.begin(); t != au.end();
> t++)
> +        {
> +            const NALUnitEBSP& temp = **t;
> +            memsize += (int) temp.m_nalUnitData.str().size();
> +            nalcount++;
> +        }
> +        encoder->m_packetData = (char *)
> X265_REALLOC(encoder->m_packetData, char, memsize);
> +        encoder->m_nals = (x265_nal_t *) X265_REALLOC(encoder->m_nals,
> x265_nal_t, nalcount);
>
> +        nalcount = 0;
> +        memsize = 0;
> +
>          /* Copy NAL output packets into x265_nal_t structures */
>          for (AccessUnit::const_iterator it = au.begin(); it != au.end();
> it++)
>          {
> @@ -408,35 +439,34 @@
>                      *    unit of an access unit in decoding order, as
> specified by subclause
>                      *    7.4.1.2.3.
>                      */
> -                encoder->m_packetData.append(start_code_prefix, 4);
> +                ::memcpy(encoder->m_packetData + memsize,
> start_code_prefix, 4);
>                  size += 4;
>              }
>              else
>              {
> -                encoder->m_packetData.append(start_code_prefix + 1, 3);
> +                ::memcpy(encoder->m_packetData + memsize,
> start_code_prefix + 1, 3);
>                  size += 3;
>              }
> +            memsize += size;
>              size_t nalSize = nalu.m_nalUnitData.str().size();
> -
>  encoder->m_packetData.append(nalu.m_nalUnitData.str().c_str(), nalSize);
> +            ::memcpy(encoder->m_packetData + memsize,
> nalu.m_nalUnitData.str().c_str(), nalSize);
>              size += (int)nalSize;
> +            memsize += (int)nalSize;
>
> -            x265_nal_t nal;
> -            nal.i_type = nalu.m_nalUnitType;
> -            nal.i_payload = size;
> -            encoder->m_nals.push_back(nal);
> +            encoder->m_nals[nalcount].i_type = nalu.m_nalUnitType;
> +            encoder->m_nals[nalcount].i_payload = size;
> +            nalcount++;
>          }
> -
> -        /* Setup payload pointers, now that we're done adding content to
> m_packetData */
> +
>          size_t offset = 0;
> -        for (size_t i = 0; i < encoder->m_nals.size(); i++)
> +        for (size_t i = 0; i < (size_t) nalcount; i++)
>          {
> -            x265_nal_t& nal = encoder->m_nals[i];
> -            nal.p_payload = (uint8_t*)encoder->m_packetData.c_str() +
> offset;
> -            offset += nal.i_payload;
> +            encoder->m_nals[i].p_payload =
> (uint8_t*)encoder->m_packetData + offset;
> +            offset += encoder->m_nals[i].i_payload;
>          }
> -
> +
>          *pp_nal = &encoder->m_nals[0];
> -        if (pi_nal) *pi_nal = (int)encoder->m_nals.size();
> +        if (pi_nal) *pi_nal = nalcount;
>      }
>      else if (pi_nal)
>          *pi_nal = 0;
> diff -r 06862133aecc -r c35e5d8148f0 source/x265.cpp
> --- a/source/x265.cpp   Wed Sep 04 13:25:03 2013 +0530
> +++ b/source/x265.cpp   Wed Sep 04 15:50:27 2013 +0530
> @@ -210,27 +210,27 @@
>      {
>          if (i_level > cli_log_level)
>              return;
> -        std::string s_level;
> +        char s_level[25];
>          switch (i_level)
>          {
>          case X265_LOG_ERROR:
> -            s_level = "error";
> +            strcpy(s_level, "error");
>              break;
>          case X265_LOG_WARNING:
> -            s_level = "warning";
> +            strcpy(s_level, "warning");
>              break;
>          case X265_LOG_INFO:
> -            s_level = "info";
> +            strcpy(s_level, "info");
>              break;
>          case X265_LOG_DEBUG:
> -            s_level = "debug";
> +            strcpy(s_level, "debug");
>              break;
>          default:
> -            s_level = "unknown";
> +            strcpy(s_level, "unknown");
>              break;
>          }
>
> -        fprintf(stderr, "x265 [%s]: ", s_level.c_str());
> +        fprintf(stderr, "x265 [%s]: ", s_level);
>          va_list arg;
>          va_start(arg, fmt);
>          vfprintf(stderr, fmt, arg);
> _______________________________________________
> 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: <https://mailman.videolan.org/private/x265-devel/attachments/20130904/e538199f/attachment.html>


More information about the x265-devel mailing list