/* The copyright in this software is being made available under the BSD * License, included below. This software may be subject to other third party * and contributor rights, including patent rights, and no such rights are * granted under this license. * * Copyright (c) 2010-2015, ITU/ISO/IEC * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SEI__ #define __SEI__ #pragma once #include #include #include #include "CommonDef.h" #include "libmd5/MD5.h" //! \ingroup TLibCommon //! \{ class TComSPS; /** * Abstract class representing an SEI message with lightweight RTTI. */ class SEI { public: enum PayloadType { BUFFERING_PERIOD = 0, PICTURE_TIMING = 1, PAN_SCAN_RECT = 2, FILLER_PAYLOAD = 3, USER_DATA_REGISTERED_ITU_T_T35 = 4, USER_DATA_UNREGISTERED = 5, RECOVERY_POINT = 6, SCENE_INFO = 9, FULL_FRAME_SNAPSHOT = 15, PROGRESSIVE_REFINEMENT_SEGMENT_START = 16, PROGRESSIVE_REFINEMENT_SEGMENT_END = 17, FILM_GRAIN_CHARACTERISTICS = 19, POST_FILTER_HINT = 22, TONE_MAPPING_INFO = 23, FRAME_PACKING = 45, DISPLAY_ORIENTATION = 47, SOP_DESCRIPTION = 128, ACTIVE_PARAMETER_SETS = 129, DECODING_UNIT_INFO = 130, TEMPORAL_LEVEL0_INDEX = 131, DECODED_PICTURE_HASH = 132, SCALABLE_NESTING = 133, REGION_REFRESH_INFO = 134, NO_DISPLAY = 135, TIME_CODE = 136, MASTERING_DISPLAY_COLOUR_VOLUME = 137, SEGM_RECT_FRAME_PACKING = 138, TEMP_MOTION_CONSTRAINED_TILE_SETS = 139, CHROMA_SAMPLING_FILTER_HINT = 140, KNEE_FUNCTION_INFO = 141 #if NH_MV ,SUB_BITSTREAM_PROPERTY = 164 #endif }; SEI() {} virtual ~SEI() {} static const Char *getSEIMessageString(SEI::PayloadType payloadType); virtual PayloadType payloadType() const = 0; }; static const UInt ISO_IEC_11578_LEN=16; class SEIuserDataUnregistered : public SEI { public: PayloadType payloadType() const { return USER_DATA_UNREGISTERED; } SEIuserDataUnregistered() : userData(0) {} virtual ~SEIuserDataUnregistered() { delete userData; } UChar uuid_iso_iec_11578[ISO_IEC_11578_LEN]; UInt userDataLength; UChar *userData; }; class SEIDecodedPictureHash : public SEI { public: PayloadType payloadType() const { return DECODED_PICTURE_HASH; } SEIDecodedPictureHash() {} virtual ~SEIDecodedPictureHash() {} enum Method { MD5, CRC, CHECKSUM, RESERVED, } method; TComPictureHash m_pictureHash; }; class SEIActiveParameterSets : public SEI { public: PayloadType payloadType() const { return ACTIVE_PARAMETER_SETS; } SEIActiveParameterSets() : activeVPSId (0) , m_selfContainedCvsFlag (false) , m_noParameterSetUpdateFlag (false) , numSpsIdsMinus1 (0) {} virtual ~SEIActiveParameterSets() {} Int activeVPSId; Bool m_selfContainedCvsFlag; Bool m_noParameterSetUpdateFlag; Int numSpsIdsMinus1; std::vector activeSeqParameterSetId; }; class SEIBufferingPeriod : public SEI { public: PayloadType payloadType() const { return BUFFERING_PERIOD; } void copyTo (SEIBufferingPeriod& target); SEIBufferingPeriod() : m_bpSeqParameterSetId (0) , m_rapCpbParamsPresentFlag (false) , m_cpbDelayOffset (0) , m_dpbDelayOffset (0) { ::memset(m_initialCpbRemovalDelay, 0, sizeof(m_initialCpbRemovalDelay)); ::memset(m_initialCpbRemovalDelayOffset, 0, sizeof(m_initialCpbRemovalDelayOffset)); ::memset(m_initialAltCpbRemovalDelay, 0, sizeof(m_initialAltCpbRemovalDelay)); ::memset(m_initialAltCpbRemovalDelayOffset, 0, sizeof(m_initialAltCpbRemovalDelayOffset)); } virtual ~SEIBufferingPeriod() {} UInt m_bpSeqParameterSetId; Bool m_rapCpbParamsPresentFlag; UInt m_cpbDelayOffset; UInt m_dpbDelayOffset; UInt m_initialCpbRemovalDelay [MAX_CPB_CNT][2]; UInt m_initialCpbRemovalDelayOffset [MAX_CPB_CNT][2]; UInt m_initialAltCpbRemovalDelay [MAX_CPB_CNT][2]; UInt m_initialAltCpbRemovalDelayOffset[MAX_CPB_CNT][2]; Bool m_concatenationFlag; UInt m_auCpbRemovalDelayDelta; }; class SEIPictureTiming : public SEI { public: PayloadType payloadType() const { return PICTURE_TIMING; } void copyTo (SEIPictureTiming& target); SEIPictureTiming() : m_picStruct (0) , m_sourceScanType (0) , m_duplicateFlag (false) , m_picDpbOutputDuDelay (0) {} virtual ~SEIPictureTiming() { } UInt m_picStruct; UInt m_sourceScanType; Bool m_duplicateFlag; UInt m_auCpbRemovalDelay; UInt m_picDpbOutputDelay; UInt m_picDpbOutputDuDelay; UInt m_numDecodingUnitsMinus1; Bool m_duCommonCpbRemovalDelayFlag; UInt m_duCommonCpbRemovalDelayMinus1; std::vector m_numNalusInDuMinus1; std::vector m_duCpbRemovalDelayMinus1; }; class SEIDecodingUnitInfo : public SEI { public: PayloadType payloadType() const { return DECODING_UNIT_INFO; } SEIDecodingUnitInfo() : m_decodingUnitIdx(0) , m_duSptCpbRemovalDelay(0) , m_dpbOutputDuDelayPresentFlag(false) , m_picSptDpbOutputDuDelay(0) {} virtual ~SEIDecodingUnitInfo() {} Int m_decodingUnitIdx; Int m_duSptCpbRemovalDelay; Bool m_dpbOutputDuDelayPresentFlag; Int m_picSptDpbOutputDuDelay; }; class SEIRecoveryPoint : public SEI { public: PayloadType payloadType() const { return RECOVERY_POINT; } SEIRecoveryPoint() {} virtual ~SEIRecoveryPoint() {} Int m_recoveryPocCnt; Bool m_exactMatchingFlag; Bool m_brokenLinkFlag; }; class SEIFramePacking : public SEI { public: PayloadType payloadType() const { return FRAME_PACKING; } SEIFramePacking() {} virtual ~SEIFramePacking() {} Int m_arrangementId; Bool m_arrangementCancelFlag; Int m_arrangementType; Bool m_quincunxSamplingFlag; Int m_contentInterpretationType; Bool m_spatialFlippingFlag; Bool m_frame0FlippedFlag; Bool m_fieldViewsFlag; Bool m_currentFrameIsFrame0Flag; Bool m_frame0SelfContainedFlag; Bool m_frame1SelfContainedFlag; Int m_frame0GridPositionX; Int m_frame0GridPositionY; Int m_frame1GridPositionX; Int m_frame1GridPositionY; Int m_arrangementReservedByte; Bool m_arrangementPersistenceFlag; Bool m_upsampledAspectRatio; }; class SEISegmentedRectFramePacking : public SEI { public: PayloadType payloadType() const { return SEGM_RECT_FRAME_PACKING; } SEISegmentedRectFramePacking() {} virtual ~SEISegmentedRectFramePacking() {} Bool m_arrangementCancelFlag; Int m_contentInterpretationType; Bool m_arrangementPersistenceFlag; }; class SEIDisplayOrientation : public SEI { public: PayloadType payloadType() const { return DISPLAY_ORIENTATION; } SEIDisplayOrientation() : cancelFlag(true) , persistenceFlag(0) , extensionFlag(false) {} virtual ~SEIDisplayOrientation() {} Bool cancelFlag; Bool horFlip; Bool verFlip; UInt anticlockwiseRotation; Bool persistenceFlag; Bool extensionFlag; }; class SEITemporalLevel0Index : public SEI { public: PayloadType payloadType() const { return TEMPORAL_LEVEL0_INDEX; } SEITemporalLevel0Index() : tl0Idx(0) , rapIdx(0) {} virtual ~SEITemporalLevel0Index() {} UInt tl0Idx; UInt rapIdx; }; class SEIGradualDecodingRefreshInfo : public SEI { public: PayloadType payloadType() const { return REGION_REFRESH_INFO; } SEIGradualDecodingRefreshInfo() : m_gdrForegroundFlag(0) {} virtual ~SEIGradualDecodingRefreshInfo() {} Bool m_gdrForegroundFlag; }; class SEINoDisplay : public SEI { public: PayloadType payloadType() const { return NO_DISPLAY; } SEINoDisplay() : m_noDisplay(false) {} virtual ~SEINoDisplay() {} Bool m_noDisplay; }; class SEISOPDescription : public SEI { public: PayloadType payloadType() const { return SOP_DESCRIPTION; } SEISOPDescription() {} virtual ~SEISOPDescription() {} UInt m_sopSeqParameterSetId; UInt m_numPicsInSopMinus1; UInt m_sopDescVclNaluType[MAX_NUM_PICS_IN_SOP]; UInt m_sopDescTemporalId[MAX_NUM_PICS_IN_SOP]; UInt m_sopDescStRpsIdx[MAX_NUM_PICS_IN_SOP]; Int m_sopDescPocDelta[MAX_NUM_PICS_IN_SOP]; }; class SEIToneMappingInfo : public SEI { public: PayloadType payloadType() const { return TONE_MAPPING_INFO; } SEIToneMappingInfo() {} virtual ~SEIToneMappingInfo() {} Int m_toneMapId; Bool m_toneMapCancelFlag; Bool m_toneMapPersistenceFlag; Int m_codedDataBitDepth; Int m_targetBitDepth; Int m_modelId; Int m_minValue; Int m_maxValue; Int m_sigmoidMidpoint; Int m_sigmoidWidth; std::vector m_startOfCodedInterval; Int m_numPivots; std::vector m_codedPivotValue; std::vector m_targetPivotValue; Int m_cameraIsoSpeedIdc; Int m_cameraIsoSpeedValue; Int m_exposureIndexIdc; Int m_exposureIndexValue; Bool m_exposureCompensationValueSignFlag; Int m_exposureCompensationValueNumerator; Int m_exposureCompensationValueDenomIdc; Int m_refScreenLuminanceWhite; Int m_extendedRangeWhiteLevel; Int m_nominalBlackLevelLumaCodeValue; Int m_nominalWhiteLevelLumaCodeValue; Int m_extendedWhiteLevelLumaCodeValue; }; class SEIKneeFunctionInfo : public SEI { public: PayloadType payloadType() const { return KNEE_FUNCTION_INFO; } SEIKneeFunctionInfo() {} virtual ~SEIKneeFunctionInfo() {} Int m_kneeId; Bool m_kneeCancelFlag; Bool m_kneePersistenceFlag; Int m_kneeInputDrange; Int m_kneeInputDispLuminance; Int m_kneeOutputDrange; Int m_kneeOutputDispLuminance; Int m_kneeNumKneePointsMinus1; std::vector m_kneeInputKneePoint; std::vector m_kneeOutputKneePoint; }; class SEIChromaSamplingFilterHint : public SEI { public: PayloadType payloadType() const {return CHROMA_SAMPLING_FILTER_HINT;} SEIChromaSamplingFilterHint() {} virtual ~SEIChromaSamplingFilterHint() { if(m_verChromaFilterIdc == 1) { for(Int i = 0; i < m_numVerticalFilters; i ++) { free(m_verFilterCoeff[i]); } free(m_verFilterCoeff); free(m_verTapLengthMinus1); } if(m_horChromaFilterIdc == 1) { for(Int i = 0; i < m_numHorizontalFilters; i ++) { free(m_horFilterCoeff[i]); } free(m_horFilterCoeff); free(m_horTapLengthMinus1); } } Int m_verChromaFilterIdc; Int m_horChromaFilterIdc; Bool m_verFilteringProcessFlag; Int m_targetFormatIdc; Bool m_perfectReconstructionFlag; Int m_numVerticalFilters; Int* m_verTapLengthMinus1; Int** m_verFilterCoeff; Int m_numHorizontalFilters; Int* m_horTapLengthMinus1; Int** m_horFilterCoeff; }; class SEIMasteringDisplayColourVolume : public SEI { public: PayloadType payloadType() const { return MASTERING_DISPLAY_COLOUR_VOLUME; } SEIMasteringDisplayColourVolume() {} virtual ~SEIMasteringDisplayColourVolume(){} TComSEIMasteringDisplay values; }; #if NH_MV class SEISubBitstreamProperty : public SEI { public: PayloadType payloadType() const { return SUB_BITSTREAM_PROPERTY; } SEISubBitstreamProperty(): m_activeVpsId(-1), m_numAdditionalSubStreams(0) {} virtual ~SEISubBitstreamProperty() {} Int m_activeVpsId; Int m_numAdditionalSubStreams; std::vector m_subBitstreamMode; std::vector m_outputLayerSetIdxToVps; std::vector m_highestSublayerId; std::vector m_avgBitRate; std::vector m_maxBitRate; }; #endif typedef std::list SEIMessages; /// output a selection of SEI messages by payload type. Ownership stays in original message list. SEIMessages getSeisByType(SEIMessages &seiList, SEI::PayloadType seiType); /// remove a selection of SEI messages by payload type from the original list and return them in a new list. SEIMessages extractSeisByType(SEIMessages &seiList, SEI::PayloadType seiType); /// delete list of SEI messages (freeing the referenced objects) Void deleteSEIs (SEIMessages &seiList); class SEIScalableNesting : public SEI { public: PayloadType payloadType() const { return SCALABLE_NESTING; } SEIScalableNesting() {} virtual ~SEIScalableNesting() { deleteSEIs(m_nestedSEIs); } Bool m_bitStreamSubsetFlag; Bool m_nestingOpFlag; Bool m_defaultOpFlag; //value valid if m_nestingOpFlag != 0 UInt m_nestingNumOpsMinus1; // -"- UInt m_nestingMaxTemporalIdPlus1[MAX_TLAYER]; // -"- UInt m_nestingOpIdx[MAX_NESTING_NUM_OPS]; // -"- Bool m_allLayersFlag; //value valid if m_nestingOpFlag == 0 UInt m_nestingNoOpMaxTemporalIdPlus1; //value valid if m_nestingOpFlag == 0 and m_allLayersFlag == 0 UInt m_nestingNumLayersMinus1; //value valid if m_nestingOpFlag == 0 and m_allLayersFlag == 0 UChar m_nestingLayerId[MAX_NESTING_NUM_LAYER]; //value valid if m_nestingOpFlag == 0 and m_allLayersFlag == 0. This can e.g. be a static array of 64 UChar values SEIMessages m_nestedSEIs; }; class SEITimeCode : public SEI { public: PayloadType payloadType() const { return TIME_CODE; } SEITimeCode() {} virtual ~SEITimeCode(){} UInt numClockTs; TComSEITimeSet timeSetArray[MAX_TIMECODE_SEI_SETS]; }; //definition according to P1005_v1; class SEITempMotionConstrainedTileSets: public SEI { struct TileSetData { protected: std::vector m_top_left_tile_index; //[tileSetIdx][tileIdx]; std::vector m_bottom_right_tile_index; public: Int m_mcts_id; Bool m_display_tile_set_flag; Int m_num_tile_rects_in_set; //_minus1; Bool m_exact_sample_value_match_flag; Bool m_mcts_tier_level_idc_present_flag; Bool m_mcts_tier_flag; Int m_mcts_level_idc; Void setNumberOfTileRects(const Int number) { m_top_left_tile_index .resize(number); m_bottom_right_tile_index.resize(number); } Int getNumberOfTileRects() const { assert(m_top_left_tile_index.size() == m_bottom_right_tile_index.size()); return Int(m_top_left_tile_index.size()); } Int &topLeftTileIndex (const Int tileRectIndex) { return m_top_left_tile_index [tileRectIndex]; } Int &bottomRightTileIndex(const Int tileRectIndex) { return m_bottom_right_tile_index[tileRectIndex]; } const Int &topLeftTileIndex (const Int tileRectIndex) const { return m_top_left_tile_index [tileRectIndex]; } const Int &bottomRightTileIndex(const Int tileRectIndex) const { return m_bottom_right_tile_index[tileRectIndex]; } }; protected: std::vector m_tile_set_data; public: Bool m_mc_all_tiles_exact_sample_value_match_flag; Bool m_each_tile_one_tile_set_flag; Bool m_limited_tile_set_display_flag; Bool m_max_mcs_tier_level_idc_present_flag; Bool m_max_mcts_tier_flag; Int m_max_mcts_level_idc; PayloadType payloadType() const { return TEMP_MOTION_CONSTRAINED_TILE_SETS; } Void setNumberOfTileSets(const Int number) { m_tile_set_data.resize(number); } Int getNumberOfTileSets() const { return Int(m_tile_set_data.size()); } TileSetData &tileSetData (const Int index) { return m_tile_set_data[index]; } const TileSetData &tileSetData (const Int index) const { return m_tile_set_data[index]; } }; #endif //! \}