[x265] [PATCH] Cleanup SEI code
Ashok Kumar Mishra
ashok at multicorewareinc.com
Tue Sep 25 11:01:16 CEST 2018
On Tue, Sep 18, 2018 at 4:35 PM <ashok at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Ashok Kumar Mishra <ashok at multicorewareinc.com>
> # Date 1537268644 -19800
> # Tue Sep 18 16:34:04 2018 +0530
> # Node ID f3c175d92ec248fc6b3388c6f70c1f3ea365d539
> # Parent 6426e22f479f10a07d606119dede0da844fb5015
> Cleanup SEI code
>
> diff -r 6426e22f479f -r f3c175d92ec2 source/common/param.cpp
> --- a/source/common/param.cpp Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/common/param.cpp Tue Sep 18 16:34:04 2018 +0530
> @@ -1415,9 +1415,16 @@
> if (param->masteringDisplayColorVolume || param->maxFALL ||
> param->maxCLL)
> param->bEmitHDRSEI = 1;
>
> - bool isSingleSEI = ((param->bEmitHRDSEI || param->bEmitInfoSEI ||
> param->decodedPictureHashSEI ||
> - param->masteringDisplayColorVolume ||
> param->maxCLL || param->maxFALL ||
> - param->bEmitHDRSEI ||
> param->bEmitIDRRecoverySEI));
> + bool isSingleSEI = (param->bRepeatHeaders
> + || param->bEmitHRDSEI
> + || param->bEmitInfoSEI
> + || param->bEmitHDRSEI
> + || param->bEmitIDRRecoverySEI
> + || !!param->interlaceMode
> + || param->preferredTransferCharacteristics > 1
> + || param->toneMapFile
> + || param->naluFile);
> +
> if (!isSingleSEI && param->bSingleSeiNal)
> {
> param->bSingleSeiNal = 0;
> diff -r 6426e22f479f -r f3c175d92ec2 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/encoder/encoder.cpp Tue Sep 18 16:34:04 2018 +0530
> @@ -2374,27 +2374,22 @@
> sbacCoder.codePPS(m_pps, (m_param->maxSlices <= 1), m_iPPSQpMinus26);
> bs.writeByteAlignment();
> list.serialize(NAL_UNIT_PPS, bs);
> +
> if (m_param->bSingleSeiNal)
> bs.resetBits();
> +
> if (m_param->bEmitHDRSEI)
> {
> SEIContentLightLevel cllsei;
> cllsei.max_content_light_level = m_param->maxCLL;
> cllsei.max_pic_average_light_level = m_param->maxFALL;
> - if (!m_param->bSingleSeiNal)
> - bs.resetBits();
> - cllsei.write(bs, m_sps);
> - cllsei.alignAndSerialize(bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, list);
> + cllsei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list,
> m_param->bSingleSeiNal);
> +
> if (m_param->masteringDisplayColorVolume)
> {
> SEIMasteringDisplayColorVolume mdsei;
> if (mdsei.parse(m_param->masteringDisplayColorVolume))
> - {
> - if (!m_param->bSingleSeiNal)
> - bs.resetBits();
> - mdsei.write(bs, m_sps);
> - mdsei.alignAndSerialize(bs, false,
> m_param->bSingleSeiNal, NAL_UNIT_PREFIX_SEI, list);
> - }
> + mdsei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI,
> list, m_param->bSingleSeiNal);
> else
> x265_log(m_param, X265_LOG_WARNING, "unable to parse
> mastering display color volume info\n");
> }
> @@ -2413,13 +2408,12 @@
> "Copyright 2013-2018 (c) Multicoreware, Inc - "
> "http://x265.org - options: %s",
> X265_BUILD, PFX(version_str), PFX(build_info_str),
> opts);
> - if (!m_param->bSingleSeiNal)
> - bs.resetBits();
> +
> SEIuserDataUnregistered idsei;
> idsei.m_userData = (uint8_t*)buffer;
> idsei.setSize((uint32_t)strlen(buffer));
> - idsei.write(bs, m_sps);
> - idsei.alignAndSerialize(bs, false,
> m_param->bSingleSeiNal, NAL_UNIT_PREFIX_SEI, list);
> + idsei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI,
> list, m_param->bSingleSeiNal);
> +
> X265_FREE(buffer);
> }
>
> @@ -2433,12 +2427,7 @@
> SEIActiveParameterSets sei;
> sei.m_selfContainedCvsFlag = true;
> sei.m_noParamSetUpdateFlag = true;
> - if (!m_param->bSingleSeiNal)
> - bs.resetBits();
> - int payloadSize = sei.countPayloadSize(m_sps);
> - sei.setSize(payloadSize);
> - sei.write(bs, m_sps);
> - sei.alignAndSerialize(bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, list);
> + sei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list,
> m_param->bSingleSeiNal);
> }
> }
>
> @@ -2521,7 +2510,7 @@
> vui.defaultDisplayWindow.bottomOffset =
> m_param->vui.defDispWinBottomOffset;
> vui.defaultDisplayWindow.leftOffset =
> m_param->vui.defDispWinLeftOffset;
>
> - vui.frameFieldInfoPresentFlag = !!m_param->interlaceMode ||
> (m_param->pictureStructure >= 0);
> + vui.frameFieldInfoPresentFlag = !!m_param->interlaceMode ||
> (m_param->pictureStructure >= 0);
> vui.fieldSeqFlag = !!m_param->interlaceMode;
>
> vui.hrdParametersPresentFlag = m_param->bEmitHRDSEI;
> diff -r 6426e22f479f -r f3c175d92ec2 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/encoder/frameencoder.cpp Tue Sep 18 16:34:04 2018 +0530
> @@ -365,6 +365,33 @@
> return length;
> }
>
> +bool FrameEncoder::writeToneMapInfo(x265_sei_payload *payload)
> +{
> + bool payloadChange = false;
> + if (m_top->m_prevTonemapPayload.payload != NULL &&
> payload->payloadSize == m_top->m_prevTonemapPayload.payloadSize)
> + {
> + if (memcmp(m_top->m_prevTonemapPayload.payload, payload->payload,
> payload->payloadSize) != 0)
> + payloadChange = true;
> + }
> + else
> + {
> + payloadChange = true;
> + if (m_top->m_prevTonemapPayload.payload != NULL)
> + x265_free(m_top->m_prevTonemapPayload.payload);
> + m_top->m_prevTonemapPayload.payload =
> (uint8_t*)x265_malloc(sizeof(uint8_t)* payload->payloadSize);
> + }
> +
> + if (payloadChange)
> + {
> + m_top->m_prevTonemapPayload.payloadType = payload->payloadType;
> + m_top->m_prevTonemapPayload.payloadSize = payload->payloadSize;
> + memcpy(m_top->m_prevTonemapPayload.payload, payload->payload,
> payload->payloadSize);
> + }
> +
> + bool isIDR = m_frame->m_lowres.sliceType == X265_TYPE_IDR;
> + return (payloadChange || isIDR);
> +}
> +
> void FrameEncoder::writeTrailingSEIMessages()
> {
> Slice* slice = m_frame->m_encData->m_slice;
> @@ -393,10 +420,8 @@
> payloadSize = 1 + 4 * planes;
> }
>
> - m_bs.resetBits();
> m_seiReconPictureDigest.setSize(payloadSize);
> - m_seiReconPictureDigest.write(m_bs, *slice->m_sps);
> - m_seiReconPictureDigest.alignAndSerialize(m_bs, true,
> m_param->bSingleSeiNal, NAL_UNIT_SUFFIX_SEI, m_nalList);
> + m_seiReconPictureDigest.writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_SUFFIX_SEI, m_nalList, false);
> }
>
> void FrameEncoder::compressFrame()
> @@ -496,9 +521,7 @@
> wa.waitForExit();
> else
> weightAnalyse(*slice, *m_frame, *m_param);
> -
> }
> -
> }
> else
> slice->disableWeights();
> @@ -670,12 +693,7 @@
> bpSei->m_dpbDelayOffset = 0;
> // hrdFullness() calculates the initial CPB removal delay and
> offset
> m_top->m_rateControl->hrdFullness(bpSei);
> - if (!m_param->bSingleSeiNal)
> - m_bs.resetBits();
> - int payloadSize = bpSei->countPayloadSize(*slice->m_sps);
> - bpSei->setSize(payloadSize);
> - bpSei->write(m_bs, *slice->m_sps);
> - bpSei->alignAndSerialize(m_bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, m_nalList);
> + bpSei->writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_PREFIX_SEI, m_nalList, m_param->bSingleSeiNal);
>
> m_top->m_lastBPSEI = m_rce.encodeOrder;
> }
> @@ -687,11 +705,7 @@
> sei.m_recoveryPocCnt = 0;
> sei.m_exactMatchingFlag = true;
> sei.m_brokenLinkFlag = false;
> - if (!m_param->bSingleSeiNal)
> - m_bs.resetBits();
> - sei.setSize(sei.countPayloadSize(*slice->m_sps));
> - sei.write(m_bs, *slice->m_sps);
> - sei.alignAndSerialize(m_bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, m_nalList);
> + sei.writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_PREFIX_SEI, m_nalList, m_param->bSingleSeiNal);
> }
> }
>
> @@ -711,10 +725,7 @@
> else
> sei->m_picStruct = m_param->pictureStructure;
>
> - if (m_param->interlaceMode)
> - sei->m_sourceScanType = 0;
> - else
> - sei->m_sourceScanType = 1;
> + sei->m_sourceScanType = m_param->interlaceMode ? 0 : 1;
>
> sei->m_duplicateFlag = false;
> }
> @@ -728,26 +739,17 @@
> sei->m_auCpbRemovalDelay = X265_MIN(X265_MAX(1,
> m_rce.encodeOrder - prevBPSEI), (1 << hrd->cpbRemovalDelayLength));
> sei->m_picDpbOutputDelay = slice->m_sps->numReorderPics + poc
> - m_rce.encodeOrder;
> }
> - if (!m_param->bSingleSeiNal)
> - m_bs.resetBits();
> - int payloadSize = sei->countPayloadSize(*slice->m_sps);
> - sei->setSize(payloadSize);
> - sei->write(m_bs, *slice->m_sps);
> - sei->alignAndSerialize(m_bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, m_nalList);
> +
> + sei->writeSEImessages(m_bs, *slice->m_sps, NAL_UNIT_PREFIX_SEI,
> m_nalList, m_param->bSingleSeiNal);
> }
>
> if (m_param->preferredTransferCharacteristics > -1 && slice->isIRAP())
> {
> SEIAlternativeTC m_seiAlternativeTC;
> m_seiAlternativeTC.m_preferredTransferCharacteristics =
> m_param->preferredTransferCharacteristics;
> - m_bs.resetBits();
> - int payloadSize =
> m_seiAlternativeTC.countPayloadSize(*slice->m_sps);
> - m_seiAlternativeTC.setSize(payloadSize);
> - m_seiAlternativeTC.write(m_bs, *slice->m_sps);
> - m_seiAlternativeTC.alignAndSerialize(m_bs, false,
> m_param->bSingleSeiNal, NAL_UNIT_PREFIX_SEI, m_nalList);
> + m_seiAlternativeTC.writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_PREFIX_SEI, m_nalList, m_param->bSingleSeiNal);
> }
>
> - bool isSei = false;
> /* Write user SEI */
> for (int i = 0; i < m_frame->m_userSEI.numPayloads; i++)
> {
> @@ -756,33 +758,27 @@
> {
> SEIuserDataUnregistered sei;
> sei.m_userData = payload->payload;
> - if (!m_param->bSingleSeiNal)
> - m_bs.resetBits();
> sei.setSize(payload->payloadSize);
> - sei.write(m_bs, *slice->m_sps);
> - sei.alignAndSerialize(m_bs, false, m_param->bSingleSeiNal,
> NAL_UNIT_PREFIX_SEI, m_nalList);
> - isSei = true;
> + sei.writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_PREFIX_SEI, m_nalList, m_param->bSingleSeiNal);
> }
> else if (payload->payloadType == USER_DATA_REGISTERED_ITU_T_T35)
> {
> + bool writeSei = m_param->bDhdr10opt ?
> writeToneMapInfo(payload) : true;
> if (writeSei)
> {
> - SEICreativeIntentMeta sei;
> - sei.m_payload = payload->payload;
> - if (!m_param->bSingleSeiNal)
> - m_bs.resetBits();
> + SEIuserDataRegistered sei;
> + sei.m_userData = payload->payload;
> sei.setSize(payload->payloadSize);
> - sei.write(m_bs, *slice->m_sps);
> - sei.alignAndSerialize(m_bs, false,
> m_param->bSingleSeiNal, NAL_UNIT_PREFIX_SEI, m_nalList);
> - isSei = true;
> + sei.writeSEImessages(m_bs, *slice->m_sps,
> NAL_UNIT_PREFIX_SEI, m_nalList, m_param->bSingleSeiNal);
> }
> }
> else
> x265_log(m_param, X265_LOG_ERROR, "Unrecognized SEI type\n");
> }
>
> - isSei |= ((m_frame->m_lowres.bKeyframe && m_param->bRepeatHeaders) ||
> m_param->bEmitHRDSEI ||
> - !!m_param->interlaceMode || (m_frame->m_lowres.sliceType ==
> X265_TYPE_IDR && m_param->bEmitIDRRecoverySEI));
> + bool isSei = ((m_frame->m_lowres.bKeyframe &&
> m_param->bRepeatHeaders) || m_param->bEmitHRDSEI ||
> + !!m_param->interlaceMode || (m_frame->m_lowres.sliceType
> == X265_TYPE_IDR && m_param->bEmitIDRRecoverySEI) ||
> + m_frame->m_userSEI.numPayloads);
>
> if (isSei && m_param->bSingleSeiNal)
> {
> @@ -1061,10 +1057,8 @@
>
> m_nalList.serialize(slice->m_nalUnitType, m_bs);
> }
> - if (isSei && m_param->bSingleSeiNal)
> - m_bs.resetBits();
>
> - if (m_param->decodedPictureHashSEI)
> + if (m_param->decodedPictureHashSEI)
> writeTrailingSEIMessages();
>
> uint64_t bytes = 0;
> diff -r 6426e22f479f -r f3c175d92ec2 source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/encoder/frameencoder.h Tue Sep 18 16:34:04 2018 +0530
> @@ -230,6 +230,7 @@
> int collectCTUStatistics(const CUData& ctu, FrameStats* frameLog);
> void noiseReductionUpdate();
> void writeTrailingSEIMessages();
> + bool writeToneMapInfo(x265_sei_payload *payload);
>
> /* Called by WaveFront::findJob() */
> virtual void processRow(int row, int threadId);
> diff -r 6426e22f479f -r f3c175d92ec2 source/encoder/sei.cpp
> --- a/source/encoder/sei.cpp Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/encoder/sei.cpp Tue Sep 18 16:34:04 2018 +0530
> @@ -33,46 +33,44 @@
> 0x2C, 0xA2, 0xDE, 0x09, 0xB5, 0x17, 0x47, 0xDB,
> 0xBB, 0x55, 0xA4, 0xFE, 0x7F, 0xC2, 0xFC, 0x4E
> };
> -/* count the size of the payload and return the size in bits */
> -int SEI::countPayloadSize(const SPS& sps)
> +
> +/* marshal a single SEI message sei, storing the marshalled representation
> +* in bitstream bs */
> +void SEI::writeSEImessages(Bitstream& bs, const SPS& sps, NalUnitType
> nalUnitType, NALList& list, int isNested)
> {
> + if (!isNested)
> + bs.resetBits();
> +
> BitCounter counter;
> m_bitIf = &counter;
> writeSEI(sps);
> + /* count the size of the payload and return the size in bits */
> X265_CHECK(0 == (counter.getNumberOfWrittenBits() & 7), "payload
> unaligned\n");
> - int count = counter.getNumberOfWrittenBits() >> 3;
> - return count;
> -}
> + uint32_t payloadData = counter.getNumberOfWrittenBits() >> 3;
>
> -void SEI::alignAndSerialize(Bitstream& bs, int lastSei, int isSingleSei,
> NalUnitType nalUnitType, NALList& list)
> -{
> - if (lastSei || !isSingleSei)
> + // set bitstream
> + m_bitIf = &bs;
> +
> + uint32_t payloadType = m_payloadType;
> + for (; payloadType >= 0xff; payloadType -= 0xff)
> + WRITE_CODE(0xff, 8, "payload_type");
> + WRITE_CODE(payloadType, 8, "payload_type");
> +
> + uint32_t payloadSize = payloadData;
> + for (; payloadSize >= 0xff; payloadSize -= 0xff)
> + WRITE_CODE(0xff, 8, "payload_size");
> + WRITE_CODE(payloadSize, 8, "payload_size");
> +
> + // virtual writeSEI method, write to bs
> + writeSEI(sps);
> +
> + if (!isNested)
> {
> bs.writeByteAlignment();
> list.serialize(nalUnitType, bs);
> }
> }
>
> -/* marshal a single SEI message sei, storing the marshalled representation
> - * in bitstream bs */
> -void SEI::write(Bitstream& bs, const SPS& sps)
> -{
> - uint32_t type = m_payloadType;
> - m_bitIf = &bs;
> - uint32_t payloadSize = m_payloadSize;
> - if (m_payloadType == USER_DATA_UNREGISTERED)
> - payloadSize = m_payloadSize + 16;
> - uint32_t payloadType = m_payloadType;
> - for (; payloadType >= 0xff; payloadType -= 0xff)
> - WRITE_CODE(0xff, 8, "payload_type");
> - WRITE_CODE(type, 8, "payload_type");
> - for (; payloadSize >= 0xff; payloadSize -= 0xff)
> - WRITE_CODE(0xff, 8, "payload_size");
> - WRITE_CODE(payloadSize, 8, "payload_size");
> - /* virtual writeSEI method, write to bs */
> - writeSEI(sps);
> -}
> -
> void SEI::writeByteAlign()
> {
> // TODO: expose bs.writeByteAlignment() as virtual function
> diff -r 6426e22f479f -r f3c175d92ec2 source/encoder/sei.h
> --- a/source/encoder/sei.h Tue Sep 18 16:34:04 2018 +0530
> +++ b/source/encoder/sei.h Tue Sep 18 16:34:04 2018 +0530
> @@ -36,11 +36,9 @@
> class SEI : public SyntaxElementWriter
> {
> public:
> - /* SEI users call write() to marshal an SEI to a bitstream.
> - * The write() method calls writeSEI() which encodes the header */
> - void write(Bitstream& bs, const SPS& sps);
> - void alignAndSerialize(Bitstream& bs, int lastSei, int isSingleSei,
> NalUnitType nalUnitType, NALList& list);
> - int countPayloadSize(const SPS& sps);
> + /* SEI users call writeSEImessages() to marshal an SEI to a bitstream.
> + * The writeSEImessages() method calls writeSEI() which encodes the
> header */
> + void writeSEImessages(Bitstream& bs, const SPS& sps, NalUnitType
> nalUnitType, NALList& list, int isNested);
> void setSize(uint32_t size);
> static char* base64Decode(char encodedString[], int
> base64EncodeLength);
> virtual ~SEI() {}
> @@ -51,6 +49,32 @@
> void writeByteAlign();
> };
>
> +//seongnam.oh at samsung.com :: for the Creative Intent Meta Data Encoding
> +class SEIuserDataRegistered : public SEI
> +{
> +public:
> + SEIuserDataRegistered()
> + {
> + m_payloadType = USER_DATA_REGISTERED_ITU_T_T35;
> + m_payloadSize = 0;
> + }
> +
> + uint8_t *m_userData;
> +
> + // daniel.vt at samsung.com :: for the Creative Intent Meta Data
> Encoding ( seongnam.oh at samsung.com )
> + void writeSEI(const SPS&)
> + {
> + if (!m_userData)
> + return;
> +
> + uint32_t i = 0;
> + for (; i < m_payloadSize; ++i)
> + WRITE_CODE(m_userData[i], 8, "creative_intent_metadata");
> + }
> +};
> +
> +static const uint32_t ISO_IEC_11578_LEN = 16;
> +
> class SEIuserDataUnregistered : public SEI
> {
> public:
> @@ -59,11 +83,11 @@
> m_payloadType = USER_DATA_UNREGISTERED;
> m_payloadSize = 0;
> }
> - static const uint8_t m_uuid_iso_iec_11578[16];
> + static const uint8_t m_uuid_iso_iec_11578[ISO_IEC_11578_LEN];
> uint8_t *m_userData;
> void writeSEI(const SPS&)
> {
> - for (uint32_t i = 0; i < 16; i++)
> + for (uint32_t i = 0; i < ISO_IEC_11578_LEN; i++)
> WRITE_CODE(m_uuid_iso_iec_11578[i], 8,
> "sei.uuid_iso_iec_11578[i]");
> for (uint32_t i = 0; i < m_payloadSize; i++)
> WRITE_CODE(m_userData[i], 8, "user_data");
> @@ -280,45 +304,21 @@
> }
> };
>
> -//seongnam.oh at samsung.com :: for the Creative Intent Meta Data Encoding
> -class SEICreativeIntentMeta : public SEI
> -{
> -public:
> - SEICreativeIntentMeta()
> - {
> - m_payloadType = USER_DATA_REGISTERED_ITU_T_T35;
> - m_payloadSize = 0;
> - }
> -
> - uint8_t *m_payload;
> -
> - // daniel.vt at samsung.com :: for the Creative Intent Meta Data
> Encoding ( seongnam.oh at samsung.com )
> - void writeSEI(const SPS&)
> - {
> - if (!m_payload)
> - return;
> -
> - uint32_t i = 0;
> - for (; i < m_payloadSize; ++i)
> - WRITE_CODE(m_payload[i], 8, "creative_intent_metadata");
> - }
> -};
> -
> class SEIAlternativeTC : public SEI
> {
> public:
> int m_preferredTransferCharacteristics;
> SEIAlternativeTC()
> {
> - m_payloadType = ALTERNATIVE_TRANSFER_CHARACTERISTICS;
> - m_payloadSize = 0;
> - m_preferredTransferCharacteristics = -1;
> - }
> -
> - void writeSEI(const SPS&)
> - {
> - WRITE_CODE(m_preferredTransferCharacteristics, 8, "Preferred
> transfer characteristics");
> - }
> + m_payloadType = ALTERNATIVE_TRANSFER_CHARACTERISTICS;
> + m_payloadSize = 0;
> + m_preferredTransferCharacteristics = -1;
> + }
> +
> + void writeSEI(const SPS&)
> + {
> + WRITE_CODE(m_preferredTransferCharacteristics, 8, "Preferred
> transfer characteristics");
> + }
> };
>
> }
>
Pushed to default.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180925/bc2b1ede/attachment-0001.html>
More information about the x265-devel
mailing list