# HG changeset patch # User Ashok Kumar Mishra <as...@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);
# HG changeset patch # User Ashok Kumar Mishra <as...@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);
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel