[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