Skip to content
Snippets Groups Projects
EncLib.cpp 95.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Haiwei Sun's avatar
    Haiwei Sun committed
      {
    
        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, false, m_picIdInGOP );
    #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;
    
        rpcPic->create( sps.getChromaFormatIdc(), Size( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples() ),
                        sps.getMaxCUWidth(), sps.getMaxCUWidth() + 16, 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())));
          rpcPic->M_BUFS(0, PIC_TRUE_ORIGINAL_INPUT).create(sps.getChromaFormatIdc(), Area(Position(), Size(pps0.getPicWidthInLumaSamples(), pps0.getPicHeightInLumaSamples())));
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    
    
          if( getGopBasedTemporalFilterEnabled() )
    
    Vadim Seregin's avatar
    Vadim Seregin committed
          {
            rpcPic->M_BUFS( 0, PIC_FILTERED_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
    
    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() );
    
      sps.setMaxPicWidthInLumaSamples( m_iSourceWidth );
      sps.setMaxPicHeightInLumaSamples( m_iSourceHeight );
    
      {
        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));
        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 );
    #endif
    
      sps.setUseLFNST                            ( m_LFNST );
    
      sps.setSbTMVPEnabledFlag(m_sbTmvpEnableFlag);
    
      sps.setAMVREnabledFlag                ( m_ImvMode != IMV_OFF );
    
      sps.setBDOFEnabledFlag                    ( m_BIO );
    
    #if JVET_W0090_ARMC_TM
    
    Ling Li's avatar
    Ling Li committed
      sps.setMaxNumMergeCand(getMaxNumMergeCand());
    
    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());
      sps.setMaxNumIBCMergeCand(getMaxNumIBCMergeCand());
      sps.setMaxNumGeoCand(getMaxNumGeoCand());
    
      sps.setUseAffine             ( m_Affine );
      sps.setUseAffineType         ( m_AffineType );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if AFFINE_MMVD
      sps.setUseAffineMmvdMode     ( m_AffineMmvdMode );
    #endif
    #if TM_AMVP || TM_MRG || MULTI_PASS_DMVR
      sps.setUseDMVDMode           ( m_DMVDMode );
    #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 );
    
      sps.setUseSMVD                ( m_SMVD );
    
      sps.setUseBcw                ( m_bcw );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if INTER_LIC
      sps.setLicEnabledFlag        ( m_lic );
    #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
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_DIMD
      sps.setUseDimd            ( m_dimd );
    #endif
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
      sps.setUseTimd            ( m_timd );
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_OBMC
      sps.setUseOBMC            ( m_OBMC );
    #endif
    
      sps.setUseCiip            ( m_ciip );
    
    #if JVET_X0141_CIIP_TIMD_TM && TM_MRG
      if(sps.getUseCiip())
      {
       if(getIntraPeriod() < 0)
       {
          sps.setUseCiipTmMrg (false);
       }
       else
       {
          sps.setUseCiipTmMrg (true);
       }
      }
    #endif
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
      sps.setUseMMVD               ( m_MMVD );
    
      sps.setFpelMmvdEnabledFlag   (( m_MMVD ) ? m_allowDisFracMMVD : false);
    
    #if JVET_Y0067_ENHANCED_MMVD_MVD_SIGN_PRED
      sps.setUseMVSD               (m_MVSD);
    #endif
    
      sps.setBdofControlPresentFlag(m_BIO);
      sps.setDmvrControlPresentFlag(m_DMVR);
      sps.setProfControlPresentFlag(m_PROF);
    
      sps.setAffineAmvrEnabledFlag              ( m_AffineAmvr );
    
      sps.setUseDMVR                            ( m_DMVR );
    
      sps.setUseColorTrans(m_useColorTrans);
    
    Yu Han's avatar
    Yu Han committed
      sps.setIBCFlag                            ( m_IBCMode);
    
      sps.setWrapAroundEnabledFlag                      ( m_wrapAround );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if MULTI_HYP_PRED
      sps.setMaxNumAddHyps(m_maxNumAddHyps);
      sps.setNumAddHypWeights(m_numAddHypWeights);
      sps.setMaxNumAddHypRefFrames(m_maxNumAddHypRefFrames);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
      sps.setUseIntraTMP(m_intraTMP);
      sps.setIntraTMPMaxSize(m_intraTmpMaxSize);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
      // ADD_NEW_TOOL : (encoder lib) set tool enabling flags and associated parameters here
    
      sps.setUseISP                             ( m_ISP );
    
      sps.setUseLmcs                            ( m_lmcsEnabled );
    
      sps.setUseMRL                ( m_MRL );
    
      sps.setUseMIP                ( m_MIP );
    
      CHECK(m_log2MinCUSize > std::min(6, floorLog2(sps.getMaxCUWidth())), "log2_min_luma_coding_block_size_minus2 shall be in the range of 0 to min (4, log2_ctu_size - 2)");
    
      CHECK(m_uiMaxMTTHierarchyDepth > 2 * (floorLog2(sps.getCTUSize()) - sps.getLog2MinCodingBlockSize()), "sps_max_mtt_hierarchy_depth_inter_slice shall be in the range 0 to 2*(ctbLog2SizeY - log2MinCUSize)");
      CHECK(m_uiMaxMTTHierarchyDepthI > 2 * (floorLog2(sps.getCTUSize()) - sps.getLog2MinCodingBlockSize()), "sps_max_mtt_hierarchy_depth_intra_slice_luma shall be in the range 0 to 2*(ctbLog2SizeY - log2MinCUSize)");
      CHECK(m_uiMaxMTTHierarchyDepthIChroma > 2 * (floorLog2(sps.getCTUSize()) - sps.getLog2MinCodingBlockSize()), "sps_max_mtt_hierarchy_depth_intra_slice_chroma shall be in the range 0 to 2*(ctbLog2SizeY - log2MinCUSize)");
    
      sps.setTransformSkipEnabledFlag(m_useTransformSkip);
    
      sps.setLog2MaxTransformSkipBlockSize(m_log2MaxTransformSkipBlockSize);
    
      sps.setSPSTemporalMVPEnabledFlag((getTMVPModeId() == 2 || getTMVPModeId() == 1));
    
    
      sps.setLog2MaxTbSize   ( m_log2MaxTbSize );
    
    
      for (uint32_t channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
      {
        sps.setBitDepth      (ChannelType(channelType), m_bitDepth[channelType] );
        sps.setQpBDOffset  (ChannelType(channelType), (6 * (m_bitDepth[channelType] - 8)));
    
    LI JINGYA's avatar
    LI JINGYA committed
        sps.setInternalMinusInputBitDepth(ChannelType(channelType), max(0, (m_bitDepth[channelType] - m_inputBitDepth[channelType])));
    
    Hendry's avatar
    Hendry committed
      sps.setEntropyCodingSyncEnabledFlag( m_entropyCodingSyncEnabledFlag );
    
      sps.setEntryPointsPresentFlag( m_entryPointPresentFlag );
    
      sps.setUseWP( m_useWeightedPred );
      sps.setUseWPBiPred( m_useWeightedBiPred );
    
    
      sps.setSAOEnabledFlag( m_bUseSAO );
    
    Xiaoyu Xiu's avatar
    Xiaoyu Xiu committed
    #if JVET_W0066_CCSAO
      sps.setCCSAOEnabledFlag( m_CCSAO );
    #endif
    
      sps.setJointCbCrEnabledFlag( m_JointCbCrMode );
    
      sps.setMaxTLayers( m_maxTempLayer );
      sps.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
    
    
      for (int i = 0; i < std::min(sps.getMaxTLayers(), (uint32_t) MAX_TLAYER); i++ )
    
      {
        sps.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
        sps.setNumReorderPics(m_numReorderPics[i], i);
      }
    
      sps.setScalingListFlag ( (m_useScalingListId == SCALING_LIST_OFF) ? 0 : 1 );
    
      if (sps.getUseColorTrans() && sps.getScalingListFlag())
      {
        sps.setScalingMatrixForAlternativeColourSpaceDisabledFlag( m_disableScalingMatrixForAlternativeColourSpace );
      }
      else
      {
        sps.setScalingMatrixForAlternativeColourSpaceDisabledFlag( false );
      }
      if (sps.getScalingMatrixForAlternativeColourSpaceDisabledFlag())
      {
        sps.setScalingMatrixDesignatedColourSpaceFlag( m_scalingMatrixDesignatedColourSpace );
      }
      else
      {
        sps.setScalingMatrixDesignatedColourSpaceFlag( true );
      }
    
      sps.setALFEnabledFlag( m_alf );
    
      sps.setCCALFEnabledFlag( m_ccalf );
    
      sps.setFieldSeqFlag(false);
    
      sps.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
    
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
      if (sps.getVuiParametersPresentFlag())
      {
        VUI* pcVUI = sps.getVuiParameters();
        pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag());
    
        pcVUI->setAspectRatioConstantFlag(!getSampleAspectRatioInfoSEIEnabled());
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
        pcVUI->setAspectRatioIdc(getAspectRatioIdc());
        pcVUI->setSarWidth(getSarWidth());
        pcVUI->setSarHeight(getSarHeight());
        pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
        pcVUI->setColourPrimaries(getColourPrimaries());
        pcVUI->setTransferCharacteristics(getTransferCharacteristics());
        pcVUI->setMatrixCoefficients(getMatrixCoefficients());
    
        pcVUI->setProgressiveSourceFlag       (getProgressiveSourceFlag());
        pcVUI->setInterlacedSourceFlag        (getInterlacedSourceFlag());
    
    #if JVET_S0266_VUI_length
        pcVUI->setNonPackedFlag               (getNonPackedConstraintFlag());
        pcVUI->setNonProjectedFlag            (getNonProjectedConstraintFlag());
    #endif
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
        pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
        pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
        pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
        pcVUI->setChromaSampleLocType(getChromaSampleLocType());
        pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
        pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
        pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag());
      }
    
    
      sps.setNumLongTermRefPicSPS(NUM_LONG_TERM_REF_PIC_SPS);
      CHECK(!(NUM_LONG_TERM_REF_PIC_SPS <= MAX_NUM_LONG_TERM_REF_PICS), "Unspecified error");
      for (int k = 0; k < NUM_LONG_TERM_REF_PIC_SPS; k++)
      {
        sps.setLtRefPicPocLsbSps(k, 0);
        sps.setUsedByCurrPicLtSPSFlag(k, 0);
      }
    
    U-EU\bray's avatar
    U-EU\bray committed
      int numQpTables = m_chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (sps.getJointCbCrEnabledFlag() ? 3 : 2);
      m_chromaQpMappingTableParams.setNumQpTables(numQpTables);
    
      sps.setChromaQpMappingTableFromParams(m_chromaQpMappingTableParams, sps.getQpBDOffset(CHANNEL_TYPE_CHROMA));
    
    
    #if U0132_TARGET_BITS_SATURATION
      if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() || getCpbSaturationEnabled() )
    #else
      if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() )
    #endif
      {
        xInitHrdParameters(sps);
      }
      if( getBufferingPeriodSEIEnabled() || getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() )
      {
    
        sps.setGeneralHrdParametersPresentFlag(true);
    
      }
    
      // Set up SPS range extension settings
      sps.getSpsRangeExtension().setTransformSkipRotationEnabledFlag(m_transformSkipRotationEnabledFlag);
      sps.getSpsRangeExtension().setTransformSkipContextEnabledFlag(m_transformSkipContextEnabledFlag);
      sps.getSpsRangeExtension().setExtendedPrecisionProcessingFlag(m_extendedPrecisionProcessingFlag);
      sps.getSpsRangeExtension().setIntraSmoothingDisabledFlag( m_intraSmoothingDisabledFlag );
      sps.getSpsRangeExtension().setHighPrecisionOffsetsEnabledFlag(m_highPrecisionOffsetsEnabledFlag);
      sps.getSpsRangeExtension().setPersistentRiceAdaptationEnabledFlag(m_persistentRiceAdaptationEnabledFlag);
      sps.getSpsRangeExtension().setCabacBypassAlignmentEnabledFlag(m_cabacBypassAlignmentEnabledFlag);
    
      sps.setSubPicInfoPresentFlag(m_subPicInfoPresentFlag);
      if (m_subPicInfoPresentFlag)
    
        sps.setNumSubPics(m_numSubPics);
    
    Mitsuru Katsumata's avatar
    Mitsuru Katsumata committed
    #if JVET_S0071_SAME_SIZE_SUBPIC_LAYOUT
        sps.setSubPicSameSizeFlag(m_subPicSameSizeFlag);
        if (m_subPicSameSizeFlag)
        {
          uint32_t numSubpicCols = (m_iSourceWidth + m_CTUSize - 1) / m_CTUSize / m_subPicWidth[0];
          for (unsigned int i = 0; i < m_numSubPics; i++)
          {
            sps.setSubPicCtuTopLeftX(i, (i % numSubpicCols) * m_subPicWidth[0]);
            sps.setSubPicCtuTopLeftY(i, (i / numSubpicCols) * m_subPicHeight[0]);
            sps.setSubPicWidth(i, m_subPicWidth[0]);
            sps.setSubPicHeight(i, m_subPicHeight[0]);
          }
        }
        else
        {
          sps.setSubPicCtuTopLeftX(m_subPicCtuTopLeftX);
          sps.setSubPicCtuTopLeftY(m_subPicCtuTopLeftY);
          sps.setSubPicWidth(m_subPicWidth);
          sps.setSubPicHeight(m_subPicHeight);
        }
    #else
    
        sps.setSubPicCtuTopLeftX(m_subPicCtuTopLeftX);
        sps.setSubPicCtuTopLeftY(m_subPicCtuTopLeftY);
        sps.setSubPicWidth(m_subPicWidth);
        sps.setSubPicHeight(m_subPicHeight);
    
    Mitsuru Katsumata's avatar
    Mitsuru Katsumata committed
    #endif
    
        sps.setSubPicTreatedAsPicFlag(m_subPicTreatedAsPicFlag);
        sps.setLoopFilterAcrossSubpicEnabledFlag(m_loopFilterAcrossSubpicEnabledFlag);
        sps.setSubPicIdLen(m_subPicIdLen);
    
        sps.setSubPicIdMappingExplicitlySignalledFlag(m_subPicIdMappingExplicitlySignalledFlag);
        if (m_subPicIdMappingExplicitlySignalledFlag)
        {
          sps.setSubPicIdMappingInSpsFlag(m_subPicIdMappingInSpsFlag);
          if (m_subPicIdMappingInSpsFlag)
          {
            sps.setSubPicId(m_subPicId);
          }
        }
    
    LI JINGYA's avatar
    LI JINGYA committed
      }
    
      else   //In that case, there is only one subpicture that contains the whole picture
      {
        sps.setNumSubPics(1);
        sps.setSubPicCtuTopLeftX(0, 0);
        sps.setSubPicCtuTopLeftY(0, 0);
        sps.setSubPicWidth(0, m_iSourceWidth);
        sps.setSubPicHeight(0, m_iSourceHeight);
        sps.setSubPicTreatedAsPicFlag(0, 1);
        sps.setLoopFilterAcrossSubpicEnabledFlag(0, 0);
    
        sps.setSubPicIdLen(0);
    
        sps.setSubPicIdMappingExplicitlySignalledFlag(false);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    
    #if TCQ_8STATES
      sps.setDepQuantEnabledFlag( m_DepQuantEnabledIdc ? true : false );
    #else
    
      sps.setDepQuantEnabledFlag( m_DepQuantEnabledFlag );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    
      if (!sps.getDepQuantEnabledFlag())
      {
        sps.setSignDataHidingEnabledFlag( m_SignDataHidingEnabledFlag );
      }
    
    FANGJUN PU's avatar
    FANGJUN PU committed
      else
      {
        sps.setSignDataHidingEnabledFlag(false);
      }
    
      sps.setVirtualBoundariesEnabledFlag( m_virtualBoundariesEnabledFlag );
      if( sps.getVirtualBoundariesEnabledFlag() )
    
        sps.setVirtualBoundariesPresentFlag( m_virtualBoundariesPresentFlag );
    
        CHECK( sps.getSubPicInfoPresentFlag() && sps.getVirtualBoundariesPresentFlag() != 1, "When subpicture signalling if present, the signalling of virtual boundaries, is present, shall be in the SPS" );
    
        sps.setNumVerVirtualBoundaries            ( m_numVerVirtualBoundaries );
        sps.setNumHorVirtualBoundaries            ( m_numHorVirtualBoundaries );
        for( unsigned int i = 0; i < m_numVerVirtualBoundaries; i++ )
        {
          sps.setVirtualBoundariesPosX            ( m_virtualBoundariesPosX[i], i );
        }
        for( unsigned int i = 0; i < m_numHorVirtualBoundaries; i++ )
        {
          sps.setVirtualBoundariesPosY            ( m_virtualBoundariesPosY[i], i );
        }
    
      sps.setInterLayerPresentFlag( m_layerId > 0 && m_vps->getMaxLayers() > 1 && !m_vps->getAllIndependentLayersFlag() && !m_vps->getIndependentLayerFlag( m_vps->getGeneralLayerIdx( m_layerId ) ) );
      CHECK( m_vps->getIndependentLayerFlag( m_vps->getGeneralLayerIdx( m_layerId ) ) && sps.getInterLayerPresentFlag(), " When vps_independent_layer_flag[GeneralLayerIdx[nuh_layer_id ]]  is equal to 1, the value of inter_layer_ref_pics_present_flag shall be equal to 0." );
    
      sps.setResChangeInClvsEnabledFlag(m_resChangeInClvsEnabled);
    
    #if JVET_Q0114_ASPECT5_GCI_FLAG
      sps.setRprEnabledFlag(m_rprEnabledFlag);
    #else
    
      sps.setRprEnabledFlag((m_resChangeInClvsEnabled) || sps.getInterLayerPresentFlag());
    
    
      sps.setLog2ParallelMergeLevelMinus2( m_log2ParallelMergeLevelMinus2 );
    
      CHECK(sps.getResChangeInClvsEnabledFlag() && sps.getVirtualBoundariesEnabledFlag(), "when the value of res_change_in_clvs_allowed_flag is equal to 1, the value of sps_virtual_boundaries_present_flag shall be equal to 0");
    
      m_encHRD.initHRDParameters((EncCfg*) this);
    
      GeneralHrdParams *generalHrdParams = sps.getGeneralHrdParameters();
      *generalHrdParams = m_encHRD.getGeneralHrdParameters();
    
    
      OlsHrdParams *spsOlsHrdParams = sps.getOlsHrdParameters();
      for(int i = 0; i < MAX_TLAYER; i++)
      {
        *spsOlsHrdParams = m_encHRD.getOlsHrdParameters(i);
        spsOlsHrdParams++;
      }
    
    }
    
    void EncLib::xInitPPS(PPS &pps, const SPS &sps)
    {
      // pps ID already initialised.
      pps.setSPSId(sps.getSPSId());
    
    Brian Heng's avatar
    Brian Heng committed
      pps.setNumSubPics(sps.getNumSubPics());
    
    Brian Heng's avatar
    Brian Heng committed
      pps.setSubPicIdLen(sps.getSubPicIdLen());
      for(int picIdx=0; picIdx<pps.getNumSubPics(); picIdx++)
      {
        pps.setSubPicId(picIdx, sps.getSubPicId(picIdx));
      }
    
      bool bUseDQP = (getCuQpDeltaSubdiv() > 0)? true : false;
    
    
      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
      {
        bUseDQP = true;
      }
    
    #if SHARP_LUMA_DELTA_QP
      if ( getLumaLevelToDeltaQPMapping().isEnabled() )
      {
        bUseDQP = true;
      }
    #endif
    #if ENABLE_QPA
      if (getUsePerceptQPA() && !bUseDQP)
      {
    
        CHECK( m_cuQpDeltaSubdiv != 0, "max. delta-QP subdiv must be zero!" );
    
        bUseDQP = (getBaseQP() < 38) && (getSourceWidth() > 512 || getSourceHeight() > 320);
    
      }
    #endif
    
      if (m_costMode==COST_SEQUENCE_LEVEL_LOSSLESS || m_costMode==COST_LOSSLESS_CODING)
      {
        bUseDQP=false;
      }
    
    
      if ( m_RCEnableRateControl )
      {
        pps.setUseDQP(true);
      }
      else if(bUseDQP)
      {
        pps.setUseDQP(true);
      }
      else
      {
        pps.setUseDQP(false);
      }
    
    
      if ( m_cuChromaQpOffsetSubdiv >= 0 )
      {
    
        pps.clearChromaQpOffsetList();
        pps.setChromaQpOffsetListEntry(1, 6, 6, 6);
    
        /* todo, insert table entries from command line (NB, 0 should not be touched) */
      }
      else
      {
    
        pps.clearChromaQpOffsetList();
    
      }
      {
        int baseQp = 26;
        if( 16 == getGOPSize() )
        {
          baseQp = getBaseQP()-24;
        }
        else
        {
          baseQp = getBaseQP()-26;
        }
    
        const int minDQP = -26 + sps.getQpBDOffset(CHANNEL_TYPE_LUMA);
    
        pps.setPicInitQPMinus26( std::min( maxDQP, std::max( minDQP, baseQp ) ));
      }
    
    
      if( sps.getJointCbCrEnabledFlag() == false || getChromaFormatIdc() == CHROMA_400 || m_chromaCbCrQpOffset == 0 )
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
      {
        pps.setJointCbCrQpOffsetPresentFlag(false);
      }
      else
      {
        pps.setJointCbCrQpOffsetPresentFlag(true);
      }
    
    
    #if ER_CHROMA_QP_WCG_PPS
      if (getWCGChromaQPControl().isEnabled())
      {
        const int baseQp=m_iQP+pps.getPPSId();
        const double chromaQp = m_wcgChromaQpControl.chromaQpScale * baseQp + m_wcgChromaQpControl.chromaQpOffset;
        const double dcbQP = m_wcgChromaQpControl.chromaCbQpScale * chromaQp;
        const double dcrQP = m_wcgChromaQpControl.chromaCrQpScale * chromaQp;
        const int cbQP =(int)(dcbQP + ( dcbQP < 0 ? -0.5 : 0.5) );
        const int crQP =(int)(dcrQP + ( dcrQP < 0 ? -0.5 : 0.5) );
        pps.setQpOffset(COMPONENT_Cb, Clip3( -12, 12, min(0, cbQP) + m_chromaCbQpOffset ));
        pps.setQpOffset(COMPONENT_Cr, Clip3( -12, 12, min(0, crQP) + m_chromaCrQpOffset));
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
        if(pps.getJointCbCrQpOffsetPresentFlag())
          pps.setQpOffset(JOINT_CbCr, Clip3(-12, 12, (min(0, cbQP) + min(0, crQP)) / 2 + m_chromaCbCrQpOffset));
        else
          pps.setQpOffset(JOINT_CbCr, 0);
    
      }
      else
      {
    #endif
      pps.setQpOffset(COMPONENT_Cb, m_chromaCbQpOffset );
      pps.setQpOffset(COMPONENT_Cr, m_chromaCrQpOffset );
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
      if (pps.getJointCbCrQpOffsetPresentFlag())
        pps.setQpOffset(JOINT_CbCr, m_chromaCbCrQpOffset);
      else
        pps.setQpOffset(JOINT_CbCr, 0);
    
    #if ER_CHROMA_QP_WCG_PPS
      }
    #endif
    #if W0038_CQP_ADJ
      bool bChromaDeltaQPEnabled = false;
      {
        bChromaDeltaQPEnabled = ( m_sliceChromaQpOffsetIntraOrPeriodic[0] || m_sliceChromaQpOffsetIntraOrPeriodic[1] );
        if( !bChromaDeltaQPEnabled )
        {
          for( int i=0; i<m_iGOPSize; i++ )
          {
            if( m_GOPList[i].m_CbQPoffset || m_GOPList[i].m_CrQPoffset )
            {
              bChromaDeltaQPEnabled = true;
              break;
            }
          }
        }
      }
    
     #if ENABLE_QPA
      if ((getUsePerceptQPA() || getSliceChromaOffsetQpPeriodicity() > 0) && (getChromaFormatIdc() != CHROMA_400))
      {
        bChromaDeltaQPEnabled = true;
      }
     #endif
    
      pps.setSliceChromaQpFlag(bChromaDeltaQPEnabled);
    #endif
    
        !pps.getSliceChromaQpFlag() && sps.getUseDualITree()
    
        && (getChromaFormatIdc() != CHROMA_400))
    
        pps.setSliceChromaQpFlag(m_chromaCbQpOffsetDualTree != 0 || m_chromaCrQpOffsetDualTree != 0 || m_chromaCbCrQpOffsetDualTree != 0);
    
      int minCbSizeY = (1 << sps.getLog2MinCodingBlockSize());
      pps.setWrapAroundEnabledFlag                ( m_wrapAround );
      if( m_wrapAround )
      {
    
        pps.setPicWidthMinusWrapAroundOffset      ((pps.getPicWidthInLumaSamples()/minCbSizeY) - (m_wrapAroundOffset / minCbSizeY));
        pps.setWrapAroundOffset                   (minCbSizeY *(pps.getPicWidthInLumaSamples() / minCbSizeY- pps.getPicWidthMinusWrapAroundOffset()));
    
        pps.setPicWidthMinusWrapAroundOffset      ( 0 );
    
        pps.setWrapAroundOffset                   ( 0 );       
      }
      CHECK( !sps.getWrapAroundEnabledFlag() && pps.getWrapAroundEnabledFlag(), "When sps_ref_wraparound_enabled_flag is equal to 0, the value of pps_ref_wraparound_enabled_flag shall be equal to 0.");
      CHECK( (((sps.getCTUSize() / minCbSizeY) + 1) > ((pps.getPicWidthInLumaSamples() / minCbSizeY) - 1)) && pps.getWrapAroundEnabledFlag(), "When the value of CtbSizeY / MinCbSizeY + 1 is greater than pic_width_in_luma_samples / MinCbSizeY - 1, the value of pps_ref_wraparound_enabled_flag shall be equal to 0.");
    
      pps.setNoPicPartitionFlag( m_noPicPartitionFlag );
      if( m_noPicPartitionFlag == false )
      {
        pps.setLog2CtuSize( ceilLog2( sps.getCTUSize()) );
        pps.setNumExpTileColumns( (uint32_t) m_tileColumnWidth.size() );
        pps.setNumExpTileRows( (uint32_t) m_tileRowHeight.size() );
        pps.setTileColumnWidths( m_tileColumnWidth );
        pps.setTileRowHeights( m_tileRowHeight );
        pps.initTiles();
        pps.setRectSliceFlag( m_rectSliceFlag );
    
        if( m_rectSliceFlag )
    
          pps.setSingleSlicePerSubPicFlag(m_singleSlicePerSubPicFlag);
    
          pps.setNumSlicesInPic( m_numSlicesInPic );
          pps.setTileIdxDeltaPresentFlag( m_tileIdxDeltaPresentFlag );
          pps.setRectSlices( m_rectSlices );
    
        }
        else
        {
          pps.initRasterSliceMap( m_rasterSliceSize );
        }
    
        pps.initSubPic(sps);
    
        pps.setLoopFilterAcrossTilesEnabledFlag( m_bLFCrossTileBoundaryFlag );
        pps.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
      }
      else
      {
        pps.setLog2CtuSize( ceilLog2( sps.getCTUSize()) );
        pps.setNumExpTileColumns(1);
        pps.setNumExpTileRows(1);
        pps.addTileColumnWidth( pps.getPicWidthInCtu( ) );
        pps.addTileRowHeight( pps.getPicHeightInCtu( ) );
        pps.initTiles();
        pps.setRectSliceFlag( 1 );
        pps.setNumSlicesInPic( 1 );
        pps.initRectSlices( );
        pps.setTileIdxDeltaPresentFlag( 0 );
        pps.setSliceTileIdx( 0, 0 );
    
    Karsten Suehring's avatar
    Karsten Suehring committed
        pps.initSubPic(sps);
    
        pps.setLoopFilterAcrossTilesEnabledFlag( true );
        pps.setLoopFilterAcrossSlicesEnabledFlag( true );
      }
    
      pps.setUseWP( m_useWeightedPred );
      pps.setWPBiPred( m_useWeightedBiPred );
      pps.setOutputFlagPresentFlag( false );
    
    
    #if JVET_V0094_BILATERAL_FILTER
    
    Vadim Seregin's avatar
    Vadim Seregin committed
      pps.setUseBIF                ( m_BIF );
      pps.setBIFStrength           ( m_BIFStrength );
      pps.setBIFQPOffset           ( m_BIFQPOffset );
    #endif
    
    #if JVET_X0071_CHROMA_BILATERAL_FILTER
    
      pps.setUseChromaBIF          ( m_chromaBIF );
      pps.setChromaBIFStrength     ( m_chromaBIFStrength );
      pps.setChromaBIFQPOffset     ( m_chromaBIFQPOffset );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    
    
      if ( getDeblockingFilterMetric() )
      {
        pps.setDeblockingFilterOverrideEnabledFlag(true);
        pps.setPPSDeblockingFilterDisabledFlag(false);
      }
      else
      {
        pps.setDeblockingFilterOverrideEnabledFlag( !getLoopFilterOffsetInPPS() );
        pps.setPPSDeblockingFilterDisabledFlag( getLoopFilterDisable() );
      }
    
      if (! pps.getPPSDeblockingFilterDisabledFlag())
      {
        pps.setDeblockingFilterBetaOffsetDiv2( getLoopFilterBetaOffset() );
        pps.setDeblockingFilterTcOffsetDiv2( getLoopFilterTcOffset() );
    
        pps.setDeblockingFilterCbBetaOffsetDiv2( getLoopFilterCbBetaOffset() );
        pps.setDeblockingFilterCbTcOffsetDiv2( getLoopFilterCbTcOffset() );
        pps.setDeblockingFilterCrBetaOffsetDiv2( getLoopFilterCrBetaOffset() );
        pps.setDeblockingFilterCrTcOffsetDiv2( getLoopFilterCrTcOffset() );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if DB_PARAM_TID
        pps.setDeblockingFilterBetaOffsetDiv2(std::vector<int>(5,0));
        pps.setDeblockingFilterTcOffsetDiv2(std::vector<int>(5, 0));
    #else
    
        pps.setDeblockingFilterBetaOffsetDiv2(0);
        pps.setDeblockingFilterTcOffsetDiv2(0);