/* 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-2019, 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. */ /** \file SEI.cpp \brief helper functions for SEI handling */ #include "CommonDef.h" #include "SEI.h" #include "dtrace_next.h" #if ENABLE_TRACING void xTraceSEIHeader() { DTRACE( g_trace_ctx, D_HEADER, "=========== SEI message ===========\n" ); } void xTraceSEIMessageType( SEI::PayloadType payloadType ) { DTRACE( g_trace_ctx, D_HEADER, "=========== %s SEI message ===========\n", SEI::getSEIMessageString( payloadType ) ); } #endif SEIMessages getSeisByType(SEIMessages &seiList, SEI::PayloadType seiType) { SEIMessages result; for (SEIMessages::iterator it=seiList.begin(); it!=seiList.end(); it++) { if ((*it)->payloadType() == seiType) { result.push_back(*it); } } return result; } SEIMessages extractSeisByType(SEIMessages &seiList, SEI::PayloadType seiType) { SEIMessages result; SEIMessages::iterator it=seiList.begin(); while ( it!=seiList.end() ) { if ((*it)->payloadType() == seiType) { result.push_back(*it); it = seiList.erase(it); } else { it++; } } return result; } void deleteSEIs (SEIMessages &seiList) { for (SEIMessages::iterator it=seiList.begin(); it!=seiList.end(); it++) { delete (*it); } seiList.clear(); } void SEIBufferingPeriod::copyTo (SEIBufferingPeriod& target) const { target.m_bpNalCpbParamsPresentFlag = m_bpNalCpbParamsPresentFlag; target.m_bpVclCpbParamsPresentFlag = m_bpVclCpbParamsPresentFlag; target.m_initialCpbRemovalDelayLength = m_initialCpbRemovalDelayLength; target.m_cpbRemovalDelayLength = m_cpbRemovalDelayLength; target.m_dpbOutputDelayLength = m_dpbOutputDelayLength; target.m_duCpbRemovalDelayIncrementLength = m_duCpbRemovalDelayIncrementLength; target.m_dpbOutputDelayDuLength = m_dpbOutputDelayDuLength; target.m_concatenationFlag = m_concatenationFlag; target.m_auCpbRemovalDelayDelta = m_auCpbRemovalDelayDelta; target.m_cpbRemovalDelayDeltasPresentFlag = m_cpbRemovalDelayDeltasPresentFlag; target.m_numCpbRemovalDelayDeltas = m_numCpbRemovalDelayDeltas; target.m_bpMaxSubLayers = m_bpMaxSubLayers; ::memcpy(target.m_initialCpbRemovalDelay, m_initialCpbRemovalDelay, sizeof(m_initialCpbRemovalDelay)); ::memcpy(target.m_initialCpbRemovalOffset, m_initialCpbRemovalOffset, sizeof(m_initialCpbRemovalOffset)); ::memcpy(target.m_cpbRemovalDelayDelta, m_cpbRemovalDelayDelta, sizeof(m_cpbRemovalDelayDelta)); #if !JVET_P0446_BP_CPB_CNT_FIX ::memcpy(target.m_bpCpbCnt, m_bpCpbCnt, sizeof(m_bpCpbCnt)); #else target.m_bpCpbCnt = m_bpCpbCnt; #endif #if JVET_P0202_P0203_FIX_HRD_RELATED_SEI target.m_bpDecodingUnitHrdParamsPresentFlag = m_bpDecodingUnitHrdParamsPresentFlag; target.m_decodingUnitCpbParamsInPicTimingSeiFlag = m_decodingUnitCpbParamsInPicTimingSeiFlag; #endif #if JVET_P0181 target.m_sublayerInitialCpbRemovalDelayPresentFlag = m_sublayerInitialCpbRemovalDelayPresentFlag; #endif #if JVET_P0446_CONCATENATION target.m_concatenationFlag = m_concatenationFlag; target.m_maxInitialRemovalDelayForConcatenation = m_maxInitialRemovalDelayForConcatenation; #endif #if JVET_P0446_ALT_CPB target.m_altCpbParamsPresentFlag = m_altCpbParamsPresentFlag; #endif } void SEIPictureTiming::copyTo (SEIPictureTiming& target) const { ::memcpy(target.m_auCpbRemovalDelay, m_auCpbRemovalDelay, sizeof(m_auCpbRemovalDelay)); #if JVET_P0202_P0203_FIX_HRD_RELATED_SEI ::memcpy(target.m_ptSubLayerDelaysPresentFlag, m_ptSubLayerDelaysPresentFlag, sizeof(m_ptSubLayerDelaysPresentFlag)); ::memcpy(target.m_duCommonCpbRemovalDelayMinus1, m_duCommonCpbRemovalDelayMinus1, sizeof(m_duCommonCpbRemovalDelayMinus1)); #else ::memcpy(target.m_subLayerDelaysPresentFlag, m_subLayerDelaysPresentFlag, sizeof(m_subLayerDelaysPresentFlag)); #endif ::memcpy(target.m_cpbRemovalDelayDeltaEnabledFlag, m_cpbRemovalDelayDeltaEnabledFlag, sizeof(m_cpbRemovalDelayDeltaEnabledFlag)); ::memcpy(target.m_cpbRemovalDelayDeltaIdx, m_cpbRemovalDelayDeltaIdx, sizeof(m_cpbRemovalDelayDeltaIdx)); #if !JVET_P0202_P0203_FIX_HRD_RELATED_SEI target.m_ptMaxSubLayers = m_ptMaxSubLayers; #endif target.m_picDpbOutputDelay = m_picDpbOutputDelay; target.m_picDpbOutputDuDelay = m_picDpbOutputDuDelay; target.m_numDecodingUnitsMinus1 = m_numDecodingUnitsMinus1; target.m_duCommonCpbRemovalDelayFlag = m_duCommonCpbRemovalDelayFlag; #if !JVET_P0202_P0203_FIX_HRD_RELATED_SEI target.m_duCommonCpbRemovalDelayMinus1 = m_duCommonCpbRemovalDelayMinus1; #endif target.m_numNalusInDuMinus1 = m_numNalusInDuMinus1; target.m_duCpbRemovalDelayMinus1 = m_duCpbRemovalDelayMinus1; #if JVET_P0446_ALT_CPB target.m_cpbAltTimingInfoPresentFlag = m_cpbAltTimingInfoPresentFlag; target.m_cpbAltInitialCpbRemovalDelayDelta = m_cpbAltInitialCpbRemovalDelayDelta; target.m_cpbAltInitialCpbRemovalOffsetDelta = m_cpbAltInitialCpbRemovalOffsetDelta; target.m_cpbDelayOffset = m_cpbDelayOffset; target.m_dpbDelayOffset = m_dpbDelayOffset; #endif } // Static member const char *SEI::getSEIMessageString(SEI::PayloadType payloadType) { switch (payloadType) { case SEI::BUFFERING_PERIOD: return "Buffering period"; case SEI::PICTURE_TIMING: return "Picture timing"; #if HEVC_SEI case SEI::PAN_SCAN_RECT: return "Pan-scan rectangle"; // not currently decoded #endif case SEI::FILLER_PAYLOAD: return "Filler payload"; // not currently decoded #if HEVC_SEI || JVET_P0337_PORTING_SEI case SEI::USER_DATA_REGISTERED_ITU_T_T35: return "User data registered"; // not currently decoded case SEI::USER_DATA_UNREGISTERED: return "User data unregistered"; #if !JVET_P0337_PORTING_SEI case SEI::RECOVERY_POINT: return "Recovery point"; case SEI::SCENE_INFO: return "Scene information"; // not currently decoded case SEI::FULL_FRAME_SNAPSHOT: return "Picture snapshot"; // not currently decoded case SEI::PROGRESSIVE_REFINEMENT_SEGMENT_START: return "Progressive refinement segment start"; // not currently decoded case SEI::PROGRESSIVE_REFINEMENT_SEGMENT_END: return "Progressive refinement segment end"; // not currently decoded #endif case SEI::FILM_GRAIN_CHARACTERISTICS: return "Film grain characteristics"; // not currently decoded #if !JVET_P0337_PORTING_SEI case SEI::POST_FILTER_HINT: return "Post filter hint"; // not currently decoded case SEI::TONE_MAPPING_INFO: return "Tone mapping information"; case SEI::KNEE_FUNCTION_INFO: return "Knee function information"; #endif case SEI::FRAME_PACKING: return "Frame packing arrangement"; #if !JVET_P0337_PORTING_SEI case SEI::DISPLAY_ORIENTATION: return "Display orientation"; case SEI::GREEN_METADATA: return "Green metadata information"; case SEI::SOP_DESCRIPTION: return "Structure of pictures information"; case SEI::ACTIVE_PARAMETER_SETS: return "Active parameter sets"; #endif #endif case SEI::DECODING_UNIT_INFO: return "Decoding unit information"; #if HEVC_SEI case SEI::TEMPORAL_LEVEL0_INDEX: return "Temporal sub-layer zero index"; #endif case SEI::DECODED_PICTURE_HASH: return "Decoded picture hash"; case SEI::DEPENDENT_RAP_INDICATION: return "Dependent RAP indication"; #if HEVC_SEI || JVET_P0337_PORTING_SEI #if !JVET_P0337_PORTING_SEI case SEI::SCALABLE_NESTING: return "Scalable nesting"; case SEI::REGION_REFRESH_INFO: return "Region refresh information"; case SEI::NO_DISPLAY: return "No display"; case SEI::TIME_CODE: return "Time code"; #endif case SEI::MASTERING_DISPLAY_COLOUR_VOLUME: return "Mastering display colour volume"; #if !JVET_P0337_PORTING_SEI case SEI::SEGM_RECT_FRAME_PACKING: return "Segmented rectangular frame packing arrangement"; case SEI::TEMP_MOTION_CONSTRAINED_TILE_SETS: return "Temporal motion constrained tile sets"; case SEI::CHROMA_RESAMPLING_FILTER_HINT: return "Chroma sampling filter hint"; case SEI::COLOUR_REMAPPING_INFO: return "Colour remapping info"; #endif #if U0033_ALTERNATIVE_TRANSFER_CHARACTERISTICS_SEI case SEI::ALTERNATIVE_TRANSFER_CHARACTERISTICS: return "Alternative transfer characteristics"; #endif #endif #if JVET_P0337_PORTING_SEI case SEI::CONTENT_LIGHT_LEVEL_INFO: return "Content light level information"; case SEI::AMBIENT_VIEWING_ENVIRONMENT: return "Ambient viewing environment"; case SEI::CONTENT_COLOUR_VOLUME: return "Content colour volume"; #endif #if JVET_P0462_SEI360 case SEI::EQUIRECTANGULAR_PROJECTION: return "Equirectangular projection"; case SEI::SPHERE_ROTATION: return "Sphere rotation"; case SEI::REGION_WISE_PACKING: return "Region wise packing information"; case SEI::OMNI_VIEWPORT: return "Omni viewport"; #endif #if JVET_P0597_GCMP_SEI case SEI::GENERALIZED_CUBEMAP_PROJECTION: return "Generalized cubemap projection"; #endif #if JVET_P0450_SEI_SARI case SEI::SAMPLE_ASPECT_RATIO_INFO: return "Sample aspect ratio information"; #endif #if JVET_P0984_SEI_SUBPIC_LEVEL case SEI::SUBPICTURE_LEVEL_INFO: return "Subpicture level information"; #endif default: return "Unknown"; } }