Skip to content
Snippets Groups Projects
EncLib.cpp 94.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Brian Heng's avatar
    Brian Heng committed
    #endif
    
        PPS *ptrPPS = ( ppsID < 0 ) ? m_ppsMap.getFirstPS() : m_ppsMap.getPS( ppsID );
        ptrPPS->setNumBricksInPic( (int)pcPicCurr->brickMap->bricks.size() );
    
    
        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;
      }
    
      if ( m_RCEnableRateControl )
      {
        m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
      }
    
      // compress GOP
    
      m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut,
                                false, false, snrCSC, m_printFrameMSE
        , false
      );
    
    #if JVET_O0756_CALCULATE_HDRMETRICS
    
      m_metricTime = m_cGOPEncoder.getMetricTime();
    
    
      if ( m_RCEnableRateControl )
      {
        m_cRateCtrl.destroyRCGOP();
      }
    
      iNumEncoded         = m_iNumPicRcvd;
      m_iNumPicRcvd       = 0;
      m_uiNumAllPicCoded += iNumEncoded;
    }
    
    
    /**------------------------------------------------
     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;
      }
    
    }
    
    
    #if JVET_N0278_FIXES
    bool EncLib::encodePrep( bool flush, PelStorage* pcPicYuvOrg, PelStorage* pcPicYuvTrueOrg, 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() );
    
    Brian Heng's avatar
    Brian Heng committed
    #if JVET_P1006_PICTURE_HEADER
            pcField->finalInit( *pSPS, *pPPS, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS );
    #else
    
            pcField->finalInit( *pSPS, *pPPS, m_apss, m_lmcsAPS, m_scalinglistAPS );
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
          }
    
          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 );
          }
        }
    
        if( m_iNumPicRcvd && ( ( flush&&fieldNum == 1 ) || ( m_iPOCLast / 2 ) == 0 || m_iNumPicRcvd == m_iGOPSize ) )
        {
          keepDoing = false;
        }
      }
    
      return keepDoing;
    }
    
    bool EncLib::encode( const InputColourSpaceConversion snrCSC, std::list<PelUnitBuf*>& rcListPicYuvRecOut, int& iNumEncoded, bool isTff )
    {
      iNumEncoded = 0;
    
      for( int fieldNum = 0; fieldNum < 2; fieldNum++ )
      {
        // compress GOP
        m_cGOPEncoder.compressGOP( m_iPOCLast, 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++;
    
        // go over all pictures in a GOP excluding the first IRAP
        if( m_picIdInGOP != m_iGOPSize && m_iPOCLast / 2 )
        {
          return true;
        }
    
        iNumEncoded += m_iNumPicRcvd;
        m_uiNumAllPicCoded += m_iNumPicRcvd;
        m_iNumPicRcvd = 0;
      }
    
      return false;
    }
    #else
    
    void EncLib::encode( bool flush, PelStorage* pcPicYuvOrg, PelStorage* pcPicYuvTrueOrg, const InputColourSpaceConversion snrCSC, std::list<PelUnitBuf*>& rcListPicYuvRecOut,
                         int& iNumEncoded, bool isTff )
    {
      iNumEncoded = 0;
    
      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());
    
    Brian Heng's avatar
    Brian Heng committed
    #if JVET_P1006_PICTURE_HEADER
            pcField->finalInit( *pSPS, *pPPS, &m_picHeader, m_apss, m_lmcsAPS, m_scalinglistAPS );
    #else
    
            pcField->finalInit( *pSPS, *pPPS, m_apss, m_lmcsAPS, m_scalinglistAPS );
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
          }
    
          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 );
          }
        }
    
        if ( m_iNumPicRcvd && ((flush&&fieldNum==1) || (m_iPOCLast/2)==0 || m_iNumPicRcvd==m_iGOPSize ) )
        {
          // compress GOP
    
          m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, true, isTff, snrCSC, m_printFrameMSE
                                  , false
          );
    
    #if JVET_O0756_CALCULATE_HDRMETRICS
    
          m_metricTime = m_cGOPEncoder.getMetricTime();
    
          iNumEncoded += m_iNumPicRcvd;
          m_uiNumAllPicCoded += m_iNumPicRcvd;
          m_iNumPicRcvd = 0;
        }
      }
    }
    
    
    // ====================================================================================================================
    // 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 )
    {
      // rotate he 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:
    
      if( m_cListPic.size() >= (uint32_t)( m_iGOPSize + getMaxDecPicBuffering( MAX_TLAYER - 1 ) + 2 ) )
    
        PicList::iterator iterPic = m_cListPic.begin();
    
        for( int i = 0; i < iSize; i++ )
    
    #if JVET_N0278_FIXES
          if( !rpcPic->referenced && rpcPic->layerId == m_layerId )
    
          else
          {
            rpcPic = nullptr;
          }
    #else
          if( !rpcPic->referenced )
    
          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 JVET_N0278_FIXES
    
        if( rpcPic && pps.getPPSId() != rpcPic->cs->pps->getPPSId() )
    
        if (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;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_N0278_FIXES
    
    Vadim Seregin's avatar
    Vadim Seregin committed
        rpcPic->create( sps.getChromaFormatIdc(), Size( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples() ), sps.getMaxCUWidth(), sps.getMaxCUWidth() + 16, false, m_layerId );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #else
    
        rpcPic->create( sps.getChromaFormatIdc(), Size( pps.getPicWidthInLumaSamples(), pps.getPicHeightInLumaSamples() ), sps.getMaxCUWidth(), sps.getMaxCUWidth() + 16, false );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
          rpcPic->M_BUFS( 0, PIC_ORIGINAL_INPUT ).create( sps.getChromaFormatIdc(), Area( Position(), Size( sps.getMaxPicWidthInLumaSamples(), sps.getMaxPicHeightInLumaSamples() ) ) );
          rpcPic->M_BUFS( 0, PIC_TRUE_ORIGINAL_INPUT ).create( sps.getChromaFormatIdc(), Area( Position(), Size( sps.getMaxPicWidthInLumaSamples(), sps.getMaxPicHeightInLumaSamples() ) ) );
    
    Brian Heng's avatar
    Brian Heng committed
    #if JVET_P1006_PICTURE_HEADER
          const uint32_t iMaxDQPLayer = m_picHeader.getCuQpDeltaSubdivIntra()/2+1;
    #else
    
          const uint32_t iMaxDQPLayer = pps.getCuQpDeltaSubdiv()/2+1;
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
          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(VPS &vps)
    {
      // The SPS must have already been set up.
      // set the VPS profile information.
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if !JVET_N0278_FIXES  
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
      for (uint32_t i = 0; i < vps.getMaxLayers(); i++)
      {
    
    Lidong Xu's avatar
    Lidong Xu committed
        vps.setVPSIncludedLayerId(0, i);
    
    void EncLib::xInitDPS(DPS &dps, const SPS &sps, const int dpsId)
    {
      // The SPS must have already been set up.
      // set the DPS profile information.
      dps.setDecodingParameterSetId(dpsId);
      dps.setMaxSubLayersMinus1(sps.getMaxTLayers()-1);
      dps.setProfileTierLevel(*sps.getProfileTierLevel());
    }
    
    
    
      ProfileTierLevel* profileTierLevel = sps.getProfileTierLevel();
      ConstraintInfo* cinfo = profileTierLevel->getConstraintInfo();
      cinfo->setProgressiveSourceFlag       (m_progressiveSourceFlag);
      cinfo->setInterlacedSourceFlag        (m_interlacedSourceFlag);
      cinfo->setNonPackedConstraintFlag     (m_nonPackedConstraintFlag);
      cinfo->setFrameOnlyConstraintFlag     (m_frameOnlyConstraintFlag);
      cinfo->setIntraOnlyConstraintFlag         (m_intraConstraintFlag);
      cinfo->setMaxBitDepthConstraintIdc    (m_maxBitDepthConstraintIdc);
      cinfo->setMaxChromaFormatConstraintIdc((ChromaFormat)m_maxChromaFormatConstraintIdc);
      cinfo->setNoQtbttDualTreeIntraConstraintFlag(m_bNoQtbttDualTreeIntraConstraintFlag);
    
      cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag);
    
      cinfo->setNoSaoConstraintFlag(m_bNoSaoConstraintFlag);
      cinfo->setNoAlfConstraintFlag(m_bNoAlfConstraintFlag);
      cinfo->setNoRefWraparoundConstraintFlag(m_bNoRefWraparoundConstraintFlag);
      cinfo->setNoTemporalMvpConstraintFlag(m_bNoTemporalMvpConstraintFlag);
      cinfo->setNoSbtmvpConstraintFlag(m_bNoSbtmvpConstraintFlag);
      cinfo->setNoAmvrConstraintFlag(m_bNoAmvrConstraintFlag);
      cinfo->setNoBdofConstraintFlag(m_bNoBdofConstraintFlag);
    
      cinfo->setNoDmvrConstraintFlag(m_noDmvrConstraintFlag);
    
      cinfo->setNoCclmConstraintFlag(m_bNoCclmConstraintFlag);
      cinfo->setNoMtsConstraintFlag(m_bNoMtsConstraintFlag);
    
      cinfo->setNoSbtConstraintFlag(m_noSbtConstraintFlag);
    
      cinfo->setNoAffineMotionConstraintFlag(m_bNoAffineMotionConstraintFlag);
      cinfo->setNoGbiConstraintFlag(m_bNoGbiConstraintFlag);
    
      cinfo->setNoIbcConstraintFlag(m_noIbcConstraintFlag);
    
      cinfo->setNoMhIntraConstraintFlag(m_bNoMhIntraConstraintFlag);
    
      cinfo->setNoFPelMmvdConstraintFlag(m_noFPelMmvdConstraintFlag);
    
      cinfo->setNoTriangleConstraintFlag(m_bNoTriangleConstraintFlag);
      cinfo->setNoLadfConstraintFlag(m_bNoLadfConstraintFlag);
    
      cinfo->setNoTransformSkipConstraintFlag(m_noTransformSkipConstraintFlag);
    
      cinfo->setNoBDPCMConstraintFlag(m_noBDPCMConstraintFlag);
    
      cinfo->setNoJointCbCrConstraintFlag(m_noJointCbCrConstraintFlag);
    
      cinfo->setNoQpDeltaConstraintFlag(m_bNoQpDeltaConstraintFlag);
      cinfo->setNoDepQuantConstraintFlag(m_bNoDepQuantConstraintFlag);
      cinfo->setNoSignDataHidingConstraintFlag(m_bNoSignDataHidingConstraintFlag);
    
    #if JVET_P0366_NUT_CONSTRAINT_FLAGS
      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);
    #endif
    
      profileTierLevel->setLevelIdc                    (m_level);
      profileTierLevel->setTierFlag                    (m_levelTier);
      profileTierLevel->setProfileIdc                  (m_profile);
    
      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.setMaxPicWidthInLumaSamples( m_iSourceWidth );
      sps.setMaxPicHeightInLumaSamples( m_iSourceHeight );
    
      sps.setMaxCUWidth             ( m_maxCUWidth        );
      sps.setMaxCUHeight            ( m_maxCUHeight       );
      sps.setMaxCodingDepth         ( m_maxTotalCUDepth   );
      sps.setChromaFormatIdc        ( m_chromaFormatIDC   );
      sps.setLog2DiffMaxMinCodingBlockSize(m_log2DiffMaxMinCodingBlockSize);
    
    
      sps.setCTUSize                             ( m_CTUSize );
      sps.setSplitConsOverrideEnabledFlag        ( m_useSplitConsOverride );
      sps.setMinQTSizes                          ( m_uiMinQT );
    
    Remy Foray's avatar
    Remy Foray committed
      sps.setMaxMTTHierarchyDepth                ( m_uiMaxMTTHierarchyDepth, m_uiMaxMTTHierarchyDepthI, m_uiMaxMTTHierarchyDepthIChroma );
    
    Xiang Li's avatar
    Xiang Li committed
      unsigned maxBtSize[3], maxTtSize[3];
      memcpy(maxBtSize, m_uiMinQT, sizeof(maxBtSize));
      memcpy(maxTtSize, m_uiMinQT, sizeof(maxTtSize));
    
    Remy Foray's avatar
    Remy Foray committed
      if (m_uiMaxMTTHierarchyDepth)
    
    Xiang Li's avatar
    Xiang Li committed
      {
        maxBtSize[1] = std::min(m_CTUSize, (unsigned)MAX_BT_SIZE_INTER);
        maxTtSize[1] = std::min(m_CTUSize, (unsigned)MAX_TT_SIZE_INTER);
      }
    
    Remy Foray's avatar
    Remy Foray committed
      if (m_uiMaxMTTHierarchyDepthI)
    
    Xiang Li's avatar
    Xiang Li committed
      {
        maxBtSize[0] = std::min(m_CTUSize, (unsigned)MAX_BT_SIZE);
        maxTtSize[0] = std::min(m_CTUSize, (unsigned)MAX_TT_SIZE);
      }
    
    Remy Foray's avatar
    Remy Foray committed
      if (m_uiMaxMTTHierarchyDepthIChroma)
    
    Xiang Li's avatar
    Xiang Li committed
      {
        maxBtSize[2] = std::min(m_CTUSize, (unsigned)MAX_BT_SIZE_C);
        maxTtSize[2] = std::min(m_CTUSize, (unsigned)MAX_TT_SIZE_C);
      }
      sps.setMaxBTSize                           ( maxBtSize[1], maxBtSize[0], maxBtSize[2] );
      sps.setMaxTTSize                           ( maxTtSize[1], maxTtSize[0], maxTtSize[2] );
    
      sps.setIDRRefParamListPresent              ( m_idrRefParamList );
    
      sps.setUseDualITree                        ( m_dualITree );
    
      sps.setUseLFNST                            ( m_LFNST );
    
      sps.setSBTMVPEnabledFlag                  ( m_SubPuMvpMode );
    
      sps.setAMVREnabledFlag                ( m_ImvMode != IMV_OFF );
    
      sps.setBDOFEnabledFlag                    ( m_BIO );
    
      sps.setUseAffine             ( m_Affine );
      sps.setUseAffineType         ( m_AffineType );
    
      sps.setUseLMChroma           ( m_LMChroma ? true : false );
    
    #if JVET_P0592_CHROMA_PHASE
      sps.setHorCollocatedChromaFlag( m_horCollocatedChromaFlag );
      sps.setVerCollocatedChromaFlag( m_verCollocatedChromaFlag );
    #else
    
      sps.setCclmCollocatedChromaFlag( m_cclmCollocatedChromaFlag );
    
      sps.setUseMTS                ( m_IntraMTS || m_InterMTS || m_ImplicitMTS );
      sps.setUseIntraMTS           ( m_IntraMTS );
      sps.setUseInterMTS           ( m_InterMTS );
    
        sps.setMaxSbtSize                       ( std::min((int)(1 << m_log2MaxTbSize), m_iSourceWidth >= 1920 ? 64 : 32) );
    
      sps.setUseSMVD                ( m_SMVD );
    
      sps.setUseGBi                ( m_GBi );
    
    #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
    
    
      sps.setUseMHIntra            ( m_MHIntra );
      sps.setUseTriangle           ( m_Triangle );
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
      sps.setUseMMVD               ( m_MMVD );
    
      sps.setFpelMmvdEnabledFlag   (( m_MMVD ) ? m_allowDisFracMMVD : false);
    
    #if JVET_P0314_PROF_BDOF_DMVR_HLS
      sps.setBdofControlPresentFlag(m_BIO);
      sps.setDmvrControlPresentFlag(m_DMVR);
      sps.setProfControlPresentFlag(m_PROF);
    #else
    
      sps.setBdofDmvrSlicePresentFlag(m_DMVR || m_BIO);
    
      sps.setAffineAmvrEnabledFlag              ( m_AffineAmvr );
    
      sps.setUseDMVR                            ( m_DMVR );
    
    #if JVET_P0517_ADAPTIVE_COLOR_TRANSFORM
    
      sps.setUseColorTrans(m_useColorTrans);
    #endif
    
    Yu Han's avatar
    Yu Han committed
      sps.setIBCFlag                            ( m_IBCMode);
    
      sps.setWrapAroundEnabledFlag                      ( m_wrapAround );
    
      sps.setWrapAroundOffset                   ( m_wrapAroundOffset );
    
      // ADD_NEW_TOOL : (encoder lib) set tool enabling flags and associated parameters here
    
      sps.setUseISP                             ( m_ISP );
    
    Taoran Lu's avatar
    Taoran Lu committed
      sps.setUseReshaper                        ( m_lumaReshapeEnable );
    
      sps.setUseMIP                ( m_MIP );
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      int minCUSize =  sps.getMaxCUWidth() >> sps.getLog2DiffMaxMinCodingBlockSize();
    
      int log2MinCUSize = 0;
      while(minCUSize > 1)
      {
        minCUSize >>= 1;
        log2MinCUSize++;
      }
    
      sps.setLog2MinCodingBlockSize(log2MinCUSize);
    
    #if JVET_P0578_MINIMUM_CU_SIZE_CONSTRAINT
      CHECK(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)");
    #endif
    
    #if JVET_P0347_MAX_MTT_DEPTH_CONSTRAINT
      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)");
    #endif
    
      sps.setTransformSkipEnabledFlag(m_useTransformSkip);
    
    #if JVET_P0059_CHROMA_BDPCM
      sps.setBDPCMEnabled(m_useBDPCM);
    #else
    
      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)));
    
    Hongtao Wang's avatar
    Hongtao Wang committed
        sps.setMinQpPrimeTsMinus4(ChannelType(channelType), (6 * (m_bitDepth[channelType] - m_inputBitDepth[channelType])));
    
      sps.setUseWP( m_useWeightedPred );
      sps.setUseWPBiPred( m_useWeightedBiPred );
    
    
      sps.setSAOEnabledFlag( m_bUseSAO );
    
      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 );
    
      sps.setALFEnabledFlag( m_alf );
    
      sps.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
    
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
      if (sps.getVuiParametersPresentFlag())
      {
        VUI* pcVUI = sps.getVuiParameters();
        pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag());
        pcVUI->setAspectRatioIdc(getAspectRatioIdc());
        pcVUI->setSarWidth(getSarWidth());
        pcVUI->setSarHeight(getSarHeight());
        pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag());
        pcVUI->setColourPrimaries(getColourPrimaries());
        pcVUI->setTransferCharacteristics(getTransferCharacteristics());
        pcVUI->setMatrixCoefficients(getMatrixCoefficients());
        pcVUI->setFieldSeqFlag(false);
        pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag());
        pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField());
        pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField());
        pcVUI->setChromaSampleLocType(getChromaSampleLocType());
        pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag());
        pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag());
        pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag());
        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
    #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
      int numQpTables = m_chromaQpMappingTableParams.getSameCQPTableForAllChromaFlag() ? 1 : (sps.getJointCbCrEnabledFlag() ? 3 : 2);
      m_chromaQpMappingTableParams.setNumQpTables(numQpTables);
    #endif
    
      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() )
      {
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
        sps.setHrdParametersPresentFlag( true );
    
      }
    
      // Set up SPS range extension settings
      sps.getSpsRangeExtension().setTransformSkipRotationEnabledFlag(m_transformSkipRotationEnabledFlag);
      sps.getSpsRangeExtension().setTransformSkipContextEnabledFlag(m_transformSkipContextEnabledFlag);
      for (uint32_t signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++)
      {
        sps.getSpsRangeExtension().setRdpcmEnabledFlag(RDPCMSignallingMode(signallingModeIndex), m_rdpcmEnabledFlag[signallingModeIndex]);
      }
      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);
    
      if( m_uiIntraPeriod < 0 )
      {
        sps.setRPL1CopyFromRPL0Flag( true );
      }
    
    
    #if JVET_P1006_PICTURE_HEADER
    
      sps.setNumSubPics(1);  // TODO: modify for subpicture support
      sps.setSubPicIdSignallingPresentFlag(false);
      sps.setSubPicIdLen(16);
      for(int picIdx=0; picIdx<MAX_NUM_SUB_PICS; picIdx++)
      {
        sps.setSubPicId(picIdx, picIdx);
      }
    
      sps.setLoopFilterAcrossVirtualBoundariesDisabledFlag( m_loopFilterAcrossVirtualBoundariesDisabledFlag );
      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 );
      }
    #endif
    
    
    #if JVET_P0590_SCALING_WINDOW
      sps.setRprEnabledFlag( m_rprEnabled );
    #endif
    
      m_encHRD.initHRDParameters((EncCfg*) this);
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
      HRDParameters *hrdParams = sps.getHrdParameters();
      *hrdParams = m_encHRD.getHRDParameters();
    
      TimingInfo *timingInfo = sps.getTimingInfo();
      *timingInfo = m_encHRD.getTimingInfo();
    
    }
    
    void EncLib::xInitPPS(PPS &pps, const SPS &sps)
    {
      // pps ID already initialised.
      pps.setSPSId(sps.getSPSId());
    
    
      pps.setConstantSliceHeaderParamsEnabledFlag(getConstantSliceHeaderParamsEnabledFlag());
      pps.setPPSDepQuantEnabledIdc(getPPSDepQuantEnabledIdc());
      pps.setPPSRefPicListSPSIdc0(getPPSRefPicListSPSIdc0());
      pps.setPPSRefPicListSPSIdc1(getPPSRefPicListSPSIdc1());
    
    #if !JVET_P0206_TMVP_flags
    
      pps.setPPSTemporalMVPEnabledIdc(getPPSTemporalMVPEnabledIdc());
    
      pps.setPPSMvdL1ZeroIdc(getPPSMvdL1ZeroIdc());
      pps.setPPSCollocatedFromL0Idc(getPPSCollocatedFromL0Idc());
      pps.setPPSSixMinusMaxNumMergeCandPlus1(getPPSSixMinusMaxNumMergeCandPlus1());
    
    #if !JVET_P0152_REMOVE_PPS_NUM_SUBBLOCK_MERGE_CAND
    
      pps.setPPSFiveMinusMaxNumSubblockMergeCandPlus1(getPPSFiveMinusMaxNumSubblockMergeCandPlus1());
    
      pps.setPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1());
    
    
    Brian Heng's avatar
    Brian Heng committed
    #if JVET_P1006_PICTURE_HEADER
      pps.setNumSubPics(sps.getNumSubPics());
      pps.setSubPicIdSignallingPresentFlag(false);
      pps.setSubPicIdLen(sps.getSubPicIdLen());
      for(int picIdx=0; picIdx<pps.getNumSubPics(); picIdx++)
      {
        pps.setSubPicId(picIdx, sps.getSubPicId(picIdx));
      }
    #endif
    
      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);
    
    Brian Heng's avatar
    Brian Heng committed
    #if !JVET_P1006_PICTURE_HEADER
    
        pps.setCuQpDeltaSubdiv( 0 );
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
    Brian Heng's avatar
    Brian Heng committed
    #if !JVET_P1006_PICTURE_HEADER
    
        pps.setCuQpDeltaSubdiv( m_cuQpDeltaSubdiv );
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
    Brian Heng's avatar
    Brian Heng committed
    #if !JVET_P1006_PICTURE_HEADER
    
        pps.setCuQpDeltaSubdiv( 0 );
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
      if ( m_cuChromaQpOffsetSubdiv >= 0 )
      {
    
    Brian Heng's avatar
    Brian Heng committed
    #if !JVET_P1006_PICTURE_HEADER
    
        pps.setCuChromaQpOffsetSubdiv(m_cuChromaQpOffsetSubdiv);
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
        pps.clearChromaQpOffsetList();
        pps.setChromaQpOffsetListEntry(1, 6, 6, 6);
    
        /* todo, insert table entries from command line (NB, 0 should not be touched) */
      }
      else
      {
    
    Brian Heng's avatar
    Brian Heng committed
    #if !JVET_P1006_PICTURE_HEADER
    
        pps.setCuChromaQpOffsetSubdiv(0);
    
    Brian Heng's avatar
    Brian Heng committed
    #endif
    
        pps.clearChromaQpOffsetList();
    
      }
      pps.getPpsRangeExtension().setCrossComponentPredictionEnabledFlag(m_crossComponentPredictionEnabledFlag);
      pps.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_LUMA,   m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA  ]);
      pps.getPpsRangeExtension().setLog2SaoOffsetScale(CHANNEL_TYPE_CHROMA, m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA]);
    
      {
        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 ) ));
      }
    
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
    #if JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
      if (sps.getJointCbCrEnabledFlag() == false || getChromaFormatIdc() == CHROMA_400)
      {
        pps.setJointCbCrQpOffsetPresentFlag(false);
      }
      else
      {
        pps.setJointCbCrQpOffsetPresentFlag(true);
      }
    #endif
    
    
    #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 JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
        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
    
        pps.setQpOffset(JOINT_CbCr,   Clip3( -12, 12, ( min(0, cbQP) + min(0, crQP) ) / 2 + m_chromaCbCrQpOffset));
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
    #endif
    
      }
      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 JVET_P0667_QP_OFFSET_TABLE_SIGNALING_JCCR
      if (pps.getJointCbCrQpOffsetPresentFlag())
        pps.setQpOffset(JOINT_CbCr, m_chromaCbCrQpOffset);
      else
        pps.setQpOffset(JOINT_CbCr, 0);
    #else
    
      pps.setQpOffset(JOINT_CbCr, m_chromaCbCrQpOffset );
    
    U-EU\bray's avatar
    v1  
    U-EU\bray committed
    #endif
    
    #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);
    
      }
    
      pps.setEntropyCodingSyncEnabledFlag( m_entropyCodingSyncEnabledFlag );
    
    #if JVET_P1004_REMOVE_BRICKS
      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.setNumSlicesInPic( m_numSlicesInPic );
          pps.setTileIdxDeltaPresentFlag( m_tileIdxDeltaPresentFlag );
          pps.setRectSlices( m_rectSlices );
          pps.initRectSliceMap( );
        }
        else
        {
          pps.initRasterSliceMap( m_rasterSliceSize );
        }
        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 );
        pps.initRectSliceMap( );
        pps.setLoopFilterAcrossTilesEnabledFlag( true );
        pps.setLoopFilterAcrossSlicesEnabledFlag( true );
      }
    #else
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      pps.setSingleTileInPicFlag((m_iNumColumnsMinus1 == 0 && m_iNumRowsMinus1 == 0));
    
    #endif
    
      pps.setUseWP( m_useWeightedPred );
      pps.setWPBiPred( m_useWeightedBiPred );
      pps.setOutputFlagPresentFlag( false );
    
      if ( getDeblockingFilterMetric() )
      {
        pps.setDeblockingFilterOverrideEnabledFlag(true);
        pps.setPPSDeblockingFilterDisabledFlag(false);
      }
      else
      {
        pps.setDeblockingFilterOverrideEnabledFlag( !getLoopFilterOffsetInPPS() );
        pps.setPPSDeblockingFilterDisabledFlag( getLoopFilterDisable() );
      }
    
      if (! pps.getPPSDeblockingFilterDisabledFlag())
      {
        pps.setDeblockingFilterBetaOffsetDiv2( getLoopFilterBetaOffset() );
        pps.setDeblockingFilterTcOffsetDiv2( getLoopFilterTcOffset() );
      }
      else
      {
        pps.setDeblockingFilterBetaOffsetDiv2(0);
        pps.setDeblockingFilterTcOffsetDiv2(0);
      }
    
      // deblockingFilterControlPresentFlag is true if any of the settings differ from the inferred values:
      const bool deblockingFilterControlPresentFlag = pps.getDeblockingFilterOverrideEnabledFlag() ||
                                                      pps.getPPSDeblockingFilterDisabledFlag()     ||
                                                      pps.getDeblockingFilterBetaOffsetDiv2() != 0 ||
                                                      pps.getDeblockingFilterTcOffsetDiv2() != 0;
    
      pps.setDeblockingFilterControlPresentFlag(deblockingFilterControlPresentFlag);
    
      pps.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
      pps.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
    
    
      int histogram[MAX_NUM_REF + 1];
      for( int i = 0; i <= MAX_NUM_REF; i++ )
      {
        histogram[i]=0;
      }
      for( int i = 0; i < getGOPSize(); i++)
      {
    
    Hendry's avatar
    Hendry committed
        CHECK(!(getRPLEntry(0, i).m_numRefPicsActive >= 0 && getRPLEntry(0, i).m_numRefPicsActive <= MAX_NUM_REF), "Unspecified error");
        histogram[getRPLEntry(0, i).m_numRefPicsActive]++;
    
      }
    
      int maxHist=-1;
      int bestPos=0;
      for( int i = 0; i <= MAX_NUM_REF; i++ )
      {
        if(histogram[i]>maxHist)
        {
          maxHist=histogram[i];
          bestPos=i;
        }
      }
      CHECK(!(bestPos <= 15), "Unspecified error");
    
        pps.setNumRefIdxL0DefaultActive(bestPos);
    
      pps.setNumRefIdxL1DefaultActive(bestPos);
      pps.setTransquantBypassEnabledFlag(getTransquantBypassEnabledFlag());
    
      pps.setLog2MaxTransformSkipBlockSize(m_log2MaxTransformSkipBlockSize);
    
    #if !JVET_P1004_REMOVE_BRICKS
    
    #endif
    
    Brian Heng's avatar
    Brian Heng committed
    #if JVET_P1006_PICTURE_HEADER
      pps.setPictureHeaderExtensionPresentFlag(false);
    #else
    
      pps.setLoopFilterAcrossVirtualBoundariesDisabledFlag( m_loopFilterAcrossVirtualBoundariesDisabledFlag );
      pps.setNumVerVirtualBoundaries            ( m_numVerVirtualBoundaries );
      pps.setNumHorVirtualBoundaries            ( m_numHorVirtualBoundaries );