[x265] [PATCH] Encoder: separate SEI related code from encode() function

Ashok Kumar Mishra ashok at multicorewareinc.com
Tue Sep 25 10:46:34 CEST 2018


On Tue, Sep 18, 2018 at 4:34 PM <ashok at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Ashok Kumar Mishra <ashok at multicorewareinc.com>
> # Date 1536925687 -19800
> #      Fri Sep 14 17:18:07 2018 +0530
> # Node ID 1582bba2eb394348b671c7005d965ef911a6bb40
> # Parent  fa57fa584898fa3036e6748c0d7d348a9ce55b54
> Encoder: separate SEI related code from encode() function.
>
> diff -r fa57fa584898 -r 1582bba2eb39 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp        Sun Sep 09 14:57:14 2018 +0200
> +++ b/source/encoder/encoder.cpp        Fri Sep 14 17:18:07 2018 +0530
> @@ -875,6 +875,77 @@
>      }
>  }
>
> +void Encoder::copyUserSEIMessages(Frame *frame, const x265_picture*
> pic_in)
> +{
> +    x265_sei_payload toneMap;
> +    toneMap.payload = NULL;
> +    int toneMapPayload = 0;
> +
> +#if ENABLE_HDR10_PLUS
> +    if (m_bToneMap)
> +    {
> +        int currentPOC = m_pocLast;
> +        if (currentPOC < m_numCimInfo)
> +        {
> +            int32_t i = 0;
> +            toneMap.payloadSize = 0;
> +            while (m_cim[currentPOC][i] == 0xFF)
> +                toneMap.payloadSize += m_cim[currentPOC][i++];
> +            toneMap.payloadSize += m_cim[currentPOC][i];
> +
> +            toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) *
> toneMap.payloadSize);
> +            toneMap.payloadType = USER_DATA_REGISTERED_ITU_T_T35;
> +            memcpy(toneMap.payload, &m_cim[currentPOC][i + 1],
> toneMap.payloadSize);
> +            toneMapPayload = 1;
> +        }
> +    }
> +#endif
> +    /* seiMsg will contain SEI messages specified in a fixed file format
> in POC order.
> +    * Format of the file : <POC><space><PREFIX><space><NAL UNIT
> TYPE>/<SEI TYPE><space><SEI Payload> */
> +    x265_sei_payload seiMsg;
> +    seiMsg.payload = NULL;
> +    int userPayload = 0;
> +    if (m_enableNal)
> +    {
> +        readUserSeiFile(seiMsg, m_pocLast);
> +        if (seiMsg.payload)
> +            userPayload = 1;;
> +    }
> +
> +    int numPayloads = pic_in->userSEI.numPayloads + toneMapPayload +
> userPayload;
> +    frame->m_userSEI.numPayloads = numPayloads;
> +
> +    if (frame->m_userSEI.numPayloads)
> +    {
> +        if (!frame->m_userSEI.payloads)
> +        {
> +            frame->m_userSEI.payloads = new x265_sei_payload[numPayloads];
> +            for (int i = 0; i < numPayloads; i++)
> +                frame->m_userSEI.payloads[i].payload = NULL;
> +        }
> +        for (int i = 0; i < numPayloads; i++)
> +        {
> +            x265_sei_payload input;
> +            if ((i == (numPayloads - 1)) && toneMapPayload)
> +                input = toneMap;
> +            else if (m_enableNal)
> +                input = seiMsg;
> +            else
> +                input = pic_in->userSEI.payloads[i];
> +
> +            if (!frame->m_userSEI.payloads[i].payload)
> +                frame->m_userSEI.payloads[i].payload = new
> uint8_t[input.payloadSize];
> +            memcpy(frame->m_userSEI.payloads[i].payload, input.payload,
> input.payloadSize);
> +            frame->m_userSEI.payloads[i].payloadSize = input.payloadSize;
> +            frame->m_userSEI.payloads[i].payloadType = input.payloadType;
> +        }
> +        if (toneMap.payload)
> +            x265_free(toneMap.payload);
> +        if (seiMsg.payload)
> +            x265_free(seiMsg.payload);
> +    }
> +}
> +
>  /**
>   * Feed one new input frame into the encoder, get one frame out. If
> pic_in is
>   * NULL, a flush condition is implied and pic_in must be NULL for all
> subsequent
> @@ -919,32 +990,6 @@
>              m_latestParam->forceFlush = 0;
>          }
>
> -        x265_sei_payload toneMap;
> -        toneMap.payload = NULL;
> -#if ENABLE_HDR10_PLUS
> -        if (m_bToneMap)
> -        {
> -            int currentPOC = m_pocLast + 1;
> -            if (currentPOC < m_numCimInfo)
> -            {
> -                int32_t i = 0;
> -                toneMap.payloadSize = 0;
> -                while (m_cim[currentPOC][i] == 0xFF)
> -                    toneMap.payloadSize += m_cim[currentPOC][i++];
> -                toneMap.payloadSize += m_cim[currentPOC][i];
> -
> -                toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) *
> toneMap.payloadSize);
> -                toneMap.payloadType = USER_DATA_REGISTERED_ITU_T_T35;
> -                memcpy(toneMap.payload, &m_cim[currentPOC][i+1],
> toneMap.payloadSize);
> -            }
> -        }
> -#endif
> -/* seiMsg will contain SEI messages specified in a fixed file format in
> POC order.
> -* Format of the file : <POC><space><PREFIX><space><NAL UNIT TYPE>/<SEI
> TYPE><space><SEI Payload> */
> -        x265_sei_payload seiMsg;
> -        seiMsg.payload = NULL;
> -        if (m_enableNal)
> -            readUserSeiFile(seiMsg, m_pocLast);
>          if (pic_in->bitDepth < 8 || pic_in->bitDepth > 16)
>          {
>              x265_log(m_param, X265_LOG_ERROR, "Input bit depth (%d) must
> be between 8 and 16\n",
> @@ -1026,42 +1071,7 @@
>          inFrame->m_forceqp   = pic_in->forceqp;
>          inFrame->m_param     = (m_reconfigure || m_reconfigureRc) ?
> m_latestParam : m_param;
>
> -        int toneMapEnable = 0;
> -        if (m_bToneMap && toneMap.payload)
> -            toneMapEnable = 1;
> -        int numPayloads = pic_in->userSEI.numPayloads + toneMapEnable;
> -        if (m_enableNal && seiMsg.payload)
> -            numPayloads += m_enableNal;
> -        inFrame->m_userSEI.numPayloads = numPayloads;
> -
> -        if (inFrame->m_userSEI.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;
> -                if ((i == (numPayloads - 1)) && toneMapEnable)
> -                    input = toneMap;
> -                else if (m_enableNal)
> -                    input = seiMsg;
> -                else
> -                    input = pic_in->userSEI.payloads[i];
> -                int size = inFrame->m_userSEI.payloads[i].payloadSize =
> input.payloadSize;
> -                inFrame->m_userSEI.payloads[i].payloadType =
> input.payloadType;
> -                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)
> -                x265_free(toneMap.payload);
> -            if (seiMsg.payload)
> -                x265_free(seiMsg.payload);
> -        }
> +        copyUserSEIMessages(inFrame, pic_in);
>
>          if (pic_in->quantOffsets != NULL)
>          {
> @@ -4524,7 +4534,7 @@
>          char *base64Decode = SEI::base64Decode(base64Encode,
> base64EncodeLength);
>          if (nalType == NAL_UNIT_PREFIX_SEI && (!strcmp(prefix, "PREFIX")))
>          {
> -            int currentPOC = curPoc + 1;
> +            int currentPOC = curPoc;
>              if (currentPOC == poc)
>              {
>                  seiMsg.payloadSize = (base64EncodeLength / 4) * 3;
> diff -r fa57fa584898 -r 1582bba2eb39 source/encoder/encoder.h
> --- a/source/encoder/encoder.h  Sun Sep 09 14:57:14 2018 +0200
> +++ b/source/encoder/encoder.h  Fri Sep 14 17:18:07 2018 +0530
> @@ -302,6 +302,8 @@
>      void updateRefIdx();
>      bool computeSPSRPSIndex();
>
> +    void copyUserSEIMessages(Frame *frame, const x265_picture* pic_in);
> +
>  protected:
>
>      void initVPS(VPS *vps);
>

Pushed to default.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180925/0fa25d35/attachment.html>


More information about the x265-devel mailing list