Skip to content
Snippets Groups Projects
SEIEncoder.cpp 69 KiB
Newer Older
  • Learn to ignore specific revisions
  •       }
        }
      }
    }
    
    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);
    }
    
    
    void SEIEncoder::initSEISubpictureLevelInfo(SEISubpicureLevelInfo *sei, const SPS *sps)
    {
    
      const EncCfgParam::CfgSEISubpictureLevel &cfgSubPicLevel = m_pcCfg->getSubpicureLevelInfoSEICfg();
    
    
      sei->m_sliSublayerInfoPresentFlag = cfgSubPicLevel.m_sliSublayerInfoPresentFlag;
      sei->m_sliMaxSublayers = cfgSubPicLevel.m_sliMaxSublayers;
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      sei->m_numRefLevels = cfgSubPicLevel.m_sliSublayerInfoPresentFlag ? (int)cfgSubPicLevel.m_refLevels.size() / cfgSubPicLevel.m_sliMaxSublayers : (int)cfgSubPicLevel.m_refLevels.size();
      sei->m_numSubpics = cfgSubPicLevel.m_numSubpictures;
    
      sei->m_explicitFractionPresentFlag = cfgSubPicLevel.m_explicitFraction;
    
    Zhipin Deng's avatar
    Zhipin Deng committed
    
      // sei parameters initialization
    
      sei->m_nonSubpicLayersFraction.resize(sei->m_numRefLevels);
    
      sei->m_refLevelIdc.resize(sei->m_numRefLevels);
      for (int level = 0; level < sei->m_numRefLevels; level++)
      {
    
        sei->m_nonSubpicLayersFraction[level].resize(sei->m_sliMaxSublayers);
    
    Zhipin Deng's avatar
    Zhipin Deng committed
        sei->m_refLevelIdc[level].resize(sei->m_sliMaxSublayers);
        for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
          sei->m_refLevelIdc[level][sublayer] = Level::LEVEL15_5;
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      if (sei->m_explicitFractionPresentFlag)
    
      {
        sei->m_refLevelFraction.resize(sei->m_numRefLevels);
    
    Zhipin Deng's avatar
    Zhipin Deng committed
        for (int level = 0; level < sei->m_numRefLevels; level++)
    
        {
          sei->m_refLevelFraction[level].resize(sei->m_numSubpics);
          for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
          {
    
    Zhipin Deng's avatar
    Zhipin Deng committed
            sei->m_refLevelFraction[level][subpic].resize(sei->m_sliMaxSublayers);
            for (int sublayer = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
            {
              sei->m_refLevelFraction[level][subpic][sublayer] = 0;
            }
          }
        }
      }
    
      // set sei parameters according to the configured values
      for (int sublayer = sei->m_sliSublayerInfoPresentFlag ? 0 : sei->m_sliMaxSublayers - 1, cnta = 0, cntb = 0; sublayer < sei->m_sliMaxSublayers; sublayer++)
      {
        for (int level = 0; level < sei->m_numRefLevels; level++)
        {
    
          sei->m_nonSubpicLayersFraction[level][sublayer] = cfgSubPicLevel.m_nonSubpicLayersFraction[cnta];
    
    Zhipin Deng's avatar
    Zhipin Deng committed
          sei->m_refLevelIdc[level][sublayer] = cfgSubPicLevel.m_refLevels[cnta++];
          if (sei->m_explicitFractionPresentFlag)
          {
            for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
            {
              sei->m_refLevelFraction[level][subpic][sublayer] = cfgSubPicLevel.m_fractions[cntb++];
            }
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      }
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      // update the inference of m_refLevelIdc[][] and m_refLevelFraction[][][]
      if (!sei->m_sliSublayerInfoPresentFlag)
      {
        for (int sublayer = sei->m_sliMaxSublayers - 2; sublayer >= 0; sublayer--)
    
        {
          for (int level = 0; level < sei->m_numRefLevels; level++)
          {
    
            sei->m_nonSubpicLayersFraction[level][sublayer] = sei->m_nonSubpicLayersFraction[level][sei->m_sliMaxSublayers - 1];
    
    Zhipin Deng's avatar
    Zhipin Deng committed
            sei->m_refLevelIdc[level][sublayer] = sei->m_refLevelIdc[level][sei->m_sliMaxSublayers - 1];
            if (sei->m_explicitFractionPresentFlag)
    
    Zhipin Deng's avatar
    Zhipin Deng committed
              for (int subpic = 0; subpic < sei->m_numSubpics; subpic++)
              {
                sei->m_refLevelFraction[level][subpic][sublayer] = sei->m_refLevelFraction[level][subpic][sei->m_sliMaxSublayers - 1];
              }
    
    Zhipin Deng's avatar
    Zhipin Deng committed
      }
    
    #if JVET_T0056_SEI_MANIFEST
    
    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");
    }
    #endif
    
    #if JVET_T0056_SEI_PREFIX_INDICATION
    
    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;
    }
    #endif   
    
    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_id = m_pcCfg->getNNPostFilterSEICharacteristicsId(filterIdx);
      sei->m_modeIdc = m_pcCfg->getNNPostFilterSEICharacteristicsModeIdc(filterIdx);
    
    #if JVET_AB0047_MOVE_GATED_SYNTAX_OF_NNPFC_URIS_AFTER_NNPFC_MODEIDC
      if (sei->m_modeIdc == POST_FILTER_MODE::URI)
      {
        sei->m_uriTag = m_pcCfg->getNNPostFilterSEICharacteristicsUriTag(filterIdx);
        sei->m_uri    = m_pcCfg->getNNPostFilterSEICharacteristicsUri(filterIdx);
      }
    #endif
    
      sei->m_purposeAndFormattingFlag = m_pcCfg->getNNPostFilterSEICharacteristicsPurposeAndFormattingFlag(filterIdx);
      if (sei->m_purposeAndFormattingFlag)
    
      {
        sei->m_purpose = m_pcCfg->getNNPostFilterSEICharacteristicsPurpose(filterIdx);
    
        if(sei->m_purpose == 2 || sei->m_purpose == 4)
        {
    
          sei->m_outSubCFlag = m_pcCfg->getNNPostFilterSEICharacteristicsOutSubCFlag(filterIdx);
    
        }
        if(sei->m_purpose == 3 || sei->m_purpose == 4)
        {
          sei->m_picWidthInLumaSamples = m_pcCfg->getNNPostFilterSEICharacteristicsPicWidthInLumaSamples(filterIdx);
          sei->m_picHeightInLumaSamples = m_pcCfg->getNNPostFilterSEICharacteristicsPicHeightInLumaSamples(filterIdx);
        }
    
    #if JVET_AB0058_NN_FRAME_RATE_UPSAMPLING
        if (sei->m_purpose == NNPC_PurposeType::FRANE_RATE_UPSAMPLING)
        {
          sei->m_numberInputDecodedPicturesMinus2 = m_pcCfg->getNNPostFilterSEICharacteristicsNumberInputDecodedPicturesMinus2(filterIdx);
          sei->m_numberInterpolatedPictures = m_pcCfg->getNNPostFilterSEICharacteristicsNumberInterpolatedPictures(filterIdx);
        }
    #endif
    
    
        sei->m_componentLastFlag = m_pcCfg->getNNPostFilterSEICharacteristicsComponentLastFlag(filterIdx);
    
    #if M60678_BALLOT_COMMENTS_OF_FI_03
        sei->m_inpFormatIdc = m_pcCfg->getNNPostFilterSEICharacteristicsInpFormatIdc(filterIdx);
        if (sei->m_inpFormatIdc == 1)
        {
          sei->m_outTensorBitDepthMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(filterIdx);
        }
    #else
    
        sei->m_inpSampleIdc = m_pcCfg->getNNPostFilterSEICharacteristicsInpSampleIdc(filterIdx);
    
        if(sei->m_inpSampleIdc == 4)
        {
          sei->m_inpTensorBitDepthMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsInpTensorBitDepthMinus8(filterIdx);
        }
    
    
        sei->m_inpOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsInpOrderIdc(filterIdx);
    
    #if !M60678_BALLOT_COMMENTS_OF_FI_03
    
        sei->m_outSampleIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutSampleIdc(filterIdx);
    
        if(sei->m_outSampleIdc == 4)
        {
          sei->m_outTensorBitDepthMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(filterIdx);
        }
    
        sei->m_auxInpIdc             = m_pcCfg->getNNPostFilterSEICharacteristicsAuxInpIdc(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);
          sei->m_matrixCoeffs         = m_pcCfg->getNNPostFilterSEICharacteristicsMatrixCoeffs(filterIdx);
    
    #if M60678_BALLOT_COMMENTS_OF_FI_03
        sei->m_outFormatIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutFormatIdc(filterIdx);
        if (sei->m_outFormatIdc == 1)
        {
          sei->m_outTensorBitDepthMinus8 = m_pcCfg->getNNPostFilterSEICharacteristicsOutTensorBitDepthMinus8(filterIdx);
        }
    #endif
    
        sei->m_outOrderIdc = m_pcCfg->getNNPostFilterSEICharacteristicsOutOrderIdc(filterIdx);
        sei->m_constantPatchSizeFlag = m_pcCfg->getNNPostFilterSEICharacteristicsConstantPatchSizeFlag(filterIdx);
        sei->m_patchWidthMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchWidthMinus1(filterIdx);
        sei->m_patchHeightMinus1 = m_pcCfg->getNNPostFilterSEICharacteristicsPatchHeightMinus1(filterIdx);
        sei->m_overlap = m_pcCfg->getNNPostFilterSEICharacteristicsOverlap(filterIdx);
        sei->m_paddingType = m_pcCfg->getNNPostFilterSEICharacteristicsPaddingType(filterIdx);
    
        sei->m_lumaPadding = m_pcCfg->getNNPostFilterSEICharacteristicsLumaPadding(filterIdx);
        sei->m_cbPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCbPadding(filterIdx);
        sei->m_crPadding = m_pcCfg->getNNPostFilterSEICharacteristicsCrPadding(filterIdx);
    
    #if JVET_AB0135_NN_SEI_COMPLEXITY_MOD
        sei->m_complexityInfoPresentFlag = m_pcCfg->getNNPostFilterSEICharacteristicsComplexityInfoPresentFlag(filterIdx);
        if (sei->m_complexityInfoPresentFlag)
        {
    #else
    
        sei->m_complexityIdc = m_pcCfg->getNNPostFilterSEICharacteristicsComplexityIdc(filterIdx);
        if(sei->m_complexityIdc > 0)
        {
          if(sei->m_complexityIdc == 1)
          {
    
            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);
    
    #if JVET_AB0135_NN_SEI_COMPLEXITY_MOD
            sei->m_totalKilobyteSize = m_pcCfg->getNNPostFilterSEICharacteristicsTotalKilobyteSize(filterIdx);
    #else
    
    #if !JVET_AB0047_MOVE_GATED_SYNTAX_OF_NNPFC_URIS_AFTER_NNPFC_MODEIDC
    
        sei->m_uriTag = m_pcCfg->getNNPostFilterSEICharacteristicsUriTag(filterIdx);
        sei->m_uri = m_pcCfg->getNNPostFilterSEICharacteristicsUri(filterIdx);
    
      }
      if (sei->m_modeIdc == 1)
      {
        const string payloadFilename = m_pcCfg->getNNPostFilterSEICharacteristicsPayloadFilename(filterIdx);
        ifstream bitstreamFile(payloadFilename.c_str(), ifstream::in | 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_id = m_pcCfg->getNnPostFilterSEIActivationId();
    }