Skip to content
Snippets Groups Projects
SEIEncoder.cpp 92.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jie Chen's avatar
    Jie Chen committed
          readTokenValue(seiObjMask->m_hdr.m_maskLabelLanguagePresentFlag, failed, fic,"SEIOmiMaskLabelLanguagePresentFlag");
          if (seiObjMask->m_hdr.m_maskLabelLanguagePresentFlag)
          {
            readTokenValue(seiObjMask->m_hdr.m_maskLabelLanguage, failed, fic, "SEIOmiMaskLabelLanguage");
          }
        }
    
        uint32_t objMaskInfoCnt = 0;
        seiObjMask->m_maskPicUpdateFlag.resize(seiObjMask->m_hdr.m_numAuxPicLayerMinus1 + 1);
        seiObjMask->m_numMaskInPicUpdate.resize(seiObjMask->m_hdr.m_numAuxPicLayerMinus1 + 1);
        for (uint32_t i = 0; i <= seiObjMask->m_hdr.m_numAuxPicLayerMinus1; i++)
        {
          std::string cfgMaskPicUpdateFlagStr = "SEIOmiMaskPicUpdateFlag[" + std::to_string(i) + "]";
          readTokenValue(seiObjMask->m_maskPicUpdateFlag[i], failed, fic, cfgMaskPicUpdateFlagStr.c_str());
          if (seiObjMask->m_maskPicUpdateFlag[i])
          {
            std::string cfgNumMaskInPicUpdataStr = "SEIOmiNumMaskInPicUpdate[" + std::to_string(i) + "]";
            readTokenValueAndValidate<uint32_t>(seiObjMask->m_numMaskInPicUpdate[i], failed, fic, cfgNumMaskInPicUpdataStr.c_str(), uint32_t(0), uint32_t((1 << (seiObjMask->m_hdr.m_maskIdLengthMinus1 + 1)) - 1));
            seiObjMask->m_objectMaskInfos.resize(objMaskInfoCnt + seiObjMask->m_numMaskInPicUpdate[i]);
            for (uint32_t j = 0; j < seiObjMask->m_numMaskInPicUpdate[i]; j++)
            {
              SEIObjectMaskInfos::ObjectMaskInfo& omi = seiObjMask->m_objectMaskInfos[objMaskInfoCnt];
    
              std::string cfgMaskIdStr = "SEIOmiMaskId[" + std::to_string(i) + "][" + std::to_string(j) + "]";
              std::string cfgAuxSampleValueStr = "SEIOmiAuxSampleValue[" + std::to_string(i) + "][" + std::to_string(j) + "]";
              std::string cfgMaskCancelStr = "SEIOmiMaskCancel[" + std::to_string(i) + "][" + std::to_string(j) + "]";
              readTokenValueAndValidate<uint32_t>(omi.maskId, failed, fic, cfgMaskIdStr.c_str(), uint32_t(0), uint32_t((1 << (seiObjMask->m_hdr.m_maskIdLengthMinus1 + 1)) - 1));
              readTokenValueAndValidate<uint32_t>(omi.auxSampleValue, failed, fic, cfgAuxSampleValueStr.c_str(), uint32_t(0), uint32_t((1 << (seiObjMask->m_hdr.m_maskSampleValueLengthMinus8 + 8)) - 1));
              readTokenValue(omi.maskCancel, failed, fic, cfgMaskCancelStr.c_str());
              if (!omi.maskCancel)
              {
                std::string cfgMaskBoundingBoxPresentFlagStr = "SEIOmiBoundingBoxPresentFlag[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                readTokenValue(omi.maskBoundingBoxPresentFlag, failed, fic, cfgMaskBoundingBoxPresentFlagStr.c_str());
    
                if (omi.maskBoundingBoxPresentFlag)
                {
                  std::string cfgMaskTopStr    = "SEIOmiMaskTop[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  std::string cfgMaskLeftStr   = "SEIOmiMaskLeft[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  std::string cfgMaskWidthStr  = "SEIOmiMaskWidth[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  std::string cfgMaskHeightStr = "SEIOmiMaskHeight[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  readTokenValueAndValidate(omi.maskTop, failed, fic, cfgMaskTopStr.c_str(), uint32_t(0), uint32_t(0xffff));
                  readTokenValueAndValidate(omi.maskLeft, failed, fic, cfgMaskLeftStr.c_str(), uint32_t(0), uint32_t(0xffff));
                  readTokenValueAndValidate(omi.maskWidth, failed, fic, cfgMaskWidthStr.c_str(), uint32_t(0),uint32_t(0xffff));
                  readTokenValueAndValidate(omi.maskHeight, failed, fic, cfgMaskHeightStr.c_str(), uint32_t(0),uint32_t(0xffff));
                }
    
                if (seiObjMask->m_hdr.m_maskConfidenceInfoPresentFlag)
                {
                  std::string cfgMaskConfidenceStr = "SEIOmiMaskConfidence[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  readTokenValueAndValidate(omi.maskConfidence, failed, fic, cfgMaskConfidenceStr.c_str(), uint32_t(0), uint32_t((1 << (seiObjMask->m_hdr.m_maskConfidenceLengthMinus1 + 1)) - 1));
                }
    
                if (seiObjMask->m_hdr.m_maskDepthInfoPresentFlag)
                {
                  std::string cfgMaskDepthStr = "SEIOmiMaskDepth[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  readTokenValueAndValidate(omi.maskDepth, failed, fic, cfgMaskDepthStr.c_str(), uint32_t(0), uint32_t((1 << (seiObjMask->m_hdr.m_maskDepthLengthMinus1 + 1)) - 1));
                }
    
                if (seiObjMask->m_hdr.m_maskLabelInfoPresentFlag)
                {
                  std::string cfgMaskLabelStr = "SEIOmiMaskLabel[" + std::to_string(i) + "][" + std::to_string(j) + "]";
                  readTokenValue(omi.maskLabel, failed, fic, cfgMaskLabelStr.c_str());
                }
              }
              objMaskInfoCnt++;
            }
          }
        }
      }
    }
    #endif
    
    
    bool SEIEncoder::initSEIAnnotatedRegions(SEIAnnotatedRegions* SEIAnnoReg, int currPOC)
    {
      assert(m_isInitialized);
    
      assert(SEIAnnoReg != nullptr);
    
    
      // reading external Annotated Regions Information SEI message parameters from file
      if (!m_pcCfg->getAnnotatedRegionSEIFileRoot().empty())
      {
        bool failed = false;
        // building the annotated regions file name with poc num in prefix "_poc.txt"
        std::string AnnoRegionSEIFileWithPoc(m_pcCfg->getAnnotatedRegionSEIFileRoot());
        {
          std::stringstream suffix;
          suffix << "_" << currPOC << ".txt";
          AnnoRegionSEIFileWithPoc += suffix.str();
        }
        std::ifstream fic(AnnoRegionSEIFileWithPoc.c_str());
        if (!fic.good() || !fic.is_open())
        {
          std::cerr << "No Annotated Regions SEI parameters file " << AnnoRegionSEIFileWithPoc << " for POC " << currPOC << std::endl;
          return false;
        }
        //Read annotated region SEI parameters from the cfg file
        readAnnotatedRegionSEI(fic, SEIAnnoReg, failed);
        if (failed)
        {
          std::cerr << "Error while reading Annotated Regions SEI parameters file '" << AnnoRegionSEIFileWithPoc << "'" << std::endl;
          exit(EXIT_FAILURE);
        }
      }
      return true;
    }
    
    
    Jie Chen's avatar
    Jie Chen committed
    #if JVET_AI0153_OMI_SEI
    bool SEIEncoder::initSEIObjectMaskInfos(SEIObjectMaskInfos* SEIObjMask, int currPOC)
    {
      CHECK(m_isInitialized == 0, "SEI is uninitialized");
      CHECK(SEIObjMask == nullptr, "ObjectMaskInfo SEI is undefined");
      if (!m_pcCfg->getObjectMaskInfoSEIFileRoot().empty())
      {
        bool        failed = false;
        std::string ObjMaskSEIFileWithPoc(m_pcCfg->getObjectMaskInfoSEIFileRoot());
        {
          std::stringstream suffix;
          suffix << "_" << currPOC << ".txt";
          ObjMaskSEIFileWithPoc += suffix.str();
        }
        std::ifstream fic(ObjMaskSEIFileWithPoc.c_str());
        if (!fic.good() || !fic.is_open())
        {
          std::cerr << "No Object Mask Informations SEI parameters file " << ObjMaskSEIFileWithPoc << " for POC " << currPOC
                    << std::endl;
          return false;
        }
    
        readObjectMaskInfoSEI(fic, SEIObjMask, failed);
        if (failed)
        {
          std::cerr << "Error while reading Object Mask Informations SEI parameters file '" << ObjMaskSEIFileWithPoc << "'" << std::endl;
          exit(EXIT_FAILURE);
        }
      }
      return true;
    }
    #endif
    
    void SEIEncoder::initSEIAlternativeTransferCharacteristics(SEIAlternativeTransferCharacteristics *seiAltTransCharacteristics)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiAltTransCharacteristics != nullptr), "Unspecified error");
    
      //  Set SEI message parameters read from command line options
      seiAltTransCharacteristics->m_preferredTransferCharacteristics = m_pcCfg->getSEIPreferredTransferCharacteristics();
    }
    
    Taoran Lu's avatar
    Taoran Lu committed
    void SEIEncoder::initSEIFilmGrainCharacteristics(SEIFilmGrainCharacteristics *seiFilmGrain)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiFilmGrain != nullptr), "Unspecified error");
    
    Taoran Lu's avatar
    Taoran Lu committed
      //  Set SEI message parameters read from command line options
      seiFilmGrain->m_filmGrainCharacteristicsCancelFlag      = m_pcCfg->getFilmGrainCharactersticsSEICancelFlag();
      seiFilmGrain->m_filmGrainCharacteristicsPersistenceFlag = m_pcCfg->getFilmGrainCharactersticsSEIPersistenceFlag();
      seiFilmGrain->m_filmGrainModelId                        = m_pcCfg->getFilmGrainCharactersticsSEIModelID();
      seiFilmGrain->m_separateColourDescriptionPresentFlag    = m_pcCfg->getFilmGrainCharactersticsSEISepColourDescPresent();
      seiFilmGrain->m_blendingModeId                          = m_pcCfg->getFilmGrainCharactersticsSEIBlendingModeID();
      seiFilmGrain->m_log2ScaleFactor                         = m_pcCfg->getFilmGrainCharactersticsSEILog2ScaleFactor();
      for (int i = 0; i < MAX_NUM_COMPONENT; i++)
      {
        seiFilmGrain->m_compModel[i].presentFlag = m_pcCfg->getFGCSEICompModelPresent(i);
    
        if (seiFilmGrain->m_compModel[i].presentFlag)
        {
          seiFilmGrain->m_compModel[i].numModelValues = 1 + m_pcCfg->getFGCSEINumModelValuesMinus1(i);
          seiFilmGrain->m_compModel[i].numIntensityIntervals = 1 + m_pcCfg->getFGCSEINumIntensityIntervalMinus1(i);
          seiFilmGrain->m_compModel[i].intensityValues.resize(seiFilmGrain->m_compModel[i].numIntensityIntervals);
          for (int j = 0; j < seiFilmGrain->m_compModel[i].numIntensityIntervals; j++)
          {
            seiFilmGrain->m_compModel[i].intensityValues[j].intensityIntervalLowerBound = m_pcCfg->getFGCSEIIntensityIntervalLowerBound(i, j);
            seiFilmGrain->m_compModel[i].intensityValues[j].intensityIntervalUpperBound = m_pcCfg->getFGCSEIIntensityIntervalUpperBound(i, j);
            seiFilmGrain->m_compModel[i].intensityValues[j].compModelValue.resize(seiFilmGrain->m_compModel[i].numModelValues);
            for (int k = 0; k < seiFilmGrain->m_compModel[i].numModelValues; k++)
            {
              seiFilmGrain->m_compModel[i].intensityValues[j].compModelValue[k] = m_pcCfg->getFGCSEICompModelValue(i, j, k);
            }
          }
        }
    
    Taoran Lu's avatar
    Taoran Lu committed
      }
    }
    
    void SEIEncoder::initSEIMasteringDisplayColourVolume(SEIMasteringDisplayColourVolume *seiMDCV)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiMDCV != nullptr), "Unspecified error");
    
    Taoran Lu's avatar
    Taoran Lu committed
      //  Set SEI message parameters read from command line options
      for (int j = 0; j <= 1; j++)
      {
        for (int i = 0; i <= 2; i++)
        {
           seiMDCV->values.primaries[i][j] = m_pcCfg->getMasteringDisplaySEI().primaries[i][j];
        }
        seiMDCV->values.whitePoint[j] = m_pcCfg->getMasteringDisplaySEI().whitePoint[j];
      }
      seiMDCV->values.maxLuminance = m_pcCfg->getMasteringDisplaySEI().maxLuminance;
      seiMDCV->values.minLuminance = m_pcCfg->getMasteringDisplaySEI().minLuminance;
    }
    
    void SEIEncoder::initSEIContentLightLevel(SEIContentLightLevelInfo *seiCLL)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiCLL != nullptr), "Unspecified error");
    
    Taoran Lu's avatar
    Taoran Lu committed
      //  Set SEI message parameters read from command line options
      seiCLL->m_maxContentLightLevel    = m_pcCfg->getCLLSEIMaxContentLightLevel();
      seiCLL->m_maxPicAverageLightLevel = m_pcCfg->getCLLSEIMaxPicAvgLightLevel();
    }
    
    void SEIEncoder::initSEIAmbientViewingEnvironment(SEIAmbientViewingEnvironment *seiAmbViewEnvironment)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiAmbViewEnvironment != nullptr), "Unspecified error");
    
    Taoran Lu's avatar
    Taoran Lu committed
      //  Set SEI message parameters read from command line options
      seiAmbViewEnvironment->m_ambientIlluminance = m_pcCfg->getAmbientViewingEnvironmentSEIIlluminance();
      seiAmbViewEnvironment->m_ambientLightX      = m_pcCfg->getAmbientViewingEnvironmentSEIAmbientLightX();
      seiAmbViewEnvironment->m_ambientLightY      = m_pcCfg->getAmbientViewingEnvironmentSEIAmbientLightY();
    }
    
    void SEIEncoder::initSEIContentColourVolume(SEIContentColourVolume *seiContentColourVolume)
    {
      assert(m_isInitialized);
    
      assert(seiContentColourVolume != nullptr);
    
    Taoran Lu's avatar
    Taoran Lu committed
      seiContentColourVolume->m_ccvCancelFlag = m_pcCfg->getCcvSEICancelFlag();
      seiContentColourVolume->m_ccvPersistenceFlag = m_pcCfg->getCcvSEIPersistenceFlag();
    
      seiContentColourVolume->m_ccvPrimariesPresentFlag = m_pcCfg->getCcvSEIPrimariesPresentFlag();
      seiContentColourVolume->m_ccvMinLuminanceValuePresentFlag = m_pcCfg->getCcvSEIMinLuminanceValuePresentFlag();
      seiContentColourVolume->m_ccvMaxLuminanceValuePresentFlag = m_pcCfg->getCcvSEIMaxLuminanceValuePresentFlag();
      seiContentColourVolume->m_ccvAvgLuminanceValuePresentFlag = m_pcCfg->getCcvSEIAvgLuminanceValuePresentFlag();
    
      // Currently we are using a floor operation for setting up the "integer" values for this SEI.
      // This applies to both primaries and luminance limits.
      if (seiContentColourVolume->m_ccvPrimariesPresentFlag == true)
      {
        for (int i = 0; i < MAX_NUM_COMPONENT; i++)
        {
          seiContentColourVolume->m_ccvPrimariesX[i] = (int32_t)(50000.0 * m_pcCfg->getCcvSEIPrimariesX(i));
          seiContentColourVolume->m_ccvPrimariesY[i] = (int32_t)(50000.0 * m_pcCfg->getCcvSEIPrimariesY(i));
        }
      }
    
      if (seiContentColourVolume->m_ccvMinLuminanceValuePresentFlag == true)
      {
        seiContentColourVolume->m_ccvMinLuminanceValue = (uint32_t)(10000000 * m_pcCfg->getCcvSEIMinLuminanceValue());
      }
      if (seiContentColourVolume->m_ccvMaxLuminanceValuePresentFlag == true)
      {
        seiContentColourVolume->m_ccvMaxLuminanceValue = (uint32_t)(10000000 * m_pcCfg->getCcvSEIMaxLuminanceValue());
      }
      if (seiContentColourVolume->m_ccvAvgLuminanceValuePresentFlag == true)
      {
        seiContentColourVolume->m_ccvAvgLuminanceValue = (uint32_t)(10000000 * m_pcCfg->getCcvSEIAvgLuminanceValue());
      }
    }
    
    
    void SEIEncoder::initSEIScalabilityDimensionInfo(SEIScalabilityDimensionInfo *sei)
    {
      CHECK(!(m_isInitialized), "Scalability dimension information SEI already initialized");
    
      CHECK(!(sei != nullptr), "Need a seiScalabilityDimensionInfo for initialization (got nullptr)");
    
      sei->m_sdiMaxLayersMinus1 = m_pcCfg->getSdiSEIMaxLayersMinus1();
      sei->m_sdiMultiviewInfoFlag = m_pcCfg->getSdiSEIMultiviewInfoFlag();
      sei->m_sdiAuxiliaryInfoFlag = m_pcCfg->getSdiSEIAuxiliaryInfoFlag();
      if (sei->m_sdiMultiviewInfoFlag || sei->m_sdiAuxiliaryInfoFlag)
      {
        if (sei->m_sdiMultiviewInfoFlag)
        {
          sei->m_sdiViewIdLenMinus1 = m_pcCfg->getSdiSEIViewIdLenMinus1();
        }
        sei->m_sdiLayerId.resize(sei->m_sdiMaxLayersMinus1 + 1);
    
    Jie Chen's avatar
    Jie Chen committed
    #if JVET_AI0153_OMI_SEI
        uint32_t associatedPrimaryLayerIdxCnt = 0;
    #endif
    
        for (int i = 0; i <= sei->m_sdiMaxLayersMinus1; i++)
        {
          sei->m_sdiLayerId[i] = m_pcCfg->getSdiSEILayerId(i);
          sei->m_sdiViewIdVal.resize(sei->m_sdiMaxLayersMinus1 + 1);
          if (sei->m_sdiMultiviewInfoFlag)
          {
            sei->m_sdiViewIdVal[i] = m_pcCfg->getSdiSEIViewIdVal(i);
          }
          sei->m_sdiAuxId.resize(sei->m_sdiMaxLayersMinus1 + 1);
          if (sei->m_sdiAuxiliaryInfoFlag)
          {
            sei->m_sdiAuxId[i] = m_pcCfg->getSdiSEIAuxId(i);
            sei->m_sdiNumAssociatedPrimaryLayersMinus1.resize(sei->m_sdiMaxLayersMinus1 + 1);
            sei->m_sdiAssociatedPrimaryLayerIdx.resize(sei->m_sdiMaxLayersMinus1 + 1);
            if (sei->m_sdiAuxId[i] > 0)
            {
              sei->m_sdiNumAssociatedPrimaryLayersMinus1[i] = m_pcCfg->getSdiSEINumAssociatedPrimaryLayersMinus1(i);
              sei->m_sdiAssociatedPrimaryLayerIdx[i].resize(sei->m_sdiNumAssociatedPrimaryLayersMinus1[i] + 1);
              for (int j = 0; j <= sei->m_sdiNumAssociatedPrimaryLayersMinus1[i]; j++)
              {
    
    Jie Chen's avatar
    Jie Chen committed
    #if JVET_AI0153_OMI_SEI
                sei->m_sdiAssociatedPrimaryLayerIdx[i][j] = m_pcCfg->getSdiSEIAssociatedPrimaryLayerIdx(associatedPrimaryLayerIdxCnt++);
    #else
    
                sei->m_sdiAssociatedPrimaryLayerIdx[i][j] = 0;
    
    Jie Chen's avatar
    Jie Chen committed
    #endif
    
              }
            }
          }
        }
        sei->m_sdiNumViews = 1;
        if (sei->m_sdiMultiviewInfoFlag)
        {
          for (int i = 1; i <= sei->m_sdiMaxLayersMinus1; i++)
          {
            bool newViewFlag = true;
            for (int j = 0; j < i; j++)
            {
              if (sei->m_sdiViewIdVal[i] == sei->m_sdiViewIdVal[j])
              {
                newViewFlag = false;
              }
            }
            if (newViewFlag)
            {
              sei->m_sdiNumViews++;
            }
          }
        }
      }
    }
    
    void SEIEncoder::initSEIMultiviewAcquisitionInfo(SEIMultiviewAcquisitionInfo *sei)
    {
      CHECK(!(m_isInitialized), "Multiview acquisition information SEI already initialized");
    
      CHECK(!(sei != nullptr), "Need a seiMultiviewAcquisitionInfo for initialization (got nullptr)");
    
      sei->m_maiIntrinsicParamFlag        = m_pcCfg->getMaiSEIIntrinsicParamFlag();
      sei->m_maiExtrinsicParamFlag        = m_pcCfg->getMaiSEIExtrinsicParamFlag();
      sei->m_maiNumViewsMinus1            = m_pcCfg->getMaiSEINumViewsMinus1();
      if (sei->m_maiIntrinsicParamFlag)
      {
        sei->m_maiIntrinsicParamsEqualFlag  = m_pcCfg->getMaiSEIIntrinsicParamsEqualFlag();
        sei->m_maiPrecFocalLength           = m_pcCfg->getMaiSEIPrecFocalLength();
        sei->m_maiPrecPrincipalPoint        = m_pcCfg->getMaiSEIPrecPrincipalPoint();
        sei->m_maiPrecSkewFactor            = m_pcCfg->getMaiSEIPrecSkewFactor();
        int numViews = sei->m_maiIntrinsicParamsEqualFlag ? 1 : sei->m_maiNumViewsMinus1 + 1;
        sei->m_maiSignFocalLengthX       .resize( numViews );
        sei->m_maiExponentFocalLengthX   .resize( numViews );
        sei->m_maiMantissaFocalLengthX   .resize( numViews );
        sei->m_maiSignFocalLengthY       .resize( numViews );
        sei->m_maiExponentFocalLengthY   .resize( numViews );
        sei->m_maiMantissaFocalLengthY   .resize( numViews );
        sei->m_maiSignPrincipalPointX    .resize( numViews );
        sei->m_maiExponentPrincipalPointX.resize( numViews );
        sei->m_maiMantissaPrincipalPointX.resize( numViews );
        sei->m_maiSignPrincipalPointY    .resize( numViews );
        sei->m_maiExponentPrincipalPointY.resize( numViews );
        sei->m_maiMantissaPrincipalPointY.resize( numViews );
        sei->m_maiSignSkewFactor         .resize( numViews );
        sei->m_maiExponentSkewFactor     .resize( numViews );
        sei->m_maiMantissaSkewFactor     .resize( numViews );
        for( int i = 0; i  <=  ( sei->m_maiIntrinsicParamsEqualFlag ? 0 : sei->m_maiNumViewsMinus1 ); i++ )
        {
          sei->m_maiSignFocalLengthX       [i] = m_pcCfg->getMaiSEISignFocalLengthX(i);
          sei->m_maiExponentFocalLengthX   [i] = m_pcCfg->getMaiSEIExponentFocalLengthX(i);
          sei->m_maiMantissaFocalLengthX   [i] = m_pcCfg->getMaiSEIMantissaFocalLengthX(i);
          sei->m_maiSignFocalLengthY       [i] = m_pcCfg->getMaiSEISignFocalLengthY(i);
          sei->m_maiExponentFocalLengthY   [i] = m_pcCfg->getMaiSEIExponentFocalLengthY(i);
          sei->m_maiMantissaFocalLengthY   [i] = m_pcCfg->getMaiSEIMantissaFocalLengthY(i);
          sei->m_maiSignPrincipalPointX    [i] = m_pcCfg->getMaiSEISignPrincipalPointX(i);
          sei->m_maiExponentPrincipalPointX[i] = m_pcCfg->getMaiSEIExponentPrincipalPointX(i);
          sei->m_maiMantissaPrincipalPointX[i] = m_pcCfg->getMaiSEIMantissaPrincipalPointX(i);
          sei->m_maiSignPrincipalPointY    [i] = m_pcCfg->getMaiSEISignPrincipalPointY(i);
          sei->m_maiExponentPrincipalPointY[i] = m_pcCfg->getMaiSEIExponentPrincipalPointY(i);
          sei->m_maiMantissaPrincipalPointY[i] = m_pcCfg->getMaiSEIMantissaPrincipalPointY(i);
          sei->m_maiSignSkewFactor         [i] = m_pcCfg->getMaiSEISignSkewFactor(i);
          sei->m_maiExponentSkewFactor     [i] = m_pcCfg->getMaiSEIExponentSkewFactor(i);
          sei->m_maiMantissaSkewFactor     [i] = m_pcCfg->getMaiSEIMantissaSkewFactor(i);
        }
      }
      if (sei->m_maiExtrinsicParamFlag)
      {
        sei->m_maiPrecRotationParam = m_pcCfg->getMaiSEIPrecRotationParam();
        sei->m_maiPrecTranslationParam = m_pcCfg->getMaiSEIPrecTranslationParam();
        sei->m_maiSignR.resize(sei->m_maiNumViewsMinus1 + 1);
        sei->m_maiExponentR.resize(sei->m_maiNumViewsMinus1 + 1);
        sei->m_maiMantissaR.resize(sei->m_maiNumViewsMinus1 + 1);
        sei->m_maiSignT.resize(sei->m_maiNumViewsMinus1 + 1);
        sei->m_maiExponentT.resize(sei->m_maiNumViewsMinus1 + 1);
        sei->m_maiMantissaT.resize(sei->m_maiNumViewsMinus1 + 1);
        for (int i = 0; i <= sei->m_maiNumViewsMinus1; i++)
        {
          sei->m_maiSignR[i].resize(3);
          sei->m_maiExponentR[i].resize(3);
          sei->m_maiMantissaR[i].resize(3);
          sei->m_maiSignT[i].resize(3);
          sei->m_maiExponentT[i].resize(3);
          sei->m_maiMantissaT[i].resize(3);
          for (int j = 0; j < 3; j++)
          {
            sei->m_maiSignR[i][j].resize(3);
            sei->m_maiExponentR[i][j].resize(3);
            sei->m_maiMantissaR[i][j].resize(3);
            for (int k = 0; k < 3; k++)
            {
              sei->m_maiSignR[i][j][k] = 0;
              sei->m_maiExponentR[i][j][k] = 0;
              sei->m_maiMantissaR[i][j][k] = 0;
            }
            sei->m_maiSignT[i][j] = 0;
            sei->m_maiExponentT[i][j] = 0;
            sei->m_maiMantissaT[i][j] = 0;
          }
        }
      }
    }
    
    
    void SEIEncoder::initSEIMultiviewViewPosition(SEIMultiviewViewPosition *sei)
    {
      CHECK(!(m_isInitialized), "Multiview view position SEI already initialized");
    
      CHECK(!(sei != nullptr), "Need a seiMultiviewViewPosition for initialization (got nullptr)");
    
      sei->m_mvpNumViewsMinus1 = m_pcCfg->getMvpSEINumViewsMinus1();
    
      int numViews = sei->m_mvpNumViewsMinus1 + 1;
      sei->m_mvpViewPosition.resize(numViews);
      for (int i = 0; i <= sei->m_mvpNumViewsMinus1; i++)
      {
        sei->m_mvpViewPosition[i] = m_pcCfg->getMvpSEIViewPosition(i);
      }
    }
    
    
    void SEIEncoder::initSEIAlphaChannelInfo(SEIAlphaChannelInfo *sei)
    {
      CHECK(!(m_isInitialized), "Alpha channel information SEI already initialized");
    
      CHECK(!(sei != nullptr), "Need a seiAlphaChannelInfo for initialization (got nullptr)");
    
      sei->m_aciCancelFlag = m_pcCfg->getAciSEICancelFlag();
      sei->m_aciUseIdc = m_pcCfg->getAciSEIUseIdc();
      sei->m_aciBitDepthMinus8 = m_pcCfg->getAciSEIBitDepthMinus8();
      sei->m_aciTransparentValue = m_pcCfg->getAciSEITransparentValue();
      sei->m_aciOpaqueValue = m_pcCfg->getAciSEIOpaqueValue();
      sei->m_aciIncrFlag = m_pcCfg->getAciSEIIncrFlag();
      sei->m_aciClipFlag = m_pcCfg->getAciSEIClipFlag();
      sei->m_aciClipTypeFlag = m_pcCfg->getAciSEIClipTypeFlag();
    }
    
    void SEIEncoder::initSEIDepthRepresentationInfo(SEIDepthRepresentationInfo *sei)
    {
      CHECK(!(m_isInitialized), "Depth representation information SEI already initialized");
    
      CHECK(!(sei != nullptr), "Need a seiDepthRepresentationInfo for initialization (got nullptr)");
    
      sei->m_driZNearFlag = m_pcCfg->getDriSEIZNearFlag();
      sei->m_driZFarFlag = m_pcCfg->getDriSEIZFarFlag();
      sei->m_driDMinFlag = m_pcCfg->getDriSEIDMinFlag();
      sei->m_driDMaxFlag = m_pcCfg->getDriSEIDMaxFlag();
      sei->m_driZNear = m_pcCfg->getDriSEIZNear();
      sei->m_driZFar = m_pcCfg->getDriSEIZFar();
      sei->m_driDMin = m_pcCfg->getDriSEIDMin();
      sei->m_driDMax = m_pcCfg->getDriSEIDMax();
      sei->m_driDisparityRefViewId = m_pcCfg->getDriSEIDisparityRefViewId();
      sei->m_driDepthRepresentationType = m_pcCfg->getDriSEIDepthRepresentationType();
      sei->m_driDepthNonlinearRepresentationNumMinus1 = m_pcCfg->getDriSEINonlinearNumMinus1();
      sei->m_driDepthNonlinearRepresentationModel.resize(sei->m_driDepthNonlinearRepresentationNumMinus1 + 1);
      for(int i = 0; i < (sei->m_driDepthNonlinearRepresentationNumMinus1 + 1); i++)
      {
        sei->m_driDepthNonlinearRepresentationModel[i] = m_pcCfg->getDriSEINonlinearModel(i);
      }
    }
    
    
    void SEIEncoder::initSEIColourTransformInfo(SEIColourTransformInfo* seiCTI)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
      CHECK(!(seiCTI != nullptr), "Unspecified error");
    
    
      //  Set SEI message parameters read from command line options
      seiCTI->m_id = m_pcCfg->getCtiSEIId();
      seiCTI->m_signalInfoFlag = m_pcCfg->getCtiSEISignalInfoFlag();
      seiCTI->m_fullRangeFlag = m_pcCfg->getCtiSEIFullRangeFlag();
      seiCTI->m_primaries = m_pcCfg->getCtiSEIPrimaries();
      seiCTI->m_transferFunction = m_pcCfg->getCtiSEITransferFunction();
      seiCTI->m_matrixCoefs = m_pcCfg->getCtiSEIMatrixCoefs();
      seiCTI->m_crossComponentFlag = m_pcCfg->getCtiSEICrossComponentFlag();
      seiCTI->m_crossComponentInferred = m_pcCfg->getCtiSEICrossComponentInferred();
      seiCTI->m_numberChromaLutMinus1 = m_pcCfg->getCtiSEINbChromaLut() - 1;
      seiCTI->m_chromaOffset = m_pcCfg->getCtiSEIChromaOffset();
    
    
      seiCTI->m_bitdepth = m_pcCfg->getBitDepth(ChannelType::LUMA);
    
    
      for (int i = 0; i < MAX_NUM_COMPONENT; i++) {
        seiCTI->m_lut[i] = m_pcCfg->getCtiSEILut(i);
      }
      seiCTI->m_log2NumberOfPointsPerLut = floorLog2(seiCTI->m_lut[0].numLutValues - 1);
    }
    
    
    Frank Bossen's avatar
    Frank Bossen committed
    void SEIEncoder::initSEISubpictureLevelInfo(SEISubpictureLevelInfo* sli, const SPS* sps)
    
      const EncCfgParam::CfgSEISubpictureLevel &cfgSubPicLevel = m_pcCfg->getSubpicureLevelInfoSEICfg();
    
    
    Frank Bossen's avatar
    Frank Bossen committed
      sli->hasSublayerInfo = cfgSubPicLevel.hasSublayerInfo;
    
    
      const size_t maxSublayers = cfgSubPicLevel.m_sliMaxSublayers;
    
      const size_t numRefLevels = cfgSubPicLevel.hasSublayerInfo
    
                                    ? cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers
                                    : cfgSubPicLevel.m_refLevels.size();
      const size_t numSubpics   = cfgSubPicLevel.m_numSubpictures;
    
      const bool explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction;
    
    
    Frank Bossen's avatar
    Frank Bossen committed
      sli->resize(numRefLevels, maxSublayers, explicitFractionPresentFlag, numSubpics);
    
    Zhipin Deng's avatar
    Zhipin Deng committed
    
      // set sei parameters according to the configured values
    
    Frank Bossen's avatar
    Frank Bossen committed
      for (int sublayer = sli->hasSublayerInfo ? 0 : sli->maxSublayers() - 1, cnta = 0, cntb = 0;
           sublayer < sli->maxSublayers(); sublayer++)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      {
    
    Frank Bossen's avatar
    Frank Bossen committed
        for (int level = 0; level < sli->numRefLevels(); level++)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
        {
    
    Frank Bossen's avatar
    Frank Bossen committed
          sli->nonSubpicLayerFraction(level, sublayer) = cfgSubPicLevel.m_nonSubpicLayersFraction[cnta];
          sli->refLevelIdc(level, sublayer)            = cfgSubPicLevel.m_refLevels[cnta++];
          if (sli->explicitFractionPresentFlag())
    
    Zhipin Deng's avatar
    Zhipin Deng committed
          {
    
    Frank Bossen's avatar
    Frank Bossen committed
            for (int subpic = 0; subpic < sli->numSubpics(); subpic++)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
            {
    
    Frank Bossen's avatar
    Frank Bossen committed
              sli->refLevelFraction(level, subpic, sublayer) = cfgSubPicLevel.m_fractions[cntb++];
    
    Zhipin Deng's avatar
    Zhipin Deng committed
            }
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      }
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][]
    
    Frank Bossen's avatar
    Frank Bossen committed
      if (!sli->hasSublayerInfo)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      {
    
    Frank Bossen's avatar
    Frank Bossen committed
        sli->fillSublayers();
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      }
    
    void SEIEncoder::initSEISEIManifest(SEIManifest *seiSeiManifest, const SEIMessages &seiMessages)
    
    {
      assert(m_isInitialized);
      assert(seiSeiManifest != NULL);
      seiSeiManifest->m_manifestNumSeiMsgTypes = 0;
      for (auto &it: seiMessages)
      {
        seiSeiManifest->m_manifestNumSeiMsgTypes += 1;
        auto tempPayloadType = it->payloadType();
        seiSeiManifest->m_manifestSeiPayloadType.push_back(tempPayloadType);
        auto description = seiSeiManifest->getSEIMessageDescription(tempPayloadType);
        seiSeiManifest->m_manifestSeiDescription.push_back(description);
      }
      CHECK(seiSeiManifest->m_manifestNumSeiMsgTypes == 0, "No SEI messages available");
    }
    
    
    void SEIEncoder::initSEISEIPrefixIndication(SEIPrefixIndication *seiSeiPrefixIndications, const SEI *sei)
    
    {
      assert(m_isInitialized);
      assert(seiSeiPrefixIndications != NULL);
    
    pengjian yang's avatar
    pengjian yang committed
      seiSeiPrefixIndications->m_prefixSeiPayloadType = sei->payloadType(); 
    
      seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1 = seiSeiPrefixIndications->getNumsOfSeiPrefixIndications(sei) - 1; 
      seiSeiPrefixIndications->m_payload = sei;
    }
    
    void SEIEncoder::initSEINeuralNetworkPostFilterCharacteristics(SEINeuralNetworkPostFilterCharacteristics *sei, int filterIdx)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
    Frank Bossen's avatar
    Frank Bossen committed
      CHECK(!(sei != nullptr), "Unspecified error");
    
      sei->m_purpose = m_pcCfg->getNNPostFilterSEICharacteristicsPurpose(filterIdx);
    
      sei->m_id = m_pcCfg->getNNPostFilterSEICharacteristicsId(filterIdx);
    
      sei->m_baseFlag = m_pcCfg->getNNPostFilterSEICharacteristicsBaseFlag(filterIdx);
    
      sei->m_modeIdc = m_pcCfg->getNNPostFilterSEICharacteristicsModeIdc(filterIdx);
    
      if (sei->m_modeIdc == POST_FILTER_MODE::URI)
      {
        sei->m_uriTag = m_pcCfg->getNNPostFilterSEICharacteristicsUriTag(filterIdx);
        sei->m_uri    = m_pcCfg->getNNPostFilterSEICharacteristicsUri(filterIdx);
      }
    
    Chaoyi Lin's avatar
    Chaoyi Lin committed
      sei->m_propertyPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsPropertyPresentFlag(filterIdx);
      if (sei->m_propertyPresentFlag)
    
    Chaoyi Lin's avatar
    Chaoyi Lin committed
        sei->m_numberInputDecodedPicturesMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsNumberInputDecodedPicturesMinus1(filterIdx);
    
        CHECK(sei->m_numberInputDecodedPicturesMinus1 > 63, "m_numberInputDecodedPicturesMinus1 shall be in the range of 0 to 63");
    
        sei->m_inputPicOutputFlag = m_pcCfg->getNNPostFilterSEICharacteristicsInputPicOutputFlag(filterIdx);
    
    
        sei->m_absentInputPicZeroFlag = m_pcCfg->getNNPostFilterSEICharacteristicsAbsentInputPicZeroFlag(filterIdx);
    
    
        sei->m_numInpPicsInOutputTensor = 0;
        if (sei->m_numberInputDecodedPicturesMinus1 > 0)
        {
          for (uint32_t i = 0; i <= sei->m_numberInputDecodedPicturesMinus1; i++)
          {
            if (sei->m_inputPicOutputFlag[i])
            {
              sei->m_numInpPicsInOutputTensor++;
            }
          }
        }
        else
        {
          sei->m_numInpPicsInOutputTensor = 1;
        }
    
    
        if((sei->m_purpose & NNPC_PurposeType::CHROMA_UPSAMPLING) != 0)
    
          sei->m_outSubCFlag = m_pcCfg->getNNPostFilterSEICharacteristicsOutSubCFlag(filterIdx);
    
        if((sei->m_purpose & NNPC_PurposeType::COLOURIZATION) != 0)
    
        {
          sei->m_outColourFormatIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutColourFormatIdc(filterIdx);
        }
    
    
        const ChromaFormat chromaFormatIdc = m_pcEncLib->getSPS(0)->getChromaFormatIdc();
    
        uint8_t subWidthC     = SPS::getWinUnitX(chromaFormatIdc);
        uint8_t subHeightC    = SPS::getWinUnitY(chromaFormatIdc);
    
        uint8_t outSubWidthC  = subWidthC;
        uint8_t outSubHeightC = subHeightC;
    
        if ((sei->m_purpose & NNPC_PurposeType::CHROMA_UPSAMPLING) != 0)
        {
          if (sei->m_outSubCFlag)
          {
            outSubWidthC  = 1;
            outSubHeightC = 1;
          }
          else
          {
            outSubWidthC  = 2;
            outSubHeightC = 1;
          }
        }
        else if ((sei->m_purpose & NNPC_PurposeType::COLOURIZATION) != 0)
        {
          CHECK(sei->m_outColourFormatIdc == ChromaFormat::_400, "The value of nnpfc_out_colour_format_idc shall not be equal to 0");
          outSubWidthC  = SPS::getWinUnitX(sei->m_outColourFormatIdc);
          outSubHeightC = SPS::getWinUnitY(sei->m_outColourFormatIdc);
        }
    
    
        if((sei->m_purpose & NNPC_PurposeType::RESOLUTION_UPSAMPLING) != 0)
    
          sei->m_picWidthNumeratorMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPicWidthNumeratorMinus1(filterIdx);
          sei->m_picWidthDenominatorMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPicWidthDenominatorMinus1(filterIdx);
          sei->m_picHeightNumeratorMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPicHeightNumeratorMinus1(filterIdx);
          sei->m_picHeightDenominatorMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPicHeightDenominatorMinus1(filterIdx);
    
          CHECK(sei->m_picWidthNumeratorMinus1 > 65535, "nnpfc_pic_width_num_minus1 shall be in the range of 0 to 65535");
          CHECK(sei->m_picWidthDenominatorMinus1 > 65535, "nnpfc_pic_width_denom_minus1 shall be in the range of 0 to 65535");
          CHECK(sei->m_picHeightNumeratorMinus1 > 65535, "nnpfc_pic_height_num_minus1 shall be in the range of 0 to 65535");
          CHECK(sei->m_picHeightDenominatorMinus1 > 65535, "nnpfc_pic_height_denom_minus1 shall be in the range of 0 to 65535");
    
          int confWinLeftOffset = m_pcEncLib->getPPS(0)->getConformanceWindow().getWindowLeftOffset();
          int confWinTopOffset = m_pcEncLib->getPPS(0)->getConformanceWindow().getWindowTopOffset();
          int confWinRightOffset = m_pcEncLib->getPPS(0)->getConformanceWindow().getWindowRightOffset();
          int confWinBottomOffset = m_pcEncLib->getPPS(0)->getConformanceWindow().getWindowBottomOffset();
          int ppsPicWidthInLumaSample  = m_pcEncLib->getPPS(0)->getPicWidthInLumaSamples();
          int ppsPicHeightInLumaSample = m_pcEncLib->getPPS(0)->getPicHeightInLumaSamples();
    
          
          int croppedWidth = ppsPicWidthInLumaSample - subWidthC * (confWinRightOffset + confWinLeftOffset);
          int croppedHeight = ppsPicHeightInLumaSample - subHeightC * (confWinBottomOffset + confWinTopOffset);
    
          int outputPicWidth = (int)ceil(((double)croppedWidth * (sei->m_picWidthNumeratorMinus1 + 1)) / (sei->m_picWidthDenominatorMinus1 + 1));
          int outputPicHeight = (int)ceil(((double)croppedHeight * (sei->m_picHeightNumeratorMinus1 + 1)) / (sei->m_picHeightDenominatorMinus1 + 1));
    
          CHECK(!(outputPicWidth >= croppedWidth && outputPicWidth <= croppedWidth * 16), "output picture width in luma samples shall be in the range of croppedWidth to croppedWidth * 16");
    
          CHECK(!(outputPicHeight >= croppedHeight && outputPicHeight <= croppedHeight * 16), "output picture height in luma samples shall be in the range of croppedHeight to croppedHeight * 16");
    
    
          CHECK((outputPicWidth  % outSubWidthC)  != 0, "The value of nnpfcOutputPicWidth % outSubWidthC shall be equal to 0");
          CHECK((outputPicHeight % outSubHeightC) != 0, "The value of nnpfcOutputPicHeight % outSubHeightC shall be equal to 0");
    
        if((sei->m_purpose & NNPC_PurposeType::FRAME_RATE_UPSAMPLING) != 0)
    
        {
          sei->m_numberInterpolatedPictures = m_pcCfg->getNNPostFilterSEICharacteristicsNumberInterpolatedPictures(filterIdx);
    
          CHECK(sei->m_numberInputDecodedPicturesMinus1 <= 0, "If nnpfc_purpose is FRAME_RATE_UPSAMPLING, m_numberInputDecodedPicturesMinus1 shall be greater than 0");
    
        if((sei->m_purpose & NNPC_PurposeType::TEMPORAL_EXTRAPOLATION) != 0)
        {
          sei->m_numberExtrapolatedPicturesMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsNumberExtrapolatedPicturesMinus1(filterIdx);
        }
    
    #if NNPFC_SPATIAL_EXTRAPOLATION
        if((sei->m_purpose & NNPC_PurposeType::SPATIAL_EXTRAPOLATION) != 0)
        {
          sei->m_spatialExtrapolationLeftOffset = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExtrapolationLeftOffset(filterIdx);
          sei->m_spatialExtrapolationRightOffset = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExtrapolationRightOffset(filterIdx);
          sei->m_spatialExtrapolationTopOffset = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExtrapolationTopOffset(filterIdx);
          sei->m_spatialExtrapolationBottomOffset = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExtrapolationBottomOffset(filterIdx);
    
    #if JVET_AI0061_SPATIAL_EXTRAPOLATION_PROPOSAL1
          sei->m_spatialExtrapolationPromptPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExtrapolationPromptPresentFlag(filterIdx);
          if (sei->m_spatialExtrapolationPromptPresentFlag)
          {
            sei->m_prompt = m_pcCfg->getNNPostFilterSEICharacteristicsSpatialExrapolationPrompt(filterIdx);
          }
    #endif
    
    
        sei->m_componentLastFlag = m_pcCfg->getNNPostFilterSEICharacteristicsComponentLastFlag(filterIdx);
    
        sei->m_inpFormatIdc = m_pcCfg->getNNPostFilterSEICharacteristicsInpFormatIdc(filterIdx);
    
        CHECK(sei->m_inpFormatIdc > 255, "The value of nnpfc_inp_format_idc shall be in the range of 0 to 255");
    
        if (sei->m_inpFormatIdc == 1)
        {
    
          sei->m_inpTensorBitDepthLumaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsInpTensorBitDepthLumaMinus8(filterIdx);
          sei->m_inpTensorBitDepthChromaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsInpTensorBitDepthChromaMinus8(filterIdx);
    
    
        sei->m_inpOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsInpOrderIdc(filterIdx);
    
        CHECK((sei->m_purpose & NNPC_PurposeType::CHROMA_UPSAMPLING) != 0 && sei->m_inpOrderIdc == 0, "When nnpfc_purpose & 0x02 is not equal to 0, nnpfc_inp_order_idc shall not be equal to 0");
    
        sei->m_auxInpIdc             = m_pcCfg->getNNPostFilterSEICharacteristicsAuxInpIdc(filterIdx);
    
        sei->m_outFormatIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutFormatIdc(filterIdx);
    
        CHECK(sei->m_outFormatIdc > 255, "The value of nnpfc_out_format_idc shall be in the range of 0 to 255");
    
        if (sei->m_outFormatIdc == 1)
        {
    
          sei->m_outTensorBitDepthLumaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthLumaMinus8(filterIdx);
          sei->m_outTensorBitDepthChromaMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthChromaMinus8(filterIdx);
    
        sei->m_sepColDescriptionFlag = m_pcCfg->getNNPostFilterSEICharacteristicsSepColDescriptionFlag(filterIdx);
        if (sei->m_sepColDescriptionFlag)
        {
          sei->m_colPrimaries         = m_pcCfg->getNNPostFilterSEICharacteristicsColPrimaries(filterIdx);
          sei->m_transCharacteristics = m_pcCfg->getNNPostFilterSEICharacteristicsTransCharacteristics(filterIdx);
          if (sei->m_outFormatIdc == 1)
          {
            sei->m_matrixCoeffs         = m_pcCfg->getNNPostFilterSEICharacteristicsMatrixCoeffs(filterIdx);
            CHECK(sei->m_matrixCoeffs == 0 && !(sei->m_outTensorBitDepthChromaMinus8 == sei->m_outTensorBitDepthLumaMinus8 && sei->m_outOrderIdc == 2 && outSubHeightC == 1 && outSubWidthC == 1),
              "nnpfc_matrix_coeffs shall not be equal to 0 unless the following conditions are true: nnpfc_out_tensor_chroma_bitdepth_minus8 is equal to nnpfc_out_tensor_luma_bitdepth_minus8, nnpfc_out_order_idc is equal to 2, outSubHeightC is equal to 1, and outSubWidthC is equal to 1");
            CHECK(sei->m_matrixCoeffs == 8 && !((sei->m_outTensorBitDepthChromaMinus8 == sei->m_outTensorBitDepthLumaMinus8) || (sei->m_outTensorBitDepthChromaMinus8 == (sei->m_outTensorBitDepthLumaMinus8 + 1) && sei->m_outOrderIdc == 2 && outSubHeightC == 1 && outSubWidthC == 1)),
              "nnpfc_matrix_coeffs shall not be equal to 8 unless one of the following conditions is true: nnpfc_out_tensor_chroma_bitdepth_minus8 is equal to nnpfc_out_tensor_luma_bitdepth_minus8 or "
              "nnpfc_out_tensor_chroma_bitdepth_minus8 is equal to nnpfc_out_tensor_luma_bitdepth_minus8 + 1, nnpfc_out_order_idc is equal to 2, outSubHeightC is equal to 1, and outSubWidthC is equal to 1");
          }
        }
    
    #if JVET_AD0067_INCLUDE_SYNTAX
        if (sei->m_sepColDescriptionFlag && (sei->m_outFormatIdc == 1))
        {
          sei->m_fullRangeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsFullRangeFlag(filterIdx);
        }
    #endif
    
        sei->m_outOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutOrderIdc(filterIdx);
    
        CHECK((sei->m_purpose & NNPC_PurposeType::CHROMA_UPSAMPLING) != 0 && (sei->m_outOrderIdc == 0 || sei->m_outOrderIdc == 3), "When nnpfc_purpose & 0x02 is not equal to 0, nnpfc_out_order_idc shall not be equal to 0 or 3");
        CHECK((sei->m_purpose & NNPC_PurposeType::COLOURIZATION) != 0 && sei->m_outOrderIdc == 0, "When nnpfc_purpose & 0x20 is not equal to 0, nnpfc_out_order_idc shall not be equal to 0");
    
        if(sei->m_outOrderIdc != 0)
        {
          sei->m_chromaLocInfoPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsChromaLocInfoPresentFlag(filterIdx);
        }
        else
        {
          sei->m_chromaLocInfoPresentFlag = 0;
        }
    
    Chaoyi Lin's avatar
    Chaoyi Lin committed
          if(sei->m_chromaLocInfoPresentFlag)
          {
            sei->m_chromaSampleLocTypeFrame = m_pcCfg->getNNPostFilterSEICharacteristicsChromaSampleLocTypeFrame(filterIdx);;
          }
    
        sei->m_constantPatchSizeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsConstantPatchSizeFlag(filterIdx);
        sei->m_patchWidthMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchWidthMinus1(filterIdx);
        sei->m_patchHeightMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchHeightMinus1(filterIdx);
    
        if (sei->m_constantPatchSizeFlag == 0)
        {
          sei->m_extendedPatchWidthCdDeltaMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsExtendedPatchWidthCdDeltaMinus1(filterIdx);
          sei->m_extendedPatchHeightCdDeltaMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsExtendedPatchHeightCdDeltaMinus1(filterIdx);
        }
    
        sei->m_overlap = m_pcCfg->getNNPostFilterSEICharacteristicsOverlap(filterIdx);
        sei->m_paddingType = m_pcCfg->getNNPostFilterSEICharacteristicsPaddingType(filterIdx);
    
        CHECK((sei->m_paddingType >= 5) && (sei->m_paddingType <= 15), "Reserved nnpfc_padding_type value, shall not be present in bitstreams conforming to this version of VTM");
        CHECK(sei->m_paddingType > 15, "Invalid nnpfc_padding_type value");
    
        sei->m_lumaPadding = m_pcCfg->getNNPostFilterSEICharacteristicsLumaPadding(filterIdx);
        sei->m_cbPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCbPadding(filterIdx);
        sei->m_crPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCrPadding(filterIdx);
    
        sei->m_complexityInfoPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsComplexityInfoPresentFlag(filterIdx);
        if (sei->m_complexityInfoPresentFlag)
        {
    
            sei->m_parameterTypeIdc = m_pcCfg->getNNPostFilterSEICharacteristicsParameterTypeIdc(filterIdx);
    
            sei->m_log2ParameterBitLengthMinus3 = m_pcCfg->getNNPostFilterSEICharacteristicsLog2ParameterBitLengthMinus3(filterIdx);
            sei->m_numParametersIdc = m_pcCfg->getNNPostFilterSEICharacteristicsNumParametersIdc(filterIdx);
            sei->m_numKmacOperationsIdc = m_pcCfg->getNNPostFilterSEICharacteristicsNumKmacOperationsIdc(filterIdx);
    
            sei->m_totalKilobyteSize = m_pcCfg->getNNPostFilterSEICharacteristicsTotalKilobyteSize(filterIdx);
    
    #if JVET_AF2032_NNPFC_APPLICATION_INFORMATION_SIGNALING
    
        if (sei->m_purpose == 0)
    
          sei->m_applicationPurposeTagUriPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsApplicationPurposeTagUriPresentFlag(filterIdx);
          if (sei->m_applicationPurposeTagUriPresentFlag)
    
            sei->m_applicationPurposeTagUri = m_pcCfg->getNNPostFilterSEICharacteristicsApplicationPurposeTagUri(filterIdx);
    
    #if JVET_AI0071_NNPFC_SPO_USAGE_IDCS
        sei->m_forHumanViewingIdc = m_pcCfg->getNNPostFilterSEICharacteristicsForHumanViewingIdc(filterIdx);
        sei->m_forMachineAnalysisIdc = m_pcCfg->getNNPostFilterSEICharacteristicsForMachineAnalysisIdc(filterIdx);
    #endif
    
      if (sei->m_modeIdc == POST_FILTER_MODE::ISO_IEC_15938_17)
    
        const std::string payloadFilename = m_pcCfg->getNNPostFilterSEICharacteristicsPayloadFilename(filterIdx);
        std::ifstream     bitstreamFile(payloadFilename.c_str(), std::ifstream::in | std::ifstream::binary);
    
        if (!bitstreamFile)
        {
          EXIT( "Failed to open bitstream file " << payloadFilename.c_str() << " for reading" ) ;
        }
    
        bitstreamFile.seekg(0, std::ifstream::end);
        sei->m_payloadLength = bitstreamFile.tellg();
        bitstreamFile.seekg(0, std::ifstream::beg);
    
        sei->m_payloadByte = new char[sei->m_payloadLength];
        bitstreamFile.read(sei->m_payloadByte, sei->m_payloadLength);
        bitstreamFile.close();
      }
    }
    
    void SEIEncoder::initSEINeuralNetworkPostFilterActivation(SEINeuralNetworkPostFilterActivation *sei)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
    
    Frank Bossen's avatar
    Frank Bossen committed
      CHECK(!(sei != nullptr), "Unspecified error");
    
      sei->m_targetId = m_pcCfg->getNnPostFilterSEIActivationTargetId();
    
      sei->m_cancelFlag  = m_pcCfg->getNnPostFilterSEIActivationCancelFlag();
      if(!sei->m_cancelFlag)
      {
    
        sei->m_persistenceFlag = m_pcCfg->getNnPostFilterSEIActivationPersistenceFlag();
        sei->m_targetBaseFlag = m_pcCfg->getNnPostFilterSEIActivationTargetBaseFlag();
    
        sei->m_noPrevCLVSFlag = m_pcCfg->getNnPostFilterSEIActivationNoPrevCLVSFlag();
    
        sei->m_noFollCLVSFlag = m_pcCfg->getNnPostFilterSEIActivationNoFollCLVSFlag();
    
        sei->m_outputFlag = m_pcCfg->getNnPostFilterSEIActivationOutputFlag();
    
    #if JVET_AH2006_EOI_SEI
    void SEIEncoder::initSEIEncoderOptimizationInfo(SEIEncoderOptimizationInfo *sei)
    {
      CHECK(!(m_isInitialized), "Unspecified error");
      CHECK(!(sei != nullptr), "Unspecified error");
      sei->m_cancelFlag = m_pcCfg->getEOISEICancelFlag();
      if (!sei->m_cancelFlag)
      {
        sei->m_persistenceFlag = m_pcCfg->getEOISEIPersistenceFlag();
        sei->m_forHumanViewingIdc = m_pcCfg->getEOISEIForHumanViewingIdc();
        sei->m_forMachineAnalysisIdc = m_pcCfg->getEOISEIForMachineAnalysisIdc();
        CHECK(sei->m_forHumanViewingIdc ==1  && sei->m_forMachineAnalysisIdc ==1 , "the value of eoi_for_human_viewing_idc and eoi_for_machine_analysis_idc shall not be both equal to 1");
        sei->m_type = m_pcCfg->getEOISEIType();
        if ((sei->m_type & EOI_OptimizationType::OBJECT_BASED_OPTIMIZATION) != 0)
        {
          sei->m_objectBasedIdc = m_pcCfg->getEOISEIObjectBasedIdc();
        }
        if ((sei->m_type & EOI_OptimizationType::TEMPORAL_RESAMPLING) != 0)
        {
          sei->m_temporalResamplingTypeFlag = m_pcCfg->getEOISEITemporalResamplingTypeFlag();
          sei->m_numIntPics = m_pcCfg->getEOISEINumIntPics();
        }
        if ((sei->m_type & EOI_OptimizationType::SPATIAL_RESAMPLING) != 0)
        {
    
    #if JVET_AI0180
          sei->m_origPicDimensionsFlag = m_pcCfg->getEOISEIOrigPicDimensionsFlag();
          if (sei->m_origPicDimensionsFlag)
          {
            sei->m_origPicWidth  = m_pcCfg->getEOISEIOrigPicWidth();
            sei->m_origPicHeight = m_pcCfg->getEOISEIOrigPicHeight();
          }
          else
          {
            sei->m_spatialResamplingTypeFlag = m_pcCfg->getEOISEISpatialResamplingTypeFlag();
          }
    #else
    
          sei->m_spatialResamplingTypeFlag = m_pcCfg->getEOISEISpatialResamplingTypeFlag();
    
        }
        if ((sei->m_type & EOI_OptimizationType::PRIVACY_PROTECTION_OPTIMIZATION) != 0)
        {
          sei->m_privacyProtectionTypeIdc = m_pcCfg->getEOISEIPrivacyProtectionTypeIdc();
          sei->m_privacyProtectedInfoType = m_pcCfg->getEOISEIPrivacyProtectedInfoType();
        }
      }
    }
    #endif