Skip to content
Snippets Groups Projects
SEIEncoder.cpp 55 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
      //  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(CHANNEL_TYPE_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;
      int i                                    = 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);
        i++;
      }
      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);
      seiSeiPrefixIndications->m_prefixSeiPayloadType = sei->payloadType();
      seiSeiPrefixIndications->m_numSeiPrefixIndicationsMinus1 = seiSeiPrefixIndications->getNumsOfSeiPrefixIndications(sei) - 1; 
      seiSeiPrefixIndications->m_payload = sei;
    }
    #endif