On Tue, Sep 18, 2018 at 4:35 PM <[email protected]> wrote: > # HG changeset patch > # User Ashok Kumar Mishra <[email protected]> > # 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(); > }; > > +//[email protected] :: 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; > + > + // [email protected] :: for the Creative Intent Meta Data > Encoding ( [email protected] ) > + 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 @@ > } > }; > > -//[email protected] :: 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; > - > - // [email protected] :: for the Creative Intent Meta Data > Encoding ( [email protected] ) > - 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.
_______________________________________________ x265-devel mailing list [email protected] https://mailman.videolan.org/listinfo/x265-devel
