Skip to content
Snippets Groups Projects
SEI.cpp 48.63 KiB
/* 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-2024, 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(const SEIMessages &seiList, SEI::PayloadType seiType)
{
  SEIMessages result;

  for (SEIMessages::const_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 = *this; }

bool SEIScalabilityDimensionInfo::isSDISameContent(SEIScalabilityDimensionInfo* sdiB)
{
  if (!sdiB)
  {
    return false;
  }
  if (m_sdiNumViews != sdiB->m_sdiNumViews)
  {
    return false;
  }
  if (m_sdiMaxLayersMinus1 != sdiB->m_sdiMaxLayersMinus1)
  {
    return false;
  }
  if (m_sdiMultiviewInfoFlag != sdiB->m_sdiMultiviewInfoFlag)
  {
    return false;
  }
  if (m_sdiAuxiliaryInfoFlag != sdiB->m_sdiAuxiliaryInfoFlag)
  {
    return false;
  }
  if (m_sdiMultiviewInfoFlag || m_sdiAuxiliaryInfoFlag)
  {
    if (m_sdiMultiviewInfoFlag)
    {
      if (m_sdiViewIdLenMinus1 != sdiB->m_sdiViewIdLenMinus1)
      {
        return false;
      }
    }
    for (int i = 0; i <= m_sdiMaxLayersMinus1; i++)
    {
      if (m_sdiMultiviewInfoFlag)
      {
        if (m_sdiViewIdVal[i] != sdiB->m_sdiViewIdVal[i])
        {
          return false;
        }
      }
      if (m_sdiAuxiliaryInfoFlag)
      {
        if (m_sdiAuxId[i] != sdiB->m_sdiAuxId[i])
        {
          return false;
        }
        if (m_sdiAuxId[i] > 0)
        {
          if (m_sdiNumAssociatedPrimaryLayersMinus1[i] != sdiB->m_sdiNumAssociatedPrimaryLayersMinus1[i])
          {
            return false;
          }
          for (int j = 0; j <= m_sdiNumAssociatedPrimaryLayersMinus1[i]; j++)
          {
            if (m_sdiAssociatedPrimaryLayerIdx[i][j] != sdiB->m_sdiAssociatedPrimaryLayerIdx[i][j])
            {
              return false;
            }
          }
        }
      }
    }
  }
  return true;
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaFocalLengthXLen( int i ) const
{
  return xGetSyntaxElementLen( m_maiExponentFocalLengthX[i], m_maiPrecFocalLength, m_maiMantissaFocalLengthX[ i ] );
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaFocalLengthYLen( int i ) const
{
  return xGetSyntaxElementLen( m_maiExponentFocalLengthY[i], m_maiPrecFocalLength, m_maiMantissaFocalLengthY[ i ]  );
}


uint32_t SEIMultiviewAcquisitionInfo::getMantissaPrincipalPointXLen( int i ) const
{
  return xGetSyntaxElementLen( m_maiExponentPrincipalPointX[i], m_maiPrecPrincipalPoint, m_maiMantissaPrincipalPointX[ i ]  );
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaPrincipalPointYLen( int i ) const
{
  return xGetSyntaxElementLen( m_maiExponentPrincipalPointY[i], m_maiPrecPrincipalPoint, m_maiMantissaPrincipalPointY[ i ] );
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaSkewFactorLen( int i ) const
{
  return xGetSyntaxElementLen( m_maiExponentSkewFactor[ i ], m_maiPrecSkewFactor, m_maiMantissaSkewFactor[ i ] );
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaRLen( int i, int j, int k ) const
{
  return xGetSyntaxElementLen( m_maiExponentR[ i ][ j ][ k ], m_maiPrecRotationParam, m_maiMantissaR[ i ][ j] [ k ] );
}

uint32_t SEIMultiviewAcquisitionInfo::getMantissaTLen( int i, int j ) const
{
  return xGetSyntaxElementLen( m_maiExponentT[ i ][ j ], m_maiPrecTranslationParam, m_maiMantissaT[ i ][ j ] );
}
uint32_t SEIMultiviewAcquisitionInfo::xGetSyntaxElementLen( int expo, int prec, int val ) const
{
  uint32_t len;
  if( expo == 0 )
  {
    len = std::max(0, prec - 30 );
  }
  else
  {
    len = std::max( 0, expo + prec - 31 );
  }

  assert( val >= 0 );
  const uint64_t MAX_VAL = (1llu << len) - 1;
  CHECK( val > MAX_VAL, "Value is too big" );
  return len;
}

bool SEIMultiviewAcquisitionInfo::isMAISameContent(SEIMultiviewAcquisitionInfo *maiB)
{
  if (!maiB)
  {
    return false;
  }
  if (m_maiIntrinsicParamFlag != maiB->m_maiIntrinsicParamFlag)
  {
    return false;
  }
  if (m_maiExtrinsicParamFlag != maiB->m_maiExtrinsicParamFlag)
  {
    return false;
  }
  if (m_maiNumViewsMinus1 != maiB->m_maiNumViewsMinus1)
  {
    return false;
  }
  if (m_maiIntrinsicParamFlag)
  {
    if (m_maiIntrinsicParamsEqualFlag != maiB->m_maiIntrinsicParamsEqualFlag)
    {
      return false;
    }
    if (m_maiPrecFocalLength != maiB->m_maiPrecFocalLength)
    {
      return false;
    }
    if (m_maiPrecPrincipalPoint != maiB->m_maiPrecPrincipalPoint)
    {
      return false;
    }
    if (m_maiPrecSkewFactor != maiB->m_maiPrecSkewFactor)
    {
      return false;
    }
    for (int i = 0; i <= (m_maiIntrinsicParamsEqualFlag ? 0 : m_maiNumViewsMinus1); i++)
    {
      if (m_maiSignFocalLengthX[i] != maiB->m_maiSignFocalLengthX[i])
      {
        return false;
      }
      if (m_maiExponentFocalLengthX[i] != maiB->m_maiExponentFocalLengthX[i])
      {
        return false;
      }
      if (m_maiMantissaFocalLengthX[i] != maiB->m_maiMantissaFocalLengthX[i])
      {
        return false;
      }
      if (m_maiSignFocalLengthY[i] != maiB->m_maiSignFocalLengthY[i])
      {
        return false;
      }
      if (m_maiExponentFocalLengthY[i] != maiB->m_maiExponentFocalLengthY[i])
      {
        return false;
      }
      if (m_maiMantissaFocalLengthY[i] != maiB->m_maiMantissaFocalLengthY[i])
      {
        return false;
      }
      if (m_maiSignPrincipalPointX[i] != maiB->m_maiSignPrincipalPointX[i])
      {
        return false;
      }
      if (m_maiExponentPrincipalPointX[i] != maiB->m_maiExponentPrincipalPointX[i])
      {
        return false;
      }
      if (m_maiMantissaPrincipalPointX[i] != maiB->m_maiMantissaPrincipalPointX[i])
      {
        return false;
      }
      if (m_maiSignPrincipalPointY[i] != maiB->m_maiSignPrincipalPointY[i])
      {
        return false;
      }
      if (m_maiExponentPrincipalPointY[i] != maiB->m_maiExponentPrincipalPointY[i])
      {
        return false;
      }
      if (m_maiMantissaPrincipalPointY[i] != maiB->m_maiMantissaPrincipalPointY[i])
      {
        return false;
      }
      if (m_maiSignSkewFactor[i] != maiB->m_maiSignSkewFactor[i])
      {
        return false;
      }
      if (m_maiExponentSkewFactor[i] != maiB->m_maiExponentSkewFactor[i])
      {
        return false;
      }
      if (m_maiMantissaSkewFactor[i] != maiB->m_maiMantissaSkewFactor[i])
      {
        return false;
      }
    }
  }
  if (m_maiExtrinsicParamFlag)
  {
    if (m_maiPrecRotationParam != maiB->m_maiPrecRotationParam)
    {
      return false;
    }
    if (m_maiPrecTranslationParam != maiB->m_maiPrecTranslationParam)
    {
      return false;
    }
    for (int i = 0; i <= m_maiNumViewsMinus1; i++)
    {
      for (int j = 0; j < 3; j++)
      {
        for (int k = 0; k < 3; k++)
        {
          if (m_maiSignR[i][j][k] != maiB->m_maiSignR[i][j][k])
          {
            return false;
          }
          if (m_maiExponentR[i][j][k] != maiB->m_maiExponentR[i][j][k])
          {
            return false;
          }
          if (m_maiMantissaR[i][j][k] != maiB->m_maiMantissaR[i][j][k])
          {
            return false;
          }
        }
        if (m_maiSignT[i][j] != maiB->m_maiSignT[i][j])
        {
          return false;
        }
        if (m_maiExponentT[i][j] != maiB->m_maiExponentT[i][j])
        {
          return false;
        }
        if (m_maiMantissaT[i][j] != maiB->m_maiMantissaT[i][j])
        {
          return false;
        }
      }
    }
  }
  return true;
}

SEIManifest::SEIManifestDescription SEIManifest::getSEIMessageDescription(const PayloadType payloadType)
{
  std::vector<PayloadType> necessary = { PayloadType::FRAME_PACKING, PayloadType::EQUIRECTANGULAR_PROJECTION,
                                         PayloadType::GENERALIZED_CUBEMAP_PROJECTION, PayloadType::SPHERE_ROTATION,
                                         PayloadType::REGION_WISE_PACKING };

  std::vector<PayloadType> undetermined = { PayloadType::USER_DATA_REGISTERED_ITU_T_T35,
                                            PayloadType::USER_DATA_UNREGISTERED };

  for (auto pt : necessary) 
  {
    if (payloadType == pt) 
    {
      return NECESSARY_SEI_MESSAGE;
    }
  }
  for (auto pt: undetermined)
  {
    if (payloadType == pt) 
    {
      return UNDETERMINED_SEI_MESSAGE;
    } 
  }
  return UNNECESSARY_SEI_MESSAGE;
}

uint8_t SEIPrefixIndication::getNumsOfSeiPrefixIndications(const SEI *sei)
{
  PayloadType payloadType = sei->payloadType();
  CHECK((payloadType == PayloadType::SEI_MANIFEST), "SEI_SPI should not include SEI_manfest");
  CHECK((payloadType == PayloadType::SEI_PREFIX_INDICATION), "SEI_SPI should not include itself");

  //Unable to determine how many indicators are needed, it will be determined in xWriteSEIPrefixIndication() return 3
  std::vector<PayloadType> indicationN = { PayloadType::REGION_WISE_PACKING };
  // Need two indicators to finish writing the SEI prefix indication message(return 2)
  std::vector<PayloadType> indication2 = { PayloadType::SPHERE_ROTATION };

  for (auto pt: indicationN)
  {
    if (payloadType == pt) 
    {
      return 3;
    }
  }
  for (auto pt: indication2)
  {
    if (payloadType == pt)
    {
      return 2;
    }
  }
  return 1;
}
bool SEIMultiviewViewPosition::isMVPSameContent(SEIMultiviewViewPosition *mvpB)
{
  if (!mvpB)
  {
    return false;
  }
  if (m_mvpNumViewsMinus1 != mvpB->m_mvpNumViewsMinus1)
  {
    return false;
  }
  for (int i = 0; i <= m_mvpNumViewsMinus1; i++)
  {
    if (m_mvpViewPosition[i] != mvpB->m_mvpViewPosition[i])
    {
      return false;
    }
  }
  return true;
}

// Static member
static const std::map<SEI::PayloadType, const char *> payloadTypeStrings = {
  { SEI::PayloadType::BUFFERING_PERIOD, "Buffering period" },
  { SEI::PayloadType::PICTURE_TIMING, "Picture timing" },
  { SEI::PayloadType::FILLER_PAYLOAD, "Filler payload" },
  { SEI::PayloadType::USER_DATA_REGISTERED_ITU_T_T35, "User data registered" },
  { SEI::PayloadType::USER_DATA_UNREGISTERED, "User data unregistered" },
  { SEI::PayloadType::FILM_GRAIN_CHARACTERISTICS, "Film grain characteristics" },
  { SEI::PayloadType::FRAME_PACKING, "Frame packing arrangement" },
  { SEI::PayloadType::DISPLAY_ORIENTATION, "Display orientation" },
  { SEI::PayloadType::GREEN_METADATA, "Green metadata" },
  { SEI::PayloadType::PARAMETER_SETS_INCLUSION_INDICATION, "Parameter sets inclusion indication" },
  { SEI::PayloadType::DECODING_UNIT_INFO, "Decoding unit information" },
  { SEI::PayloadType::SCALABLE_NESTING, "Scalable nesting" },
  { SEI::PayloadType::DECODED_PICTURE_HASH, "Decoded picture hash" },
  { SEI::PayloadType::DEPENDENT_RAP_INDICATION, "Dependent RAP indication" },
  { SEI::PayloadType::MASTERING_DISPLAY_COLOUR_VOLUME, "Mastering display colour volume" },
  { SEI::PayloadType::ALTERNATIVE_TRANSFER_CHARACTERISTICS, "Alternative transfer characteristics" },
  { SEI::PayloadType::CONTENT_LIGHT_LEVEL_INFO, "Content light level information" },
  { SEI::PayloadType::AMBIENT_VIEWING_ENVIRONMENT, "Ambient viewing environment" },
  { SEI::PayloadType::CONTENT_COLOUR_VOLUME, "Content colour volume" },
  { SEI::PayloadType::COLOUR_TRANSFORM_INFO, "Colour transform information" },
  { SEI::PayloadType::EQUIRECTANGULAR_PROJECTION, "Equirectangular projection" },
  { SEI::PayloadType::SPHERE_ROTATION, "Sphere rotation" },
  { SEI::PayloadType::REGION_WISE_PACKING, "Region wise packing information" },
  { SEI::PayloadType::OMNI_VIEWPORT, "Omni viewport" },
  { SEI::PayloadType::GENERALIZED_CUBEMAP_PROJECTION, "Generalized cubemap projection" },
  { SEI::PayloadType::ALPHA_CHANNEL_INFO, "Alpha channel information" },
  { SEI::PayloadType::DEPTH_REPRESENTATION_INFO, "Depth representation information" },
  { SEI::PayloadType::MULTIVIEW_ACQUISITION_INFO, "Multiview acquisition information" },
  { SEI::PayloadType::MULTIVIEW_VIEW_POSITION, "Multiview view position" },
  { SEI::PayloadType::SAMPLE_ASPECT_RATIO_INFO, "Sample aspect ratio information" },
  { SEI::PayloadType::SUBPICTURE_LEVEL_INFO, "Subpicture level information" },
  { SEI::PayloadType::ANNOTATED_REGIONS, "Annotated Region" },
  { SEI::PayloadType::SCALABILITY_DIMENSION_INFO, "Scalability dimension information" },
  { SEI::PayloadType::EXTENDED_DRAP_INDICATION, "Extended DRAP indication" },
  { SEI::PayloadType::SEI_MANIFEST, "SEI manifest" },
  { SEI::PayloadType::SEI_PREFIX_INDICATION, "SEI prefix indication" },
  { SEI::PayloadType::CONSTRAINED_RASL_ENCODING, "Constrained RASL encoding" },
  { SEI::PayloadType::VDI_SEI_ENVELOPE, "Video decoding interface SEI envelope" },
  { SEI::PayloadType::SHUTTER_INTERVAL_INFO, "Shutter interval information" },
  { SEI::PayloadType::NEURAL_NETWORK_POST_FILTER_CHARACTERISTICS, "Neural network post-filter characteristics" },
  { SEI::PayloadType::NEURAL_NETWORK_POST_FILTER_ACTIVATION, "Neural network post-filter activation" },
  { SEI::PayloadType::PHASE_INDICATION, "Phase Indication" },
  { SEI::PayloadType::SEI_PROCESSING_ORDER, "SEI messages Processing order" },
  { SEI::PayloadType::SOURCE_PICTURE_TIMING_INFO, "Source picture timing info" },
  { SEI::PayloadType::MODALITY_INFORMATION, "Modality information" },
  { SEI::PayloadType::DIGITALLY_SIGNED_CONTENT_INITIALIZATION, "Digitally Signed Content Initialization" },
  { SEI::PayloadType::DIGITALLY_SIGNED_CONTENT_SELECTION, "Digitally Signed Content Selection" },
  { SEI::PayloadType::DIGITALLY_SIGNED_CONTENT_VERIFICATION, "Digitally Signed Content Verification" },
  { SEI::PayloadType::GENERATIVE_FACE_VIDEO, "Generative face video" }
};

const char *SEI::getSEIMessageString(SEI::PayloadType payloadType)
{
  auto p = payloadTypeStrings.find(payloadType);
  if (p != payloadTypeStrings.end())
  {
    return p->second;
  }
  else
  {
    return "Unknown";
  }
}

SEIShutterIntervalInfo::SEIShutterIntervalInfo(const SEIShutterIntervalInfo& sei)
{
  m_siiEnabled = sei.m_siiEnabled;
  m_siiNumUnitsInShutterInterval = sei.m_siiNumUnitsInShutterInterval;
  m_siiTimeScale = sei.m_siiTimeScale;
  m_siiMaxSubLayersMinus1 = sei.m_siiMaxSubLayersMinus1;
  m_siiFixedSIwithinCLVS = sei.m_siiFixedSIwithinCLVS;
  m_siiSubLayerNumUnitsInSI = sei.m_siiSubLayerNumUnitsInSI;
}
SEISourcePictureTimingInfo::SEISourcePictureTimingInfo(const SEISourcePictureTimingInfo& sei)
{
  m_sptiSEIEnabled                         = sei.m_sptiSEIEnabled;
  m_sptiSourceTimingEqualsOutputTimingFlag = sei.m_sptiSourceTimingEqualsOutputTimingFlag;
  m_sptiSourceType                         = sei.m_sptiSourceType;
  m_sptiTimeScale                          = sei.m_sptiTimeScale;
  m_sptiNumUnitsInElementalInterval        = sei.m_sptiNumUnitsInElementalInterval;
#if JVET_AJ0170_SPTI_SEI_DIRECTION_FLAG
  m_sptiDirectionFlag                      = sei.m_sptiDirectionFlag;
#endif
}

SEIProcessingOrderInfo::SEIProcessingOrderInfo(const SEIProcessingOrderInfo& sei)
{
  m_posEnabled = sei.m_posEnabled;
  m_posId = sei.m_posId;
  m_posForHumanViewingIdc = sei.m_posForHumanViewingIdc;
  m_posForMachineAnalysisIdc = sei.m_posForMachineAnalysisIdc;
  m_posNumMinus2 = sei.m_posNumMinus2;
  m_posBreadthFirstFlag = sei.m_posBreadthFirstFlag;
  m_posWrappingFlag = sei.m_posWrappingFlag;
  m_posImportanceFlag = sei.m_posImportanceFlag;
  m_posProcessingDegreeFlag = sei.m_posProcessingDegreeFlag;
  m_posPrefixFlag = sei.m_posPrefixFlag;
  m_posPayloadType = sei.m_posPayloadType;
  m_posProcessingOrder = sei.m_posProcessingOrder;
  m_posPrefixByte = sei.m_posPrefixByte;
}

SEIProcessingOrderNesting::SEIProcessingOrderNesting(const SEIProcessingOrderNesting& sei)
{
  m_ponTargetPoId = sei.m_ponTargetPoId;
  m_ponNumSeisMinus1 = sei.m_ponNumSeisMinus1;
  m_ponProcessingOrder = sei.m_ponProcessingOrder;
  m_ponWrapSeiMessages = sei.m_ponWrapSeiMessages;
  m_ponPayloadType = sei.m_ponPayloadType;
}

SEIEquirectangularProjection::SEIEquirectangularProjection(const SEIEquirectangularProjection& sei)
{
  m_erpCancelFlag = sei.m_erpCancelFlag;
  m_erpPersistenceFlag = sei.m_erpPersistenceFlag;
  m_erpGuardBandFlag = sei.m_erpGuardBandFlag;
  m_erpGuardBandType = sei.m_erpGuardBandType;
  m_erpLeftGuardBandWidth = sei.m_erpLeftGuardBandWidth;
  m_erpRightGuardBandWidth = sei.m_erpRightGuardBandWidth;
}

SEISphereRotation::SEISphereRotation(const SEISphereRotation& sei)
{
  m_sphereRotationCancelFlag = sei.m_sphereRotationCancelFlag;
  m_sphereRotationPersistenceFlag = sei.m_sphereRotationPersistenceFlag;
  m_sphereRotationYaw = sei.m_sphereRotationYaw;
  m_sphereRotationPitch = sei.m_sphereRotationPitch;
  m_sphereRotationRoll = sei.m_sphereRotationRoll;
}

SEIOmniViewport::SEIOmniViewport(const SEIOmniViewport& sei)
{
  m_omniViewportId = sei.m_omniViewportId;
  m_omniViewportCancelFlag = sei.m_omniViewportCancelFlag;
  m_omniViewportPersistenceFlag = sei.m_omniViewportPersistenceFlag;
  m_omniViewportCntMinus1 = sei.m_omniViewportCntMinus1;
  m_omniViewportRegions = sei.m_omniViewportRegions;
  for(unsigned region = 0; region < m_omniViewportRegions.size(); region++)
  {
    m_omniViewportRegions[region].azimuthCentre = sei.m_omniViewportRegions[region].azimuthCentre;
    m_omniViewportRegions[region].elevationCentre = sei.m_omniViewportRegions[region].elevationCentre;
    m_omniViewportRegions[region].tiltCentre = sei.m_omniViewportRegions[region].tiltCentre;
    m_omniViewportRegions[region].horRange = sei.m_omniViewportRegions[region].horRange;
    m_omniViewportRegions[region].verRange = sei.m_omniViewportRegions[region].verRange;
  }
}

SEIRegionWisePacking::SEIRegionWisePacking(const SEIRegionWisePacking& sei)
{
  m_rwpCancelFlag = sei.m_rwpCancelFlag;
  m_rwpPersistenceFlag = sei.m_rwpPersistenceFlag;
  m_constituentPictureMatchingFlag = sei.m_constituentPictureMatchingFlag;
  m_numPackedRegions = sei.m_numPackedRegions;
  m_projPictureWidth = sei.m_projPictureWidth;
  m_projPictureHeight = sei.m_projPictureHeight;
  m_packedPictureWidth = sei.m_packedPictureWidth;
  m_packedPictureHeight = sei.m_packedPictureHeight;
  m_rwpTransformType = sei.m_rwpTransformType;
  m_rwpGuardBandFlag = sei.m_rwpGuardBandFlag;
  m_projRegionWidth = sei.m_projRegionWidth;
  m_projRegionHeight = sei.m_projRegionHeight;
  m_rwpProjRegionTop = sei.m_rwpProjRegionTop;
  m_projRegionLeft = sei.m_projRegionLeft;
  m_packedRegionWidth = sei.m_packedRegionWidth;
  m_packedRegionHeight = sei.m_packedRegionHeight;
  m_packedRegionTop = sei.m_packedRegionTop;
  m_packedRegionLeft = sei.m_packedRegionLeft;
  m_rwpLeftGuardBandWidth = sei.m_rwpLeftGuardBandWidth;
  m_rwpRightGuardBandWidth = sei.m_rwpRightGuardBandWidth;
  m_rwpTopGuardBandHeight = sei.m_rwpTopGuardBandHeight;
  m_rwpBottomGuardBandHeight = sei.m_rwpBottomGuardBandHeight;
  m_rwpGuardBandNotUsedForPredFlag = sei.m_rwpGuardBandNotUsedForPredFlag;
  m_rwpGuardBandType = sei.m_rwpGuardBandType;
}

SEIGeneralizedCubemapProjection::SEIGeneralizedCubemapProjection(const SEIGeneralizedCubemapProjection& sei)
{
  m_gcmpCancelFlag = sei.m_gcmpCancelFlag;
  m_gcmpPersistenceFlag = sei.m_gcmpPersistenceFlag;
  m_gcmpPackingType = sei.m_gcmpPackingType;
  m_gcmpMappingFunctionType = sei.m_gcmpMappingFunctionType;
  m_gcmpFaceIndex = sei.m_gcmpFaceIndex;
  m_gcmpFaceRotation = sei.m_gcmpFaceRotation;
  m_gcmpFunctionCoeffU = sei.m_gcmpFunctionCoeffU;
  m_gcmpFunctionUAffectedByVFlag = sei.m_gcmpFunctionUAffectedByVFlag;
  m_gcmpFunctionCoeffV = sei.m_gcmpFunctionCoeffV;
  m_gcmpFunctionVAffectedByUFlag = sei.m_gcmpFunctionVAffectedByUFlag;
  m_gcmpGuardBandFlag = sei.m_gcmpGuardBandFlag;
  m_gcmpGuardBandType = sei.m_gcmpGuardBandType;
  m_gcmpGuardBandBoundaryExteriorFlag = sei.m_gcmpGuardBandBoundaryExteriorFlag;
  m_gcmpGuardBandSamplesMinus1 = sei.m_gcmpGuardBandSamplesMinus1;
}

SEIScalabilityDimensionInfo::SEIScalabilityDimensionInfo(const SEIScalabilityDimensionInfo& sei)
{
  m_sdiNumViews = sei.m_sdiNumViews;
  m_sdiMaxLayersMinus1 = sei.m_sdiMaxLayersMinus1;
  m_sdiMultiviewInfoFlag = sei.m_sdiMultiviewInfoFlag;
  m_sdiAuxiliaryInfoFlag = sei.m_sdiAuxiliaryInfoFlag;
  m_sdiViewIdLenMinus1 = sei.m_sdiViewIdLenMinus1;
  m_sdiLayerId = sei.m_sdiLayerId;
  m_sdiViewIdVal = sei.m_sdiViewIdVal;
  m_sdiAuxId = sei.m_sdiAuxId;
  m_sdiNumAssociatedPrimaryLayersMinus1 = sei.m_sdiNumAssociatedPrimaryLayersMinus1;
  m_sdiAssociatedPrimaryLayerIdx = sei.m_sdiAssociatedPrimaryLayerIdx;
}

SEIMultiviewAcquisitionInfo::SEIMultiviewAcquisitionInfo(const SEIMultiviewAcquisitionInfo& sei)
{
  m_maiIntrinsicParamFlag = sei.m_maiIntrinsicParamFlag;
  m_maiExtrinsicParamFlag = sei.m_maiExtrinsicParamFlag;
  m_maiNumViewsMinus1 = sei.m_maiNumViewsMinus1;
  m_maiIntrinsicParamsEqualFlag = sei.m_maiIntrinsicParamsEqualFlag;
  m_maiPrecFocalLength = sei.m_maiPrecFocalLength;
  m_maiPrecPrincipalPoint = sei.m_maiPrecPrincipalPoint;
  m_maiPrecSkewFactor = sei.m_maiPrecSkewFactor;
  m_maiSignFocalLengthX = sei.m_maiSignFocalLengthX;
  m_maiExponentFocalLengthX = sei.m_maiExponentFocalLengthX;
  m_maiMantissaFocalLengthX = sei.m_maiMantissaFocalLengthX;
  m_maiSignFocalLengthY = sei.m_maiSignFocalLengthY;
  m_maiExponentFocalLengthY = sei.m_maiExponentFocalLengthY;
  m_maiMantissaFocalLengthY = sei.m_maiMantissaFocalLengthY;
  m_maiSignPrincipalPointX = sei.m_maiSignPrincipalPointX;
  m_maiExponentPrincipalPointX = sei.m_maiExponentPrincipalPointX;
  m_maiMantissaPrincipalPointX = sei.m_maiMantissaPrincipalPointX;
  m_maiSignPrincipalPointY = sei.m_maiSignPrincipalPointY;
  m_maiExponentPrincipalPointY = sei.m_maiExponentPrincipalPointY;
  m_maiMantissaPrincipalPointY = sei.m_maiMantissaPrincipalPointY;
  m_maiSignSkewFactor = sei.m_maiSignSkewFactor;
  m_maiExponentSkewFactor = sei.m_maiExponentSkewFactor;
  m_maiMantissaSkewFactor = sei.m_maiMantissaSkewFactor;
  m_maiPrecRotationParam = sei.m_maiPrecRotationParam;
  m_maiPrecTranslationParam = sei.m_maiPrecTranslationParam;
  m_maiSignR = sei.m_maiSignR;
  m_maiExponentR = sei.m_maiExponentR;
  m_maiMantissaR = sei.m_maiMantissaR;
  m_maiSignT = sei.m_maiSignT;
  m_maiExponentT = sei.m_maiExponentT;
  m_maiMantissaT = sei.m_maiMantissaT;
}

SEIMultiviewViewPosition::SEIMultiviewViewPosition(const SEIMultiviewViewPosition& sei)
{
  m_mvpNumViewsMinus1 = sei.m_mvpNumViewsMinus1;
  m_mvpViewPosition = sei.m_mvpViewPosition;
}

SEIAlphaChannelInfo::SEIAlphaChannelInfo(const SEIAlphaChannelInfo& sei)
{
  m_aciCancelFlag = sei.m_aciCancelFlag;
  m_aciUseIdc = sei.m_aciUseIdc;
  m_aciBitDepthMinus8 = sei.m_aciBitDepthMinus8;
  m_aciTransparentValue = sei.m_aciTransparentValue;
  m_aciOpaqueValue = sei.m_aciOpaqueValue;
  m_aciIncrFlag = sei.m_aciIncrFlag;
  m_aciClipFlag = sei.m_aciClipFlag;
  m_aciClipTypeFlag = sei.m_aciClipTypeFlag;
}

SEIDepthRepresentationInfo::SEIDepthRepresentationInfo(const SEIDepthRepresentationInfo& sei)
{
  m_driZNearFlag = sei.m_driZNearFlag;
  m_driZFarFlag = sei.m_driZFarFlag;
  m_driDMinFlag = sei.m_driDMinFlag;
  m_driDMaxFlag = sei.m_driDMaxFlag;
  m_driZNear = sei.m_driZNear;
  m_driZFar = sei.m_driZFar;
  m_driDMin = sei.m_driDMin;
  m_driDMax = sei.m_driDMax;
  m_driDepthRepresentationType = sei.m_driDepthRepresentationType;
  m_driDisparityRefViewId = sei.m_driDisparityRefViewId;
  m_driDepthNonlinearRepresentationNumMinus1 = sei.m_driDepthNonlinearRepresentationNumMinus1;
  m_driDepthNonlinearRepresentationModel = sei.m_driDepthNonlinearRepresentationModel;
}

SEISampleAspectRatioInfo::SEISampleAspectRatioInfo(const SEISampleAspectRatioInfo& sei)
{
  m_sariCancelFlag = sei.m_sariCancelFlag;
  m_sariPersistenceFlag = sei.m_sariPersistenceFlag;
  m_sariAspectRatioIdc = sei.m_sariAspectRatioIdc;
  m_sariSarWidth = sei.m_sariSarWidth;
  m_sariSarHeight = sei.m_sariSarHeight;
}

SEIPhaseIndication::SEIPhaseIndication(const SEIPhaseIndication& sei)
{
  m_horPhaseNum = sei.m_horPhaseNum;
  m_horPhaseDenMinus1 = sei.m_horPhaseDenMinus1;
  m_verPhaseNum = sei.m_verPhaseNum;
  m_verPhaseDenMinus1 = sei.m_verPhaseDenMinus1;
}

SEIDecodedPictureHash::SEIDecodedPictureHash(const SEIDecodedPictureHash& sei)
{
  method = sei.method;
  singleCompFlag = sei.singleCompFlag;
  m_pictureHash = sei.m_pictureHash;
}

SEIBufferingPeriod::SEIBufferingPeriod(const SEIBufferingPeriod& sei) = default;

SEIPictureTiming::SEIPictureTiming(const SEIPictureTiming& sei) = default;

SEIDecodingUnitInfo::SEIDecodingUnitInfo(const SEIDecodingUnitInfo& sei) = default;

SEIFrameFieldInfo::SEIFrameFieldInfo(const SEIFrameFieldInfo& sei)
{
  m_fieldPicFlag = sei.m_fieldPicFlag;
  m_bottomFieldFlag = sei.m_bottomFieldFlag;
  m_pairingIndicatedFlag = sei.m_pairingIndicatedFlag;
  m_pairedWithNextFieldFlag = sei.m_pairedWithNextFieldFlag;
  m_displayFieldsFromFrameFlag = sei.m_displayFieldsFromFrameFlag;
  m_topFieldFirstFlag = sei.m_topFieldFirstFlag;
  m_displayElementalPeriodsMinus1 = sei.m_displayElementalPeriodsMinus1;
  m_sourceScanType = sei.m_sourceScanType;
  m_duplicateFlag = sei.m_duplicateFlag;
}

SEIFramePacking::SEIFramePacking(const SEIFramePacking& sei)
{
  m_arrangementId = sei.m_arrangementId;
  m_arrangementCancelFlag = sei.m_arrangementCancelFlag;
  m_arrangementType = sei.m_arrangementType;
  m_quincunxSamplingFlag = sei.m_quincunxSamplingFlag;
  m_contentInterpretationType = sei.m_contentInterpretationType;
  m_spatialFlippingFlag = sei.m_spatialFlippingFlag;
  m_frame0FlippedFlag = sei.m_frame0FlippedFlag;
  m_fieldViewsFlag = sei.m_fieldViewsFlag;
  m_currentFrameIsFrame0Flag = sei.m_currentFrameIsFrame0Flag;
  m_frame0SelfContainedFlag = sei.m_frame0SelfContainedFlag;
  m_frame1SelfContainedFlag = sei.m_frame1SelfContainedFlag;
  m_frame0GridPositionX = sei.m_frame0GridPositionX;
  m_frame0GridPositionY = sei.m_frame0GridPositionY;
  m_frame1GridPositionX = sei.m_frame1GridPositionX;
  m_frame1GridPositionY = sei.m_frame1GridPositionY;
  m_arrangementReservedByte = sei.m_arrangementReservedByte;
  m_arrangementPersistenceFlag = sei.m_arrangementPersistenceFlag;
  m_upsampledAspectRatio = sei.m_upsampledAspectRatio;
}

SEIDisplayOrientation::SEIDisplayOrientation(const SEIDisplayOrientation& sei)
{
  m_doCancelFlag = sei.m_doCancelFlag;
  m_doPersistenceFlag = sei.m_doPersistenceFlag;
  m_doTransformType = sei.m_doTransformType;
}

SEIGreenMetadataInfo::SEIGreenMetadataInfo(const SEIGreenMetadataInfo& sei)
{
  m_greenMetadataType = sei.m_greenMetadataType;
  m_xsdSubpicNumberMinus1 = sei.m_xsdSubpicNumberMinus1;
#if GREEN_METADATA_SEI_ENABLED
  m_xsdSubPicIdc = sei.m_xsdSubPicIdc;
#endif
  m_xsdMetricValuePSNR = sei.m_xsdMetricValuePSNR;
  m_xsdMetricValueSSIM = sei.m_xsdMetricValueSSIM;
  m_xsdMetricValueWPSNR = sei.m_xsdMetricValueWPSNR;
  m_xsdMetricValueWSPSNR = sei.m_xsdMetricValueWSPSNR;
  m_xsdMetricTypePSNR = sei.m_xsdMetricTypePSNR;
  m_xsdMetricTypeSSIM = sei.m_xsdMetricTypeSSIM;
  m_xsdMetricTypeWPSNR = sei.m_xsdMetricTypeWPSNR;
  m_xsdMetricTypeWSPSNR = sei.m_xsdMetricTypeWSPSNR;
  m_greenMetadataGranularityType = sei.m_greenMetadataGranularityType;
  m_greenMetadataExtendedRepresentation = sei.m_greenMetadataExtendedRepresentation;
  m_periodType = sei.m_periodType;
  m_numPictures = sei.m_numPictures;
  m_numSeconds = sei.m_numSeconds;
  m_greenComplexityMetrics.portionNonZeroBlocksArea = sei.m_greenComplexityMetrics.portionNonZeroBlocksArea;
  m_greenComplexityMetrics.portionNonZero_4_8_16BlocksArea = sei.m_greenComplexityMetrics.portionNonZero_4_8_16BlocksArea;
  m_greenComplexityMetrics.portionNonZero_32_64_128BlocksArea = sei.m_greenComplexityMetrics.portionNonZero_32_64_128BlocksArea;
  m_greenComplexityMetrics.portionNonZero_256_512_1024BlocksArea = sei.m_greenComplexityMetrics.portionNonZero_256_512_1024BlocksArea;
  m_greenComplexityMetrics.portionNonZero_2048_4096BlocksArea = sei.m_greenComplexityMetrics.portionNonZero_2048_4096BlocksArea;
  m_greenComplexityMetrics.portionNonZeroTransformCoefficientsArea = sei.m_greenComplexityMetrics.portionNonZeroTransformCoefficientsArea;
  m_greenComplexityMetrics.portionIntraPredictedBlocksArea = sei.m_greenComplexityMetrics.portionIntraPredictedBlocksArea;
  m_greenComplexityMetrics.portionBdofBlocksArea = sei.m_greenComplexityMetrics.portionBdofBlocksArea;
  m_greenComplexityMetrics.portionBiAndGpmPredictedBlocksArea = sei.m_greenComplexityMetrics.portionBiAndGpmPredictedBlocksArea;
  m_greenComplexityMetrics.portionDeblockingInstances = sei.m_greenComplexityMetrics.portionDeblockingInstances;
  m_greenComplexityMetrics.portionSaoInstances = sei.m_greenComplexityMetrics.portionSaoInstances;
  m_greenComplexityMetrics.portionAlfInstances = sei.m_greenComplexityMetrics.portionAlfInstances;
}

SEIParameterSetsInclusionIndication::SEIParameterSetsInclusionIndication(const SEIParameterSetsInclusionIndication& sei)
{
  m_selfContainedClvsFlag = sei.m_selfContainedClvsFlag;
}

SEIMasteringDisplayColourVolume::SEIMasteringDisplayColourVolume(const SEIMasteringDisplayColourVolume& sei)
{
  values.colourVolumeSEIEnabled = sei.values.colourVolumeSEIEnabled;
  values.maxLuminance = sei.values.maxLuminance;
  values.minLuminance = sei.values.minLuminance;
  std::memcpy(values.primaries, sei.values.primaries, sizeof(sei.values.primaries));
  std::memcpy(values.whitePoint, sei.values.whitePoint, sizeof(sei.values.whitePoint));
}

SEIScalableNesting::SEIScalableNesting(const SEIScalableNesting& sei) = default;

SEIAlternativeTransferCharacteristics::SEIAlternativeTransferCharacteristics(const SEIAlternativeTransferCharacteristics& sei)
{
  m_preferredTransferCharacteristics = sei.m_preferredTransferCharacteristics;
}

SEIUserDataRegistered::SEIUserDataRegistered(const SEIUserDataRegistered& sei)
{
  m_ituCountryCode = sei.m_ituCountryCode;
  m_userData = sei.m_userData;
}

SEIFilmGrainCharacteristics::SEIFilmGrainCharacteristics(const SEIFilmGrainCharacteristics& sei)
{
  m_filmGrainCharacteristicsCancelFlag = sei.m_filmGrainCharacteristicsCancelFlag;
  m_filmGrainModelId = sei.m_filmGrainModelId;
  m_separateColourDescriptionPresentFlag = sei.m_separateColourDescriptionPresentFlag;
  m_filmGrainBitDepthLumaMinus8 = sei.m_filmGrainBitDepthLumaMinus8;
  m_filmGrainBitDepthChromaMinus8 = sei.m_filmGrainBitDepthChromaMinus8;
  m_filmGrainFullRangeFlag = sei.m_filmGrainFullRangeFlag;
  m_filmGrainColourPrimaries = sei.m_filmGrainColourPrimaries;
  m_filmGrainTransferCharacteristics = sei.m_filmGrainTransferCharacteristics;
  m_filmGrainMatrixCoeffs = sei.m_filmGrainMatrixCoeffs;
  m_blendingModeId = sei.m_blendingModeId;
  m_log2ScaleFactor = sei.m_log2ScaleFactor;
  for (int i = 0; i < MAX_NUM_COMPONENT; i++)
  {
    m_compModel[i].presentFlag = sei.m_compModel[i].presentFlag;
    m_compModel[i].numModelValues = sei.m_compModel[i].numModelValues;
    m_compModel[i].numIntensityIntervals = sei.m_compModel[i].numIntensityIntervals;
    m_compModel[i].intensityValues = sei.m_compModel[i].intensityValues;
  }
  m_filmGrainCharacteristicsPersistenceFlag = sei.m_filmGrainCharacteristicsPersistenceFlag;
}

SEIContentLightLevelInfo::SEIContentLightLevelInfo(const SEIContentLightLevelInfo& sei)
{
  m_maxContentLightLevel = sei.m_maxContentLightLevel;
  m_maxPicAverageLightLevel = sei.m_maxPicAverageLightLevel;
}

SEIAmbientViewingEnvironment::SEIAmbientViewingEnvironment(const SEIAmbientViewingEnvironment& sei)
{
  m_ambientIlluminance = sei.m_ambientIlluminance;
  m_ambientLightX = sei.m_ambientLightX;
  m_ambientLightY = sei.m_ambientLightY;
}

SEIColourTransformInfo::SEIColourTransformInfo(const SEIColourTransformInfo& sei)
{
  m_id = sei.m_id;
  m_signalInfoFlag = sei.m_signalInfoFlag;
  m_fullRangeFlag = sei.m_fullRangeFlag;
  m_primaries = sei.m_primaries;
  m_transferFunction = sei.m_transferFunction;
  m_matrixCoefs = sei.m_matrixCoefs;
  m_crossComponentFlag = sei.m_crossComponentFlag;
  m_crossComponentInferred = sei.m_crossComponentInferred;
  m_numberChromaLutMinus1 = sei.m_numberChromaLutMinus1;
  m_chromaOffset = sei.m_chromaOffset;
  m_bitdepth = sei.m_bitdepth;
  m_log2NumberOfPointsPerLut = sei.m_log2NumberOfPointsPerLut;
  for (int i = 0; i < MAX_NUM_COMPONENT; i++)
  {
    m_lut[i].presentFlag = sei.m_lut[i].presentFlag;
    m_lut[i].numLutValues = sei.m_lut[i].numLutValues;
    m_lut[i].lutValues = sei.m_lut[i].lutValues;
  }
}

SEIContentColourVolume::SEIContentColourVolume(const SEIContentColourVolume& sei)
{
  m_ccvCancelFlag = sei.m_ccvCancelFlag;
  m_ccvPersistenceFlag = sei.m_ccvPersistenceFlag;
  m_ccvPrimariesPresentFlag = sei.m_ccvPrimariesPresentFlag;
  m_ccvMinLuminanceValuePresentFlag = sei.m_ccvMinLuminanceValuePresentFlag;
  m_ccvMaxLuminanceValuePresentFlag = sei.m_ccvMaxLuminanceValuePresentFlag;
  m_ccvAvgLuminanceValuePresentFlag = sei.m_ccvAvgLuminanceValuePresentFlag;
  std::memcpy(m_ccvPrimariesX, sei.m_ccvPrimariesX, sizeof(sei.m_ccvPrimariesX));
  std::memcpy(m_ccvPrimariesY, sei.m_ccvPrimariesY, sizeof(sei.m_ccvPrimariesY));
  m_ccvMinLuminanceValue = sei.m_ccvMinLuminanceValue;
  m_ccvMaxLuminanceValue = sei.m_ccvMaxLuminanceValue;
  m_ccvAvgLuminanceValue = sei.m_ccvAvgLuminanceValue;
}

SEISubpictureLevelInfo::SEISubpictureLevelInfo(const SEISubpictureLevelInfo& sli) = default;

SEIManifest::SEIManifest(const SEIManifest& sei)
{
  m_manifestNumSeiMsgTypes = sei.m_manifestNumSeiMsgTypes;
  m_manifestSeiPayloadType = sei.m_manifestSeiPayloadType;
  m_manifestSeiDescription = sei.m_manifestSeiDescription;
}

SEIPrefixIndication::SEIPrefixIndication(const SEIPrefixIndication& sei)
{
  m_prefixSeiPayloadType = sei.m_prefixSeiPayloadType;
  m_numSeiPrefixIndicationsMinus1 = sei.m_numSeiPrefixIndicationsMinus1;
  m_numBitsInPrefixIndicationMinus1 = sei.m_numBitsInPrefixIndicationMinus1;
  m_seiPrefixDataBit = sei.m_seiPrefixDataBit;
  m_payload = sei.m_payload;
}

SEIExtendedDrapIndication::SEIExtendedDrapIndication(const SEIExtendedDrapIndication& sei)
{
  m_edrapIndicationRapIdMinus1 = sei.m_edrapIndicationRapIdMinus1;
  m_edrapIndicationLeadingPicturesDecodableFlag = sei.m_edrapIndicationLeadingPicturesDecodableFlag;
  m_edrapIndicationReservedZero12Bits = sei.m_edrapIndicationReservedZero12Bits;
  m_edrapIndicationNumRefRapPicsMinus1 = sei.m_edrapIndicationNumRefRapPicsMinus1;
  m_edrapIndicationRefRapId = sei.m_edrapIndicationRefRapId;
}

SEINeuralNetworkPostFilterCharacteristics::SEINeuralNetworkPostFilterCharacteristics(
  const SEINeuralNetworkPostFilterCharacteristics& sei)
{
  m_id = sei.m_id;
  m_modeIdc = sei.m_modeIdc;
  m_propertyPresentFlag = sei.m_propertyPresentFlag;
  m_purpose = sei.m_purpose;
  m_outSubCFlag = sei.m_outSubCFlag;
  m_outSubWidthC = sei.m_outSubWidthC;
  m_outSubHeightC = sei.m_outSubHeightC;
  m_outColourFormatIdc = sei.m_outColourFormatIdc;
  m_picWidthNumeratorMinus1 = sei.m_picWidthNumeratorMinus1;
  m_picWidthDenominatorMinus1 = sei.m_picWidthDenominatorMinus1;
  m_picHeightNumeratorMinus1 = sei.m_picHeightNumeratorMinus1;
  m_picHeightDenominatorMinus1 = sei.m_picHeightDenominatorMinus1;
  m_picWidthInLumaSamples = sei.m_picWidthInLumaSamples;
  m_picHeightInLumaSamples = sei.m_picHeightInLumaSamples;
  m_inpTensorBitDepthLumaMinus8 = sei.m_inpTensorBitDepthLumaMinus8;
  m_inpTensorBitDepthChromaMinus8 = sei.m_inpTensorBitDepthChromaMinus8;
  m_outTensorBitDepthLumaMinus8 = sei.m_outTensorBitDepthLumaMinus8;
  m_outTensorBitDepthChromaMinus8 = sei.m_outTensorBitDepthChromaMinus8;
  m_componentLastFlag = sei.m_componentLastFlag;
  m_inpFormatIdc = sei.m_inpFormatIdc;
  m_auxInpIdc = sei.m_auxInpIdc;
  m_sepColDescriptionFlag = sei.m_sepColDescriptionFlag;
  m_fullRangeFlag = sei.m_fullRangeFlag;
  m_colPrimaries = sei.m_colPrimaries;
  m_transCharacteristics = sei.m_transCharacteristics;
  m_matrixCoeffs = sei.m_matrixCoeffs;
  m_inpOrderIdc = sei.m_inpOrderIdc;
  m_outFormatIdc = sei.m_outFormatIdc;
  m_outOrderIdc = sei.m_outOrderIdc;
  m_constantPatchSizeFlag = sei.m_constantPatchSizeFlag;
  m_patchWidthMinus1 = sei.m_patchWidthMinus1;
  m_patchHeightMinus1 = sei.m_patchHeightMinus1;
  m_extendedPatchWidthCdDeltaMinus1 = sei.m_extendedPatchWidthCdDeltaMinus1;
  m_extendedPatchHeightCdDeltaMinus1 = sei.m_extendedPatchHeightCdDeltaMinus1;
  m_overlap = sei.m_overlap;
  m_paddingType = sei.m_paddingType;
  m_lumaPadding = sei.m_lumaPadding;
  m_cbPadding = sei.m_cbPadding;
  m_crPadding = sei.m_crPadding;
  m_payloadLength = sei.m_payloadLength;
  m_payloadByte = sei.m_payloadByte ? new char(*sei.m_payloadByte) : nullptr;
  m_complexityInfoPresentFlag = sei.m_complexityInfoPresentFlag;
  m_applicationPurposeTagUriPresentFlag = sei.m_applicationPurposeTagUriPresentFlag;
  m_applicationPurposeTagUri = sei.m_applicationPurposeTagUri;
  m_forHumanViewingIdc = sei.m_forHumanViewingIdc;
  m_forMachineAnalysisIdc = sei.m_forMachineAnalysisIdc;
  m_uriTag = sei.m_uriTag;
  m_uri = sei.m_uri;
  m_parameterTypeIdc = sei.m_parameterTypeIdc;
  m_log2ParameterBitLengthMinus3 = sei.m_log2ParameterBitLengthMinus3;
  m_numParametersIdc = sei.m_numParametersIdc;
  m_numKmacOperationsIdc = sei.m_numKmacOperationsIdc;
  m_totalKilobyteSize = sei.m_totalKilobyteSize;
  m_numberInputDecodedPicturesMinus1 = sei.m_numberInputDecodedPicturesMinus1;
  m_numberInterpolatedPictures = sei.m_numberInterpolatedPictures;
  m_numberExtrapolatedPicturesMinus1 = sei.m_numberExtrapolatedPicturesMinus1;
  m_spatialExtrapolationLeftOffset = sei.m_spatialExtrapolationLeftOffset;
  m_spatialExtrapolationRightOffset = sei.m_spatialExtrapolationRightOffset;
  m_spatialExtrapolationTopOffset = sei.m_spatialExtrapolationTopOffset;
  m_spatialExtrapolationBottomOffset = sei.m_spatialExtrapolationBottomOffset;
  m_inbandPromptFlag = sei.m_inbandPromptFlag;
  m_prompt =  sei.m_prompt;
  m_inputPicOutputFlag = sei.m_inputPicOutputFlag;
}

bool SEINeuralNetworkPostFilterCharacteristics::operator == (const SEINeuralNetworkPostFilterCharacteristics& sei)
{
  bool result = 
  m_id == sei.m_id &&
  m_modeIdc == sei.m_modeIdc &&
  m_propertyPresentFlag == sei.m_propertyPresentFlag &&
  m_purpose == sei.m_purpose &&
  m_outSubCFlag == sei.m_outSubCFlag &&
  m_outSubWidthC == sei.m_outSubWidthC &&
  m_outSubHeightC == sei.m_outSubHeightC &&
  m_outColourFormatIdc == sei.m_outColourFormatIdc &&
  m_picWidthNumeratorMinus1 == sei.m_picWidthNumeratorMinus1 &&
  m_picWidthDenominatorMinus1 == sei.m_picWidthDenominatorMinus1 &&
  m_picHeightNumeratorMinus1 == sei.m_picHeightNumeratorMinus1 &&
  m_picHeightDenominatorMinus1 == sei.m_picHeightDenominatorMinus1 &&
  m_picWidthInLumaSamples == sei.m_picWidthInLumaSamples &&
  m_picHeightInLumaSamples == sei.m_picHeightInLumaSamples &&
  m_inpTensorBitDepthLumaMinus8 == sei.m_inpTensorBitDepthLumaMinus8 &&
  m_inpTensorBitDepthChromaMinus8 == sei.m_inpTensorBitDepthChromaMinus8 &&
  m_outTensorBitDepthLumaMinus8 == sei.m_outTensorBitDepthLumaMinus8 &&
  m_outTensorBitDepthChromaMinus8 == sei.m_outTensorBitDepthChromaMinus8 &&
  m_componentLastFlag == sei.m_componentLastFlag &&
  m_inpFormatIdc == sei.m_inpFormatIdc &&
  m_auxInpIdc == sei.m_auxInpIdc &&
  m_sepColDescriptionFlag == sei.m_sepColDescriptionFlag &&
  m_fullRangeFlag == sei.m_fullRangeFlag &&
  m_colPrimaries == sei.m_colPrimaries &&
  m_transCharacteristics == sei.m_transCharacteristics &&
  m_matrixCoeffs == sei.m_matrixCoeffs &&
  m_inpOrderIdc == sei.m_inpOrderIdc &&
  m_outFormatIdc == sei.m_outFormatIdc &&
  m_outOrderIdc == sei.m_outOrderIdc &&
  m_constantPatchSizeFlag == sei.m_constantPatchSizeFlag &&
  m_patchWidthMinus1 == sei.m_patchWidthMinus1 &&
  m_patchHeightMinus1 == sei.m_patchHeightMinus1 &&
  m_extendedPatchWidthCdDeltaMinus1 == sei.m_extendedPatchWidthCdDeltaMinus1 &&
  m_extendedPatchHeightCdDeltaMinus1 == sei.m_extendedPatchHeightCdDeltaMinus1 &&
  m_overlap == sei.m_overlap &&
  m_paddingType == sei.m_paddingType &&
  m_lumaPadding == sei.m_lumaPadding &&
  m_cbPadding == sei.m_cbPadding &&
  m_crPadding == sei.m_crPadding &&
  m_complexityInfoPresentFlag == sei.m_complexityInfoPresentFlag &&
  m_applicationPurposeTagUriPresentFlag == sei.m_applicationPurposeTagUriPresentFlag &&
  m_applicationPurposeTagUri == sei.m_applicationPurposeTagUri &&
  m_uriTag == sei.m_uriTag &&
  m_uri == sei.m_uri &&
  m_parameterTypeIdc == sei.m_parameterTypeIdc &&
  m_log2ParameterBitLengthMinus3 == sei.m_log2ParameterBitLengthMinus3 &&
  m_numParametersIdc == sei.m_numParametersIdc &&
  m_numKmacOperationsIdc == sei.m_numKmacOperationsIdc &&
  m_totalKilobyteSize == sei.m_totalKilobyteSize &&
  m_numberInputDecodedPicturesMinus1 == sei.m_numberInputDecodedPicturesMinus1 &&
  m_numberInterpolatedPictures == sei.m_numberInterpolatedPictures &&
  m_numberExtrapolatedPicturesMinus1 == sei.m_numberExtrapolatedPicturesMinus1 &&
  m_spatialExtrapolationLeftOffset == sei.m_spatialExtrapolationLeftOffset &&
  m_spatialExtrapolationRightOffset == sei.m_spatialExtrapolationRightOffset &&
  m_spatialExtrapolationTopOffset == sei.m_spatialExtrapolationTopOffset &&
  m_spatialExtrapolationBottomOffset == sei.m_spatialExtrapolationBottomOffset &&
  m_inbandPromptFlag == sei.m_inbandPromptFlag  &&
  m_prompt ==  sei.m_prompt  &&
  m_inputPicOutputFlag == sei.m_inputPicOutputFlag &&
  m_payloadLength == sei.m_payloadLength;

  if (m_payloadByte && sei.m_payloadByte && m_payloadLength == sei.m_payloadLength)
  {
    result &= !std::strncmp(m_payloadByte, sei.m_payloadByte, m_payloadLength);
  }
  else if ((m_payloadByte && !sei.m_payloadByte) || (!m_payloadByte && sei.m_payloadByte))
  {
    result = false;
  }

  return result;
}

SEINeuralNetworkPostFilterActivation::SEINeuralNetworkPostFilterActivation(
  const SEINeuralNetworkPostFilterActivation& sei)
{
  m_targetId = sei.m_targetId;
  m_cancelFlag = sei.m_cancelFlag;
  m_persistenceFlag = sei.m_persistenceFlag;
  m_targetBaseFlag = sei.m_targetBaseFlag;
  m_noPrevCLVSFlag = sei.m_noPrevCLVSFlag;
  m_noFollCLVSFlag = sei.m_noFollCLVSFlag;
  m_outputFlag = sei.m_outputFlag;
#if JVET_AJ0104_NNPFA_PROMPT_UPDATE
  m_promptUpdateFlag = sei.m_promptUpdateFlag;
  m_prompt = sei.m_prompt;
#endif
#if JVET_AJ0114_NNPFA_NUM_PIC_SHIFT
  m_numInputPicShift = sei.m_numInputPicShift;
#endif 
}

SEIPostFilterHint::SEIPostFilterHint(const SEIPostFilterHint& sei)
{
  m_filterHintCancelFlag = sei.m_filterHintCancelFlag;
  m_filterHintPersistenceFlag = sei.m_filterHintPersistenceFlag;
  m_filterHintSizeY = sei.m_filterHintSizeY;
  m_filterHintSizeX = sei.m_filterHintSizeX;
  m_filterHintType = sei.m_filterHintType;
  m_filterHintChromaCoeffPresentFlag = sei.m_filterHintChromaCoeffPresentFlag;
  m_filterHintValues = sei.m_filterHintValues;
}

  SEITextDescription::SEITextDescription(const SEITextDescription& sei)
  {
    m_textDescriptionID = sei.m_textDescriptionID;
    m_textCancelFlag = sei.m_textCancelFlag;
    m_textIDCancelFlag = sei.m_textIDCancelFlag;
    m_textPersistenceFlag = sei.m_textPersistenceFlag;
    m_textDescriptionPurpose = sei.m_textDescriptionPurpose;
    m_textNumStringsMinus1 = sei.m_textNumStringsMinus1;
    m_textDescriptionStringLang.resize(m_textNumStringsMinus1+1);
    m_textDescriptionString.resize(m_textNumStringsMinus1+1);
    for (int i=0; i<=m_textNumStringsMinus1; i++)
    {
      m_textDescriptionStringLang[i] = sei.m_textDescriptionStringLang[i];
      m_textDescriptionString[i] = sei.m_textDescriptionString[i];
    }
  }

SEINeuralNetworkPostFilterCharacteristics* getNnpfcWithGivenId(const SEIMessages &seiList, uint32_t id)
{
  for (auto sei : seiList)
  {
    auto *nnpfcSEI = (SEINeuralNetworkPostFilterCharacteristics *) sei;
    if (id == nnpfcSEI->m_id)
    {
      return nnpfcSEI;
    }
  }
  return nullptr;
}

SEINeuralNetworkPostFilterCharacteristics* getSuperResolutionNnpfc(const SEIMessages &seiList)
{
  for (auto sei: seiList)
  {
    auto *nnpfcSEI = (SEINeuralNetworkPostFilterCharacteristics *) sei;
    if ((nnpfcSEI->m_purpose & NNPC_PurposeType::RESOLUTION_UPSAMPLING) != 0)
    {
      return nnpfcSEI;
    }
  }
  return nullptr;
}

SEIEncoderOptimizationInfo::SEIEncoderOptimizationInfo(
  const SEIEncoderOptimizationInfo& sei)
{
  m_cancelFlag = sei.m_cancelFlag;
  m_persistenceFlag = sei.m_persistenceFlag;
  m_forHumanViewingIdc = sei.m_forHumanViewingIdc;
  m_forMachineAnalysisIdc = sei.m_forMachineAnalysisIdc;
  m_type = sei.m_type;
  m_objectBasedIdc = sei.m_objectBasedIdc;
  m_temporalResamplingTypeFlag = sei.m_temporalResamplingTypeFlag;
  m_numIntPics = sei.m_numIntPics;
  m_origPicDimensionsFlag = sei.m_origPicDimensionsFlag;
  m_origPicWidth = sei.m_origPicWidth;
  m_origPicHeight = sei.m_origPicHeight;
  m_spatialResamplingTypeFlag = sei.m_spatialResamplingTypeFlag;
  m_privacyProtectionTypeIdc = sei.m_privacyProtectionTypeIdc;
  m_privacyProtectedInfoType = sei.m_privacyProtectedInfoType;

}

SEIModalityInfo::SEIModalityInfo(const SEIModalityInfo& sei)
{
  m_miCancelFlag = sei.m_miCancelFlag;
  m_miPersistenceFlag = sei.m_miPersistenceFlag;
  m_miModalityType = sei.m_miModalityType;
  m_miSpectrumRangePresentFlag = sei.m_miSpectrumRangePresentFlag;
  m_miMinWavelengthMantissa = sei.m_miMinWavelengthMantissa;
  m_miMinWavelengthExponentPlus15 = sei.m_miMinWavelengthExponentPlus15;
  m_miMaxWavelengthMantissa = sei.m_miMaxWavelengthMantissa;
  m_miMaxWavelengthExponentPlus15 = sei.m_miMaxWavelengthExponentPlus15;
}

SEIGenerativeFaceVideo::SEIGenerativeFaceVideo(const SEIGenerativeFaceVideo & sei)
{
  m_number = sei.m_number;
  m_currentid = sei.m_currentid;
  m_id = sei.m_id;
  m_cnt = sei.m_cnt;
  m_basePicFlag = sei.m_basePicFlag;
  m_nnPresentFlag = sei.m_nnPresentFlag;
  m_nnModeIdc = sei.m_nnModeIdc;
  m_nnTagURI = sei.m_nnTagURI;
  m_nnURI = sei.m_nnURI;
  m_chromaKeyInfoPresentFlag = sei.m_chromaKeyInfoPresentFlag;
  m_chromaKeyValuePresentFlag = sei.m_chromaKeyValuePresentFlag;
  m_chromaKeyValue = sei.m_chromaKeyValue;
  m_chromaKeyThrPresentFlag = sei.m_chromaKeyThrPresentFlag;
  m_chromaKeyThrValue = sei.m_chromaKeyThrValue;
  m_drivePicFusionFlag = sei.m_drivePicFusionFlag;
  m_lowConfidenceFaceParameterFlag = sei.m_lowConfidenceFaceParameterFlag;
  m_coordinatePresentFlag = sei.m_coordinatePresentFlag;
  m_coordinateQuantizationFactor = sei.m_coordinateQuantizationFactor;
  m_coordinatePredFlag = sei.m_coordinatePredFlag;
  m_3DCoordinateFlag = sei.m_3DCoordinateFlag;
  m_coordinatePointNum = sei.m_coordinatePointNum;
  m_coordinateX = sei.m_coordinateX;
  m_coordinateY = sei.m_coordinateY;
  m_coordinateZMaxValue = sei.m_coordinateZMaxValue;
  m_coordinateZ = sei.m_coordinateZ;
  m_matrixPresentFlag = sei.m_matrixPresentFlag;
  m_matrixElementPrecisionFactor = sei.m_matrixElementPrecisionFactor;
  m_matrixPredFlag = sei.m_matrixPredFlag;
  m_numMatricestonumKpsFlag = sei.m_numMatricestonumKpsFlag;
  m_numMatricesInfo = sei.m_numMatricesInfo;
  m_numMatrixType = sei.m_numMatrixType;
  m_matrixTypeIdx = sei.m_matrixTypeIdx;
  m_matrix3DSpaceFlag = sei.m_matrix3DSpaceFlag;
  m_numMatrices = sei.m_numMatrices;
  m_matrixWidth = sei.m_matrixWidth;
  m_matrixHeight = sei.m_matrixHeight;
  m_matrixElement = sei.m_matrixElement;
  m_payloadFilename = sei.m_payloadFilename;
  m_payloadLength = sei.m_payloadLength;
  m_payloadByte = sei.m_payloadByte ? new char(*sei.m_payloadByte) : nullptr;
  m_numMatricesstore = sei.m_numMatricesstore;
  m_matrixWidthstore = sei.m_matrixWidthstore;
  m_matrixHeightstore = sei.m_matrixHeightstore;
}