Skip to content
Snippets Groups Projects
EncLib.cpp 121 KiB
Newer Older
  • Learn to ignore specific revisions
  •       const int poc = m_iPOCLast + ( m_compositeRefEnabled ? 2 : 1 );
    
    
    Philippe Bordes's avatar
    Philippe Bordes committed
    #if RPR_ENABLE
    
    #if JVET_AC0096
          if (!(m_resChangeInClvsEnabled && m_rprFunctionalityTestingEnabledFlag))
          {
            ppsID = 0;
          }
    #else
    
    Philippe Bordes's avatar
    Philippe Bordes committed
          ppsID = 0;
    
    Philippe Bordes's avatar
    Philippe Bordes committed
          bool  bApplyRpr = false;
    
    #if JVET_AC0096
          if (m_resChangeInClvsEnabled && m_rprFunctionalityTestingEnabledFlag)
          {
            if (poc % m_rprSwitchingSegmentSize == 0)
            {
              int currPoc = poc + m_FrameSkip;
              int rprSegment = getRprSwitchingSegment(currPoc);
              ppsID =  getRprSwitchingPPSID(rprSegment);
              m_gopRprPpsId = ppsID;
            }
            else
            {
              ppsID = m_gopRprPpsId;
            }
          }
    
    #if JVET_AG0116
          else if (m_resChangeInClvsEnabled && m_gopBasedRPREnabledFlag && (m_iQP >= getGOPBasedRPRQPThreshold()))
          {
            double upscaledPSNR = 0.0;
            if (poc % getGOPSize() == 0)
            {
              int xScale = 32768;
              int yScale = 32768;
              std::pair<int, int> downScalingRatio = std::pair<int, int>(xScale, yScale);
              xScale = 8192;
              yScale = 8192;
              std::pair<int, int> upScalingRatio = std::pair<int, int>(xScale, yScale);
    
              const PPS* orgPPS = m_ppsMap.getPS(0);
              const SPS* orgSPS = m_spsMap.getPS(orgPPS->getSPSId());
              const ChromaFormat chFormatIdc = orgSPS->getChromaFormatIdc();
    
              const PPS* pTempPPS = m_ppsMap.getPS(ENC_PPS_ID_RPR);
              Picture::rescalePicture(downScalingRatio, *pcPicYuvOrg, orgPPS->getScalingWindow(), *ppcPicYuvRPR[1], pTempPPS->getScalingWindow(), chFormatIdc, orgSPS->getBitDepths(), true, true,
                orgSPS->getHorCollocatedChromaFlag(), orgSPS->getVerCollocatedChromaFlag());
              Picture::rescalePicture(upScalingRatio, *ppcPicYuvRPR[1], orgPPS->getScalingWindow(), *ppcPicYuvRPR[0], pTempPPS->getScalingWindow(), chFormatIdc, orgSPS->getBitDepths(), true, false,
                orgSPS->getHorCollocatedChromaFlag(), orgSPS->getVerCollocatedChromaFlag());
              // Calculate PSNR
              const  Pel* pSrc0 = pcPicYuvOrg->get(COMPONENT_Y).bufAt(0, 0);
              const  Pel* pSrc1 = ppcPicYuvRPR[0]->get(COMPONENT_Y).bufAt(0, 0);
    
              uint64_t totalDiff = 0;
              for (int y = 0; y < pcPicYuvOrg->get(COMPONENT_Y).height; y++)
              {
                for (int x = 0; x < pcPicYuvOrg->get(COMPONENT_Y).width; x++)
                {
                  int diff = pSrc0[x] - pSrc1[x];
                  totalDiff += uint64_t(diff) * uint64_t(diff);
                }
                pSrc0 += pcPicYuvOrg->get(COMPONENT_Y).stride;
                pSrc1 += ppcPicYuvRPR[0]->get(COMPONENT_Y).stride;
              }
    
              const uint32_t maxval = 255 << (orgSPS->getBitDepth(CHANNEL_TYPE_LUMA) - 8);
              upscaledPSNR = totalDiff ? 10.0 * log10((double)maxval * maxval * orgPPS->getPicWidthInLumaSamples() * orgPPS->getPicHeightInLumaSamples() / (double)totalDiff) : 999.99;
            }
    
            if (poc % getGOPSize() == 0)
            {
              const int qpBias = 37;
              if ((m_psnrThresholdRPR - (m_iQP - qpBias) * 0.5) < upscaledPSNR)
              {
                ppsID = ENC_PPS_ID_RPR;
              }
              else
              {
                if ((m_psnrThresholdRPR2 - (m_iQP - qpBias) * 0.5) < upscaledPSNR)
                {
                  ppsID = ENC_PPS_ID_RPR2;
                }
                else
                {
                  if ((m_psnrThresholdRPR3 - (m_iQP - qpBias) * 0.5) < upscaledPSNR)
                  {
                    ppsID = ENC_PPS_ID_RPR3;
                  }
                  else
                  {
                    ppsID = 0;
                  }
                }
              }
              m_gopRprPpsId = ppsID;
            }
            else
            {
              ppsID = m_gopRprPpsId;
            }
    
          }
    #endif
    
          else
          {
            bApplyRpr |= (m_switchPocPeriod < 0);                                   // RPR applied for all pictures
            bApplyRpr |= (m_switchPocPeriod > 0) && (poc / m_switchPocPeriod % 2);  // RPR applied for periods RA or LDB
          }
    #else
    
    Philippe Bordes's avatar
    Philippe Bordes committed
          bApplyRpr |= (m_switchPocPeriod < 0);                                   // RPR applied for all pictures
          bApplyRpr |= (m_switchPocPeriod > 0) && (poc / m_switchPocPeriod % 2);  // RPR applied for periods RA or LDB
    
    Philippe Bordes's avatar
    Philippe Bordes committed
          if( bApplyRpr )
    #else
    
          if( poc / m_switchPocPeriod % 2 )
    
    Philippe Bordes's avatar
    Philippe Bordes committed
    #endif
    
    #if JVET_AG0116
            if (!(m_resChangeInClvsEnabled && (m_rprFunctionalityTestingEnabledFlag || (m_gopBasedRPREnabledFlag && (m_iQP >= getGOPBasedRPRQPThreshold())))))
    #else
    
            if (!(m_resChangeInClvsEnabled && m_rprFunctionalityTestingEnabledFlag))
    
        if( m_vps->getMaxLayers() > 1 )
    
          ppsID = m_vps->getGeneralLayerIdx( m_layerId );
    
        }
    
        xGetNewPicBuffer( rcListPicYuvRecOut, pcPicCurr, ppsID );
    
        const PPS *pPPS = ( ppsID < 0 ) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS( ppsID );
        const SPS *pSPS = m_spsMap.getPS( pPPS->getSPSId() );
    
    
        {
          pcPicCurr->M_BUFS( 0, PIC_ORIGINAL_INPUT ).getBuf( COMPONENT_Y ).copyFrom( pcPicYuvOrg->getBuf( COMPONENT_Y ) );
          pcPicCurr->M_BUFS( 0, PIC_ORIGINAL_INPUT ).getBuf( COMPONENT_Cb ).copyFrom( pcPicYuvOrg->getBuf( COMPONENT_Cb ) );
          pcPicCurr->M_BUFS( 0, PIC_ORIGINAL_INPUT ).getBuf( COMPONENT_Cr ).copyFrom( pcPicYuvOrg->getBuf( COMPONENT_Cr ) );
    
          const ChromaFormat chromaFormatIDC = pSPS->getChromaFormatIdc();
    
          const PPS *refPPS = m_ppsMap.getPS( 0 );
    
          const Window& curScalingWindow = pPPS->getScalingWindow();
    
          int curPicWidth = pPPS->getPicWidthInLumaSamples()   - SPS::getWinUnitX( pSPS->getChromaFormatIdc() ) * ( curScalingWindow.getWindowLeftOffset() + curScalingWindow.getWindowRightOffset() );
          int curPicHeight = pPPS->getPicHeightInLumaSamples() - SPS::getWinUnitY( pSPS->getChromaFormatIdc() ) * ( curScalingWindow.getWindowTopOffset()  + curScalingWindow.getWindowBottomOffset() );
    
    
          const Window& refScalingWindow = refPPS->getScalingWindow();
    
          int refPicWidth = refPPS->getPicWidthInLumaSamples()   - SPS::getWinUnitX( pSPS->getChromaFormatIdc() ) * ( refScalingWindow.getWindowLeftOffset() + refScalingWindow.getWindowRightOffset() );
          int refPicHeight = refPPS->getPicHeightInLumaSamples() - SPS::getWinUnitY( pSPS->getChromaFormatIdc() ) * ( refScalingWindow.getWindowTopOffset()  + refScalingWindow.getWindowBottomOffset() );
    
    
          int xScale = ( ( refPicWidth << SCALE_RATIO_BITS ) + ( curPicWidth >> 1 ) ) / curPicWidth;
          int yScale = ( ( refPicHeight << SCALE_RATIO_BITS ) + ( curPicHeight >> 1 ) ) / curPicHeight;
          std::pair<int, int> scalingRatio = std::pair<int, int>( xScale, yScale );
    
          Picture::rescalePicture( scalingRatio, *pcPicYuvOrg, refPPS->getScalingWindow(), pcPicCurr->getOrigBuf(), pPPS->getScalingWindow(), chromaFormatIDC, pSPS->getBitDepths(), true, true,
            pSPS->getHorCollocatedChromaFlag(), pSPS->getVerCollocatedChromaFlag() );
    
        }
        else
        {
          pcPicCurr->M_BUFS( 0, PIC_ORIGINAL ).swap( *pcPicYuvOrg );
        }
    
        pcPicCurr->finalInit( m_vps, *pSPS, *pPPS, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS );
    
    
        pcPicCurr->poc = m_iPOCLast;
    
        // compute image characteristics
        if( getUseAdaptiveQP() )
        {
          AQpPreanalyzer::preanalyze( pcPicCurr );
        }
      }
    
      if( ( m_iNumPicRcvd == 0 ) || ( !flush && ( m_iPOCLast != 0 ) && ( m_iNumPicRcvd != m_iGOPSize ) && ( m_iGOPSize != 0 ) ) )
      {
        iNumEncoded = 0;
        return true;
      }
    
      if( m_RCEnableRateControl )
      {
        m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
      }
    
      m_picIdInGOP = 0;
    
      return false;
    
    /**
     - Application has picture buffer list with size of GOP + 1
     - Picture buffer list acts like as ring buffer
     - End of the list has the latest picture
     .
     \param   flush               cause encoder to encode a partial GOP
     \param   pcPicYuvOrg         original YUV picture
     \param   pcPicYuvTrueOrg
     \param   snrCSC
     \retval  rcListPicYuvRecOut  list of reconstruction YUV pictures
     \retval  accessUnitsOut      list of output access units
     \retval  iNumEncoded         number of encoded pictures
     */
    
    bool EncLib::encode( const InputColourSpaceConversion snrCSC, std::list<PelUnitBuf*>& rcListPicYuvRecOut, int& iNumEncoded )
    
      m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, false, false, snrCSC,
                                m_printFrameMSE,
    #if MSSIM_UNIFORM_METRICS_LOG
                                m_printMSSSIM,
    #endif
                                false, m_picIdInGOP);
    
    
      m_picIdInGOP++;
    
      // go over all pictures in a GOP excluding the first IRAP
      if( m_picIdInGOP != m_iGOPSize && m_iPOCLast )
      {
        return true;
      }
    
    #if JVET_O0756_CALCULATE_HDRMETRICS
      m_metricTime = m_cGOPEncoder.getMetricTime();
    #endif
    
      if( m_RCEnableRateControl )
      {
        m_cRateCtrl.destroyRCGOP();
      }
    
      iNumEncoded = m_iNumPicRcvd;
      m_iNumPicRcvd = 0;
      m_uiNumAllPicCoded += iNumEncoded;
    
      return false;
    }
    
    #if JVET_AA0093_DIVERSITY_CRITERION_FOR_ARMC
    void EncLib::setQPOffsetList(const int QPOffset[MAX_GOP])
    {
      std::memcpy(m_qpOffsetList, QPOffset,(MAX_GOP) * sizeof(int));
    }
    #endif
    
    
    /**------------------------------------------------
     Separate interlaced frame into two fields
     -------------------------------------------------**/
    void separateFields(Pel* org, Pel* dstField, uint32_t stride, uint32_t width, uint32_t height, bool isTop)
    {
      if (!isTop)
      {
        org += stride;
      }
      for (int y = 0; y < height>>1; y++)
      {
        for (int x = 0; x < width; x++)
        {
          dstField[x] = org[x];
        }
    
        dstField += stride;
        org += stride*2;
      }
    
    }
    
    
    bool EncLib::encodePrep(bool flush, PelStorage* pcPicYuvOrg, const InputColourSpaceConversion snrCSC, std::list<PelUnitBuf*>& rcListPicYuvRecOut,
      int& iNumEncoded, bool isTff)
    
    {
      iNumEncoded = 0;
      bool keepDoing = true;
    
      for( int fieldNum = 0; fieldNum < 2; fieldNum++ )
      {
        if( pcPicYuvOrg )
        {
          /* -- field initialization -- */
          const bool isTopField = isTff == ( fieldNum == 0 );
    
          Picture *pcField;
          xGetNewPicBuffer( rcListPicYuvRecOut, pcField, -1 );
    
          for( uint32_t comp = 0; comp < ::getNumberValidComponents( pcPicYuvOrg->chromaFormat ); comp++ )
          {
            const ComponentID compID = ComponentID( comp );
            {
              PelBuf compBuf = pcPicYuvOrg->get( compID );
              separateFields( compBuf.buf,
                pcField->getOrigBuf().get( compID ).buf,
                compBuf.stride,
                compBuf.width,
                compBuf.height,
                isTopField );
            }
          }
    
    
          int ppsID = -1; // Use default PPS ID
          const PPS *pPPS = ( ppsID < 0 ) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS( ppsID );
          const SPS *pSPS = m_spsMap.getPS( pPPS->getSPSId() );
    
          pcField->finalInit( m_vps, *pSPS, *pPPS, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS );
    
    
          pcField->poc = m_iPOCLast;
          pcField->reconstructed = false;
    
          pcField->setBorderExtension( false );// where is this normally?
    
          pcField->topField = isTopField;                  // interlaced requirement
    
          // compute image characteristics
          if( getUseAdaptiveQP() )
          {
            AQpPreanalyzer::preanalyze( pcField );
          }
        }
    
      }
    
    
    Haiwei Sun's avatar
    Haiwei Sun committed
      if( m_iNumPicRcvd && ( flush || m_iPOCLast == 1 || m_iNumPicRcvd == m_iGOPSize ) )
      {
        m_picIdInGOP = 0;
        keepDoing = false;
    
      }
    
      return keepDoing;
    }
    
    bool EncLib::encode( const InputColourSpaceConversion snrCSC, std::list<PelUnitBuf*>& rcListPicYuvRecOut, int& iNumEncoded, bool isTff )
    {
      iNumEncoded = 0;
    
    
    Haiwei Sun's avatar
    Haiwei Sun committed
      for( int fieldNum = 0; fieldNum < 2; fieldNum++ )
      {
    
        m_iPOCLast = m_iPOCLast < 2 ? fieldNum : m_iPOCLast;
    
    Haiwei Sun's avatar
    Haiwei Sun committed
    
        // compress GOP
    
        m_cGOPEncoder.compressGOP(m_iPOCLast, m_iPOCLast < 2 ? m_iPOCLast + 1 : m_iNumPicRcvd, m_cListPic,
                                  rcListPicYuvRecOut, true, isTff, snrCSC, m_printFrameMSE,
    #if MSSIM_UNIFORM_METRICS_LOG
                                  m_printMSSSIM,
    #endif
                                  false, m_picIdInGOP);
    
    Haiwei Sun's avatar
    Haiwei Sun committed
    #if JVET_O0756_CALCULATE_HDRMETRICS
        m_metricTime = m_cGOPEncoder.getMetricTime();
    #endif
    
        m_picIdInGOP++;
      }
    
    Haiwei Sun's avatar
    Haiwei Sun committed
      // go over all pictures in a GOP excluding first top field and first bottom field
      if( m_picIdInGOP != m_iGOPSize && m_iPOCLast > 1 )
      {
        return true;
      }
    
      iNumEncoded += m_iNumPicRcvd;
      m_uiNumAllPicCoded += m_iNumPicRcvd;
      m_iNumPicRcvd = 0;
    
    Haiwei Sun's avatar
    Haiwei Sun committed
      return false;
    
    
    // ====================================================================================================================
    // Protected member functions
    // ====================================================================================================================
    
    /**
     - Application has picture buffer list with size of GOP + 1
     - Picture buffer list acts like as ring buffer
     - End of the list has the latest picture
     .
     \retval rpcPic obtained picture buffer
     */
    void EncLib::xGetNewPicBuffer ( std::list<PelUnitBuf*>& rcListPicYuvRecOut, Picture*& rpcPic, int ppsId )
    {
    
    Haiwei Sun's avatar
    Haiwei Sun committed
      // rotate the output buffer
    
      rcListPicYuvRecOut.push_back( rcListPicYuvRecOut.front() ); rcListPicYuvRecOut.pop_front();
    
      rpcPic=0;
    
      // At this point, the SPS and PPS can be considered activated - they are copied to the new Pic.
      const PPS *pPPS=(ppsId<0) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS(ppsId);
      CHECK(!(pPPS!=0), "Unspecified error");
      const PPS &pps=*pPPS;
    
      const SPS *pSPS=m_spsMap.getPS(pps.getSPSId());
      CHECK(!(pSPS!=0), "Unspecified error");
      const SPS &sps=*pSPS;
    
      Slice::sortPicList(m_cListPic);
    
      // use an entry in the buffered list if the maximum number that need buffering has been reached:
    
      int maxDecPicBuffering = ( m_vps == nullptr || m_vps->m_numLayersInOls[m_vps->m_targetOlsIdx] == 1 ) ? sps.getMaxDecPicBuffering( MAX_TLAYER - 1 ) : m_vps->getMaxDecPicBuffering( MAX_TLAYER - 1 );
    
      if( m_cListPic.size() >= (uint32_t)( m_iGOPSize + maxDecPicBuffering + 2 ) )
    
        PicList::iterator iterPic = m_cListPic.begin();
    
        for( int i = 0; i < iSize; i++ )
    
          if( !rpcPic->referenced && rpcPic->layerId == m_layerId )
    
          else
          {
            rpcPic = nullptr;
          }
    
          iterPic++;
        }
    
        // If PPS ID is the same, we will assume that it has not changed since it was last used
        // and return the old object.
    
        if( rpcPic && pps.getPPSId() != rpcPic->cs->pps->getPPSId() )
    
        {
          // the IDs differ - free up an entry in the list, and then create a new one, as with the case where the max buffering state has not been reached.
          rpcPic->destroy();
          delete rpcPic;
          m_cListPic.erase(iterPic);
          rpcPic=0;
        }
      }
    
      if (rpcPic==0)
      {
        rpcPic = new Picture;
    
    Seungwook Hong's avatar
    Seungwook Hong committed
    #if JVET_Z0118_GDR
    
          sps.getWrapAroundEnabledFlag(), sps.getChromaFormatIdc(),
          Size(pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples()), sps.getMaxCUWidth(),
          sps.getMaxCUWidth() + EXT_PICTURE_SIZE, false, m_layerId, getGopBasedTemporalFilterEnabled());
    
          const PPS &pps0 = *m_ppsMap.getPS(0);
          rpcPic->M_BUFS(0, PIC_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples())));
    
    Brian Heng's avatar
    Brian Heng committed
          const uint32_t iMaxDQPLayer = m_picHeader.getCuQpDeltaSubdivIntra()/2+1;
    
          rpcPic->aqlayer.resize( iMaxDQPLayer );
          for (uint32_t d = 0; d < iMaxDQPLayer; d++)
          {
    
            rpcPic->aqlayer[d] = new AQpLayer( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples(), sps.getMaxCUWidth() >> d, sps.getMaxCUHeight() >> d );
    
          }
        }
    
        m_cListPic.push_back( rpcPic );
      }
    
      rpcPic->setBorderExtension( false );
      rpcPic->reconstructed = false;
      rpcPic->referenced = true;
    
      rpcPic->getHashMap()->clearAll();
    
      m_iPOCLast += (m_compositeRefEnabled ? 2 : 1);
    
    void EncLib::xInitVPS( const SPS& sps )
    {
      // The SPS must have already been set up.
      // set the VPS profile information.
    
    
      m_vps->m_olsHrdParams.clear();
      m_vps->m_olsHrdParams.resize(m_vps->getNumOlsHrdParamsMinus1(), std::vector<OlsHrdParams>(m_vps->getMaxSubLayers()));
    
      ProfileLevelTierFeatures profileLevelTierFeatures;
      profileLevelTierFeatures.extractPTLInformation( sps );
    
    
      m_vps->deriveOutputLayerSets();
      m_vps->deriveTargetOutputLayerSet( m_vps->m_targetOlsIdx );
    
    
      // number of the DPB parameters is set equal to the number of OLS containing multi layers
      if( !m_vps->getEachLayerIsAnOlsFlag() )
    
        m_vps->m_numDpbParams = m_vps->getNumMultiLayeredOlss();
    
      }
    
      if( m_vps->m_dpbParameters.size() != m_vps->m_numDpbParams )
      {
        m_vps->m_dpbParameters.resize( m_vps->m_numDpbParams );
      }
    
      if( m_vps->m_dpbMaxTemporalId.size() != m_vps->m_numDpbParams )
      {
        m_vps->m_dpbMaxTemporalId.resize( m_vps->m_numDpbParams );
      }
    
    
      for( int olsIdx = 0, dpbIdx = 0; olsIdx < m_vps->m_numOutputLayersInOls.size(); olsIdx++ )
    
        if ( m_vps->getNumLayersInOls(olsIdx) > 1 )
        { 
    
          if( std::find( m_vps->m_layerIdInOls[olsIdx].begin(), m_vps->m_layerIdInOls[olsIdx].end(), m_layerId ) != m_vps->m_layerIdInOls[olsIdx].end() )
          {
            m_vps->setOlsDpbPicWidth( olsIdx, std::max<int>( sps.getMaxPicWidthInLumaSamples(), m_vps->getOlsDpbPicSize( olsIdx ).width ) );
            m_vps->setOlsDpbPicHeight( olsIdx, std::max<int>( sps.getMaxPicHeightInLumaSamples(), m_vps->getOlsDpbPicSize( olsIdx ).height ) );
    
            m_vps->setOlsDpbChromaFormatIdc( olsIdx, std::max<int>(sps.getChromaFormatIdc(), m_vps->getOlsDpbChromaFormatIdc( olsIdx )));
            m_vps->setOlsDpbBitDepthMinus8( olsIdx, std::max<int>(sps.getBitDepth(CHANNEL_TYPE_LUMA) - 8, m_vps->getOlsDpbBitDepthMinus8( olsIdx )));
    
          m_vps->setOlsDpbParamsIdx( olsIdx, dpbIdx );
          dpbIdx++;
        }
    
      //for( int i = 0; i < m_vps->m_numDpbParams; i++ )
      for( int i = 0; i < m_vps->m_numOutputLayersInOls.size(); i++ )
    
        if ( m_vps->getNumLayersInOls(i) > 1 )
        { 
    
          int dpbIdx = m_vps->getOlsDpbParamsIdx( i );
    
            // When vps_max_sublayers_minus1 is equal to 0, the value of dpb_max_temporal_id[ dpbIdx ] is inferred to be equal to 0.
            m_vps->m_dpbMaxTemporalId[dpbIdx] = 0;
    
            if( m_vps->getAllLayersSameNumSublayersFlag() )
            {
              // When vps_max_sublayers_minus1 is greater than 0 and vps_all_layers_same_num_sublayers_flag is equal to 1, the value of dpb_max_temporal_id[ dpbIdx ] is inferred to be equal to vps_max_sublayers_minus1.
              m_vps->m_dpbMaxTemporalId[dpbIdx] = m_vps->getMaxSubLayers() - 1;
            }
            else
            {
    
    #if JVET_S0100_ASPECT3
              m_vps->m_dpbMaxTemporalId[dpbIdx] = m_vps->getMaxSubLayers() - 1;
    #else
    
              m_vps->m_dpbMaxTemporalId[dpbIdx] = m_maxTempLayer;
    
            }
          }
        
          for( int j = ( m_vps->m_sublayerDpbParamsPresentFlag ? 0 : m_vps->m_dpbMaxTemporalId[dpbIdx] ); j <= m_vps->m_dpbMaxTemporalId[dpbIdx]; j++ )
          {
            m_vps->m_dpbParameters[dpbIdx].m_maxDecPicBuffering[j] = profileLevelTierFeatures.getMaxDpbSize( m_vps->getOlsDpbPicSize( i ).width * m_vps->getOlsDpbPicSize( i ).height );
            m_vps->m_dpbParameters[dpbIdx].m_numReorderPics[j] = m_vps->m_dpbParameters[dpbIdx].m_maxDecPicBuffering[j];
            m_vps->m_dpbParameters[dpbIdx].m_maxLatencyIncreasePlus1[j] = 0;
    
          for( int j = ( m_vps->m_sublayerDpbParamsPresentFlag ? m_vps->m_dpbMaxTemporalId[dpbIdx] : 0 ); j < m_vps->m_dpbMaxTemporalId[dpbIdx]; j++ )
          {
            // When max_dec_pic_buffering_minus1[ dpbIdx ] is not present for dpbIdx in the range of 0 to maxSubLayersMinus1 - 1, inclusive, due to subLayerInfoFlag being equal to 0, it is inferred to be equal to max_dec_pic_buffering_minus1[ maxSubLayersMinus1 ].
            m_vps->m_dpbParameters[dpbIdx].m_maxDecPicBuffering[j] = m_vps->m_dpbParameters[dpbIdx].m_maxDecPicBuffering[m_vps->m_dpbMaxTemporalId[dpbIdx]];
    
            // When max_num_reorder_pics[ dpbIdx ] is not present for dpbIdx in the range of 0 to maxSubLayersMinus1 - 1, inclusive, due to subLayerInfoFlag being equal to 0, it is inferred to be equal to max_num_reorder_pics[ maxSubLayersMinus1 ].
            m_vps->m_dpbParameters[dpbIdx].m_numReorderPics[j] = m_vps->m_dpbParameters[dpbIdx].m_numReorderPics[m_vps->m_dpbMaxTemporalId[dpbIdx]];
    
            // When max_latency_increase_plus1[ dpbIdx ] is not present for dpbIdx in the range of 0 to maxSubLayersMinus1 - 1, inclusive, due to subLayerInfoFlag being equal to 0, it is inferred to be equal to max_latency_increase_plus1[ maxSubLayersMinus1 ].
            m_vps->m_dpbParameters[dpbIdx].m_maxLatencyIncreasePlus1[j] = m_vps->m_dpbParameters[dpbIdx].m_maxLatencyIncreasePlus1[m_vps->m_dpbMaxTemporalId[dpbIdx]];
          }
    
    #if JVET_S0100_ASPECT3
      for (int i = 0; i < m_vps->getNumOutputLayerSets(); i++)
      {
        m_vps->setHrdMaxTid(i, m_vps->getMaxSubLayers() - 1);
      }
    #endif
    
    
      if (m_cfgVPSParameters.m_maxTidILRefPicsPlus1 >= 0)
      {
        for (int i = 0; i < m_vps->getMaxLayers(); i++)
        {
          m_vps->setMaxTidIlRefPicsPlus1(i, m_cfgVPSParameters.m_maxTidILRefPicsPlus1);
        }
      }
    
    void EncLib::xInitDCI(DCI& dci, const SPS& sps)
    {
      dci.setMaxSubLayersMinus1(sps.getMaxTLayers() - 1);
      std::vector<ProfileTierLevel> ptls;
      ptls.resize(1);
      ptls[0] = *sps.getProfileTierLevel();
      dci.setProfileTierLevel(ptls);
    }
    
    void EncLib::xInitSPS( SPS& sps )
    
      ProfileTierLevel* profileTierLevel = sps.getProfileTierLevel();
      ConstraintInfo* cinfo = profileTierLevel->getConstraintInfo();
    
    
    #if JVET_S0179_CONDITIONAL_SIGNAL_GCI
      cinfo->setGciPresentFlag(m_gciPresentFlag);
    #endif
    
    #if !JVET_S0266_VUI_length
    
      cinfo->setNonPackedConstraintFlag     (m_nonPackedConstraintFlag);
    
      cinfo->setNonProjectedConstraintFlag(m_nonProjectedConstraintFlag);
    
    #endif
    #if JVET_Q0114_ASPECT5_GCI_FLAG
      cinfo->setNoRprConstraintFlag(m_noRprConstraintFlag);
    
      cinfo->setNoResChangeInClvsConstraintFlag(m_noResChangeInClvsConstraintFlag);
      cinfo->setOneTilePerPicConstraintFlag(m_oneTilePerPicConstraintFlag);
    
    bdchoi's avatar
    bdchoi committed
      cinfo->setPicHeaderInSliceHeaderConstraintFlag(m_picHeaderInSliceHeaderConstraintFlag);
    
      cinfo->setOneSlicePerPicConstraintFlag(m_oneSlicePerPicConstraintFlag);
    
    #if JVET_S0113_S0195_GCI
      cinfo->setNoIdrRplConstraintFlag(m_noIdrRplConstraintFlag);
      cinfo->setNoRectSliceConstraintFlag(m_noRectSliceConstraintFlag);
      cinfo->setOneSlicePerSubpicConstraintFlag(m_oneSlicePerSubpicConstraintFlag);
      cinfo->setNoSubpicInfoConstraintFlag(m_noSubpicInfoConstraintFlag);
    #else
    
      cinfo->setOneSubpicPerPicConstraintFlag(m_oneSubpicPerPicConstraintFlag);
    
      cinfo->setFrameOnlyConstraintFlag     (m_frameOnlyConstraintFlag);
    
      cinfo->setOnePictureOnlyConstraintFlag(m_onePictureOnlyConstraintFlag);
    
      cinfo->setIntraOnlyConstraintFlag         (m_intraOnlyConstraintFlag);
    
      cinfo->setMaxBitDepthConstraintIdc    (m_maxBitDepthConstraintIdc);
    
      cinfo->setMaxChromaFormatConstraintIdc((int)m_maxChromaFormatConstraintIdc);
    
      cinfo->setSingleLayerConstraintFlag (m_singleLayerConstraintFlag);
    
      cinfo->setAllLayersIndependentConstraintFlag (m_allLayersIndependentConstraintFlag);
      cinfo->setNoMrlConstraintFlag (m_noMrlConstraintFlag);
      cinfo->setNoIspConstraintFlag (m_noIspConstraintFlag);
      cinfo->setNoMipConstraintFlag (m_noMipConstraintFlag);
      cinfo->setNoLfnstConstraintFlag (m_noLfnstConstraintFlag);
      cinfo->setNoMmvdConstraintFlag (m_noMmvdConstraintFlag);
      cinfo->setNoSmvdConstraintFlag (m_noSmvdConstraintFlag);
      cinfo->setNoProfConstraintFlag (m_noProfConstraintFlag);
      cinfo->setNoPaletteConstraintFlag (m_noPaletteConstraintFlag);
      cinfo->setNoActConstraintFlag (m_noActConstraintFlag);
      cinfo->setNoLmcsConstraintFlag (m_noLmcsConstraintFlag);
    
    #if JVET_S0050_GCI
      cinfo->setNoExplicitScaleListConstraintFlag(m_noExplicitScaleListConstraintFlag);
      cinfo->setNoVirtualBoundaryConstraintFlag(m_noVirtualBoundaryConstraintFlag);
    
    #endif
    #if JVET_S0058_GCI
    
      cinfo->setNoMttConstraintFlag(m_noMttConstraintFlag);
    
    #endif
    #if JVET_R0341_GCI
      cinfo->setNoChromaQpOffsetConstraintFlag(m_noChromaQpOffsetConstraintFlag);
    
      cinfo->setNoQtbttDualTreeIntraConstraintFlag(m_noQtbttDualTreeIntraConstraintFlag);
    
      cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag);
    
      cinfo->setNoSaoConstraintFlag(m_noSaoConstraintFlag);
    
    Xiaoyu Xiu's avatar
    Xiaoyu Xiu committed
    #if JVET_W0066_CCSAO
      cinfo->setNoCCSaoConstraintFlag(m_noCCSaoConstraintFlag);
    #endif
    
      cinfo->setNoAlfConstraintFlag(m_noAlfConstraintFlag);
    
      cinfo->setNoCCAlfConstraintFlag(m_noCCAlfConstraintFlag);
    
      cinfo->setNoWeightedPredictionConstraintFlag(m_noWeightedPredictionConstraintFlag);
    
      cinfo->setNoRefWraparoundConstraintFlag(m_noRefWraparoundConstraintFlag);
      cinfo->setNoTemporalMvpConstraintFlag(m_noTemporalMvpConstraintFlag);
      cinfo->setNoSbtmvpConstraintFlag(m_noSbtmvpConstraintFlag);
      cinfo->setNoAmvrConstraintFlag(m_noAmvrConstraintFlag);
      cinfo->setNoBdofConstraintFlag(m_noBdofConstraintFlag);
    
      cinfo->setNoDmvrConstraintFlag(m_noDmvrConstraintFlag);
    
      cinfo->setNoCclmConstraintFlag(m_noCclmConstraintFlag);
      cinfo->setNoMtsConstraintFlag(m_noMtsConstraintFlag);
    
      cinfo->setNoSbtConstraintFlag(m_noSbtConstraintFlag);
    
      cinfo->setNoAffineMotionConstraintFlag(m_noAffineMotionConstraintFlag);
      cinfo->setNoBcwConstraintFlag(m_noBcwConstraintFlag);
    
      cinfo->setNoIbcConstraintFlag(m_noIbcConstraintFlag);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_DIMD
      cinfo->setNoDimdConstraintFlag(m_noDimdConstraintFlag);
    #endif
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
      cinfo->setNoTimdConstraintFlag(m_noTimdConstraintFlag);
    #endif
    
    fan wang's avatar
    fan wang committed
    #if JVET_AB0155_SGPM
      cinfo->setNoSgpmConstraintFlag(m_noSgpmConstraintFlag);
    #endif
    
    #if JVET_AD0082_TMRL_CONFIG
      cinfo->setNoTmrlConstraintFlag(m_noTmrlConstraintFlag);
    #endif
    
    #if JVET_AG0058_EIP
      cinfo->setNoEipConstraintFlag(m_noEipConstraintFlag);
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_OBMC
      cinfo->setNoObmcConstraintFlag(m_noObmcConstraintFlag);
    #endif
    
      cinfo->setNoCiipConstraintFlag(m_noCiipConstraintFlag);
    
    Han Gao's avatar
    Han Gao committed
      cinfo->setNoGeoConstraintFlag(m_noGeoConstraintFlag);
    
      cinfo->setNoLadfConstraintFlag(m_noLadfConstraintFlag);
    
      cinfo->setNoTransformSkipConstraintFlag(m_noTransformSkipConstraintFlag);
    
      cinfo->setNoBDPCMConstraintFlag(m_noBDPCMConstraintFlag);
    
      cinfo->setNoJointCbCrConstraintFlag(m_noJointCbCrConstraintFlag);
    
      cinfo->setNoQpDeltaConstraintFlag(m_noQpDeltaConstraintFlag);
      cinfo->setNoDepQuantConstraintFlag(m_noDepQuantConstraintFlag);
      cinfo->setNoSignDataHidingConstraintFlag(m_noSignDataHidingConstraintFlag);
    
      cinfo->setNoTrailConstraintFlag(m_noTrailConstraintFlag);
      cinfo->setNoStsaConstraintFlag(m_noStsaConstraintFlag);
      cinfo->setNoRaslConstraintFlag(m_noRaslConstraintFlag);
      cinfo->setNoRadlConstraintFlag(m_noRadlConstraintFlag);
      cinfo->setNoIdrConstraintFlag(m_noIdrConstraintFlag);
      cinfo->setNoCraConstraintFlag(m_noCraConstraintFlag);
      cinfo->setNoGdrConstraintFlag(m_noGdrConstraintFlag);
      cinfo->setNoApsConstraintFlag(m_noApsConstraintFlag);
    
      profileTierLevel->setLevelIdc                    (m_level);
      profileTierLevel->setTierFlag                    (m_levelTier);
      profileTierLevel->setProfileIdc                  (m_profile);
    
    #if JVET_S0138_GCI_PTL
      profileTierLevel->setFrameOnlyConstraintFlag     (m_frameOnlyConstraintFlag);
      profileTierLevel->setMultiLayerEnabledFlag       (m_multiLayerEnabledFlag);
    #endif
    
      profileTierLevel->setNumSubProfile(m_numSubProfile);
      for (int k = 0; k < m_numSubProfile; k++)
      {
        profileTierLevel->setSubProfileIdc(k, m_subProfile[k]);
      }
    
      /* XXX: should Main be marked as compatible with still picture? */
      /* XXX: may be a good idea to refactor the above into a function
       * that chooses the actual compatibility based upon options */
    
      sps.setVPSId( m_vps->getVPSId() );
    
    Seungwook Hong's avatar
    Seungwook Hong committed
    #if JVET_Z0118_GDR
    
    Seungwook Hong's avatar
    Seungwook Hong committed
      if (getGdrEnabled())
    
    Seungwook Hong's avatar
    Seungwook Hong committed
      {
        sps.setGDREnabledFlag(true);
      }
      else
      {
        sps.setGDREnabledFlag(false);
      }
    #else
      sps.setGDREnabledFlag(false);
    #endif
    
    
    #if JVET_AA0146_WRAP_AROUND_FIX
      sps.setMaxPicWidthInLumaSamples( m_sourceWidth );
      sps.setMaxPicHeightInLumaSamples( m_sourceHeight );
    #else
    
      sps.setMaxPicWidthInLumaSamples( m_iSourceWidth );
      sps.setMaxPicHeightInLumaSamples( m_iSourceHeight );
    
    
    #if JVET_AI0136_ADAPTIVE_DUAL_TREE
      sps.setUseInterSliceSeparateTree ( m_interSliceSeparateTreeEnabled );
      if (getFrameRate() < 50 && (m_sourceWidth * m_sourceHeight) <= (832 * 480))
      {
        sps.setUseInterSliceSeparateTree ( false );
      }
      if(m_iQP < 27 || m_iQP>32)
      {
        sps.setUseInterSliceSeparateTree ( false );
      }
    #endif
    
    
    #if JVET_AA0146_WRAP_AROUND_FIX
        int maxPicWidth = std::max(m_sourceWidth, (int)((double)m_sourceWidth / m_scalingRatioHor + 0.5));
        int maxPicHeight = std::max(m_sourceHeight, (int)((double)m_sourceHeight / m_scalingRatioVer + 0.5));
    #else
    
        int maxPicWidth = std::max(m_iSourceWidth, (int)((double)m_iSourceWidth / m_scalingRatioHor + 0.5));
        int maxPicHeight = std::max(m_iSourceHeight, (int)((double)m_iSourceHeight / m_scalingRatioVer + 0.5));
    
    #endif
    #if JVET_AC0096
    
    #if JVET_AG0116
        if (m_rprFunctionalityTestingEnabledFlag || m_gopBasedRPREnabledFlag)
    #else
    
        if (m_rprFunctionalityTestingEnabledFlag)
    
        {
          maxPicWidth = std::max(maxPicWidth, (int)((double)m_sourceWidth / m_scalingRatioHor2 + 0.5));
          maxPicHeight = std::max(maxPicHeight, (int)((double)m_sourceHeight / m_scalingRatioVer2 + 0.5));
          maxPicWidth = std::max(maxPicWidth, (int)((double)m_sourceWidth / m_scalingRatioHor3 + 0.5));
          maxPicHeight = std::max(maxPicHeight, (int)((double)m_sourceHeight / m_scalingRatioVer3 + 0.5));
        }
    
        const int minCuSize = std::max(8, 1 << m_log2MinCUSize);
        if (maxPicWidth % minCuSize)
    
          maxPicWidth += ((maxPicWidth / minCuSize) + 1) * minCuSize - maxPicWidth;
    
        if (maxPicHeight % minCuSize)
    
          maxPicHeight += ((maxPicHeight / minCuSize) + 1) * minCuSize - maxPicHeight;
    
        sps.setMaxPicWidthInLumaSamples( maxPicWidth );
        sps.setMaxPicHeightInLumaSamples( maxPicHeight );
      }
    
      sps.setMaxCUWidth             ( m_maxCUWidth        );
      sps.setMaxCUHeight            ( m_maxCUHeight       );
    
      sps.setLog2MinCodingBlockSize ( m_log2MinCUSize );
    
      sps.setCTUSize                             ( m_CTUSize );
      sps.setSplitConsOverrideEnabledFlag        ( m_useSplitConsOverride );
    
      // convert the Intra Chroma minQT setting from chroma unit to luma unit
      m_uiMinQT[2] <<= getChannelTypeScaleX(CHANNEL_TYPE_CHROMA, m_chromaFormatIDC);
    
      sps.setMinQTSizes                          ( m_uiMinQT );
    
    Remy Foray's avatar
    Remy Foray committed
      sps.setMaxMTTHierarchyDepth                ( m_uiMaxMTTHierarchyDepth, m_uiMaxMTTHierarchyDepthI, m_uiMaxMTTHierarchyDepthIChroma );
    
      sps.setMaxBTSize( m_uiMaxBT[1], m_uiMaxBT[0], m_uiMaxBT[2] );
      sps.setMaxTTSize( m_uiMaxTT[1], m_uiMaxTT[0], m_uiMaxTT[2] );
    
      sps.setIDRRefParamListPresent              ( m_idrRefParamList );
    
      sps.setUseDualITree                        ( m_dualITree );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SIGN_PREDICTION
    
      sps.setNumPredSigns                        ( m_numPredSign );
    #if JVET_Y0141_SIGN_PRED_IMPROVE
      sps.setLog2SignPredArea                    (m_log2SignPredArea);
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    #if JVET_AH0103_LOW_DELAY_LFNST_NSPT
      sps.setUseIntraLFNSTISlice                 ( m_intraLFNSTISlice );
      sps.setUseIntraLFNSTPBSlice                ( m_intraLFNSTPBSlice );
      sps.setUseInterLFNST                       ( m_interLFNST );
    #else
    
      sps.setUseLFNST                            ( m_LFNST );
    
      sps.setSbTMVPEnabledFlag(m_sbTmvpEnableFlag);
    
      sps.setAMVREnabledFlag                ( m_ImvMode != IMV_OFF );
    
      sps.setBDOFEnabledFlag                    ( m_BIO );
    
    #if JVET_W0090_ARMC_TM
    
    #if JVET_AG0276_NLIC
      sps.setUseAltLM                           ( m_altLM );
      sps.setUseAffAltLM                        ( m_affAltLM );
    #endif
    #endif
    #if JVET_AG0276_LIC_FLAG_SIGNALING
      sps.setUseMergeOppositeLic                ( m_mergeOppositeLic );
      sps.setUseTMMergeOppositeLic              ( m_mergeTMOppositeLic );
      sps.setUseAffMergeOppositeLic             ( m_mergeAffOppositeLic );
    
    #if JVET_AC0185_ENHANCED_TEMPORAL_MOTION_DERIVATION 
      sps.setUseFastSubTmvp                     ((m_sourceWidth * m_sourceHeight) > (m_intraPeriod == -1 ? 0 : 832 * 480));
    #endif
    
    #if JVET_AA0093_REFINED_MOTION_FOR_ARMC
      sps.setUseArmcRefinedMotion               ( m_armcRefinedMotion );
    
    Ling Li's avatar
    Ling Li committed
      sps.setMaxNumMergeCand(getMaxNumMergeCand());
    
    #if JVET_AG0276_LIC_FLAG_SIGNALING
      sps.setMaxNumOppositeLicMergeCand( getMaxNumOppositeLicMergeCand() );
    #endif
    
    Han Huang's avatar
    Han Huang committed
    #if JVET_X0049_ADAPT_DMVR
      sps.setMaxNumBMMergeCand(getMaxNumBMMergeCand());
    #endif
    
    Ling Li's avatar
    Ling Li committed
      sps.setMaxNumAffineMergeCand(getMaxNumAffineMergeCand());
    
    #if JVET_AG0276_LIC_FLAG_SIGNALING
      sps.setMaxNumAffineOppositeLicMergeCand( getMaxNumAffineOppositeLicMergeCand() );
      if (getIntraPeriod() < 0 && getBaseQP() > 32 )
      {
        sps.setUseMergeOppositeLic(false);
        sps.setUseTMMergeOppositeLic(false);
        sps.setUseAffMergeOppositeLic(false);
      }
    #endif
    
    Ling Li's avatar
    Ling Li committed
      sps.setMaxNumIBCMergeCand(getMaxNumIBCMergeCand());
      sps.setMaxNumGeoCand(getMaxNumGeoCand());
    
    #if JVET_AG0164_AFFINE_GPM
      sps.setMaxNumGpmAffCand      (((m_sourceWidth * m_sourceHeight) > (m_intraPeriod == -1 ? 1280 * 720 : 0)) ? getMaxNumGpmAffCand() : 0);
    #endif
    
    #if JVET_Z0127_SPS_MHP_MAX_MRG_CAND
      sps.setMaxNumMHPCand(getMaxNumMHPCand());
    #endif
    
      sps.setUseAffine             ( m_Affine );
      sps.setUseAffineType         ( m_AffineType );
    
    #if JVET_AH0185_ADAPTIVE_COST_IN_MERGE_MODE
      sps.setUseAltCost            ( m_useAltCost );
      if ((getSourceWidth() * getSourceHeight()) > (832 * 480) && ((getSourceWidth() * getSourceHeight()) < (1920 * 1080)))
      {
        if (getBaseQP() > 27)
        {
          sps.setUseAltCost(false);
        }
      }
    #endif
    
    #if JVET_AF0163_TM_SUBBLOCK_REFINEMENT
      sps.setUseAffineTM           ( m_useAffineTM );
    
    #if JVET_AG0276_NLIC
      sps.setUseAffAltLMTM         ( m_useAffAltLMTM );
      if (getIntraPeriod() > 0)
      {
        if ((getSourceWidth() * getSourceHeight()) > (832 * 480) && ((getSourceWidth() * getSourceHeight()) < (3840 * 2160)))
        {
          sps.setUseAffAltLMTM(false);
        }
        if (getBaseQP() > 32)
        {
          sps.setUseAltLM(false);
          sps.setUseAffAltLM(false);
          sps.setUseAffAltLMTM(false);
        }
        else if (getBaseQP() < 27)
        {
          sps.setUseAltLM(false);
          sps.setUseAffAltLM(true);
          sps.setUseAffAltLMTM(true);
        }
      }
      else
      {
        sps.setUseAffAltLM(false);
        sps.setUseAffAltLMTM(false);
        if (getBaseQP() < 27)
        {
          sps.setUseAltLM(false);
        }
      }
    #endif
    
    #if JVET_AH0119_SUBBLOCK_TM
      sps.setUseSbTmvpTM(m_useSbTmvpTM);
      if (getBaseQP() < 27)
      {
        sps.setUseSbTmvpTM(false);
        sps.setUseAffineTM(false);
      }
    #endif
    
    #if JVET_AG0135_AFFINE_CIIP
      sps.setUseCiipAffine         (((m_sourceWidth * m_sourceHeight) > (m_intraPeriod == -1 ? 832 * 480 : 0)) ? m_useCiipAffine : false);
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if AFFINE_MMVD
      sps.setUseAffineMmvdMode     ( m_AffineMmvdMode );
    #endif
    
    #if TM_AMVP || TM_MRG || JVET_Z0084_IBC_TM || MULTI_PASS_DMVR
    
    Vadim Seregin's avatar
    Vadim Seregin committed
      sps.setUseDMVDMode           ( m_DMVDMode );
    
    #if JVET_AA0132_CONFIGURABLE_TM_TOOLS
      sps.setTMToolsEnableFlag     ( m_tmToolsEnableFlag );
    #if TM_AMVP
      sps.setUseTMAmvpMode         ( m_tmAmvpMode );
    #endif
    #if TM_MRG
      sps.setUseTMMrgMode          ( m_tmMrgMode );
    #endif
    #if JVET_W0097_GPM_MMVD_TM && TM_MRG
      sps.setUseGPMTMMode          ( m_tmGPMMode );
    #endif
    #if JVET_Z0061_TM_OBMC && ENABLE_OBMC
      sps.setUseOBMCTMMode         ( m_tmOBMCMode );
    #endif
    #if JVET_Y0134_TMVP_NAMVP_CAND_REORDERING && JVET_W0090_ARMC_TM
      sps.setUseTmvpNmvpReordering ( m_useTmvpNmvpReorder );
    #endif
    #if JVET_Y0067_ENHANCED_MMVD_MVD_SIGN_PRED
      sps.setUseTMMMVD             ( m_useTMMMVD );
    #endif
    #endif
    
    #if JVET_Z0056_GPM_SPLIT_MODE_REORDERING
      sps.setUseAltGPMSplitModeCode( m_altGPMSplitModeCode );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
      sps.setUseLMChroma           ( m_LMChroma ? true : false );
    
      sps.setHorCollocatedChromaFlag( m_horCollocatedChromaFlag );
      sps.setVerCollocatedChromaFlag( m_verCollocatedChromaFlag );
    
      sps.setUseMTS                ( m_IntraMTS || m_InterMTS || m_ImplicitMTS );
      sps.setUseIntraMTS           ( m_IntraMTS );
      sps.setUseInterMTS           ( m_InterMTS );
    
    #if JVET_AI0050_INTER_MTSS
      sps.setUseInterMTSS          ( m_useInterMTSS );
    #endif
    #if JVET_AI0050_SBT_LFNST
      sps.setUseSbtLFNST           ( m_useSbtLFNST );
    #endif
    
      sps.setUseSMVD                ( m_SMVD );
    
      sps.setUseBcw                ( m_bcw );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if INTER_LIC
      sps.setLicEnabledFlag        ( m_lic );
    
    #if JVET_AG0276_LIC_SLOPE_ADJUST
      sps.setLicSlopeAdjustEnabledFlag( m_licSlopeAdjust );
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
    
      sps.setLadfEnabled           ( m_LadfEnabled );
    
        sps.setLadfNumIntervals    ( m_LadfNumIntervals );
    
        for ( int k = 0; k < m_LadfNumIntervals; k++ )
        {
    
          sps.setLadfQpOffset( m_LadfQpOffset[k], k );
          sps.setLadfIntervalLowerBound( m_LadfIntervalLowerBound[k], k );
    
        }
        CHECK( m_LadfIntervalLowerBound[0] != 0, "abnormal value set to LadfIntervalLowerBound[0]" );
      }
    #endif