Skip to content
Snippets Groups Projects
EncAppCfg.cpp 258 KiB
Newer Older
  • Learn to ignore specific revisions
  • Hendry's avatar
    Hendry committed
            {
              //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
              int offGOP = (checkGOP - 1 + offset) % m_iGOPSize;
              int offPOC = ((checkGOP - 1 + offset) / m_iGOPSize)*(m_iGOPSize * multipleFactor) + m_RPLList0[offGOP].m_POC;
              if (offPOC >= 0 && m_RPLList0[offGOP].m_temporalId <= m_RPLList0[curGOP].m_temporalId)
              {
                bool newRef = false;
                for (int i = 0; i<(newRefs0 + newRefs1); i++)
                {
                  if (refList[i] == offPOC)
                  {
                    newRef = true;
                  }
                }
                for (int i = 0; i<newRefs0; i++)
                {
                  if (m_RPLList0[m_iGOPSize + extraRPLs].m_deltaRefPics[i] == curPOC - offPOC)
                  {
                    newRef = false;
                  }
                }
                if (newRef)
                {
                  int insertPoint = newRefs0;
                  //this picture can be added, find appropriate place in list and insert it.
                  if (m_RPLList0[offGOP].m_temporalId == m_RPLList0[curGOP].m_temporalId)
                  {
                    m_RPLList0[offGOP].m_refPic = true;
                  }
                  for (int j = 0; j<newRefs0; j++)
                  {
                    if (m_RPLList0[m_iGOPSize + extraRPLs].m_deltaRefPics[j] > curPOC - offPOC && curPOC - offPOC > 0)
                    {
                      insertPoint = j;
                      break;
                    }
                  }
                  int prev = curPOC - offPOC;
                  for (int j = insertPoint; j<newRefs0 + 1; j++)
                  {
                    int newPrev = m_RPLList0[m_iGOPSize + extraRPLs].m_deltaRefPics[j];
                    m_RPLList0[m_iGOPSize + extraRPLs].m_deltaRefPics[j] = prev;
                    prev = newPrev;
                  }
                  newRefs0++;
                }
              }
              if (newRefs0 >= numPrefRefs0)
              {
                break;
              }
            }
    
            for (int offset = -1; offset>-checkGOP; offset--)
            {
              //step backwards in coding order and include any extra available pictures we might find useful to replace the ones with POC < 0.
              int offGOP = (checkGOP - 1 + offset) % m_iGOPSize;
              int offPOC = ((checkGOP - 1 + offset) / m_iGOPSize)*(m_iGOPSize * multipleFactor) + m_RPLList1[offGOP].m_POC;
              if (offPOC >= 0 && m_RPLList1[offGOP].m_temporalId <= m_RPLList1[curGOP].m_temporalId)
              {
                bool newRef = false;
                for (int i = 0; i<(newRefs0 + newRefs1); i++)
                {
                  if (refList[i] == offPOC)
                  {
                    newRef = true;
                  }
                }
                for (int i = 0; i<newRefs1; i++)
                {
                  if (m_RPLList1[m_iGOPSize + extraRPLs].m_deltaRefPics[i] == curPOC - offPOC)
                  {
                    newRef = false;
                  }
                }
                if (newRef)
                {
                  int insertPoint = newRefs1;
                  //this picture can be added, find appropriate place in list and insert it.
                  if (m_RPLList1[offGOP].m_temporalId == m_RPLList1[curGOP].m_temporalId)
                  {
                    m_RPLList1[offGOP].m_refPic = true;
                  }
                  for (int j = 0; j<newRefs1; j++)
                  {
                    if (m_RPLList1[m_iGOPSize + extraRPLs].m_deltaRefPics[j] > curPOC - offPOC && curPOC - offPOC > 0)
                    {
                      insertPoint = j;
                      break;
                    }
                  }
                  int prev = curPOC - offPOC;
                  for (int j = insertPoint; j<newRefs1 + 1; j++)
                  {
                    int newPrev = m_RPLList1[m_iGOPSize + extraRPLs].m_deltaRefPics[j];
                    m_RPLList1[m_iGOPSize + extraRPLs].m_deltaRefPics[j] = prev;
                    prev = newPrev;
                  }
                  newRefs1++;
                }
              }
              if (newRefs1 >= numPrefRefs1)
              {
                break;
              }
            }
    
            m_RPLList0[m_iGOPSize + extraRPLs].m_numRefPics = newRefs0;
            m_RPLList0[m_iGOPSize + extraRPLs].m_numRefPicsActive = min(m_RPLList0[m_iGOPSize + extraRPLs].m_numRefPics, m_RPLList0[m_iGOPSize + extraRPLs].m_numRefPicsActive);
            m_RPLList1[m_iGOPSize + extraRPLs].m_numRefPics = newRefs1;
            m_RPLList1[m_iGOPSize + extraRPLs].m_numRefPicsActive = min(m_RPLList1[m_iGOPSize + extraRPLs].m_numRefPics, m_RPLList1[m_iGOPSize + extraRPLs].m_numRefPicsActive);
            curGOP = m_iGOPSize + extraRPLs;
            extraRPLs++;
          }
          numRefs = 0;
          for (int i = 0; i< m_RPLList0[curGOP].m_numRefPics; i++)
          {
            int absPOC = curPOC - m_RPLList0[curGOP].m_deltaRefPics[i];
            if (absPOC >= 0)
            {
              refList[numRefs] = absPOC;
              numRefs++;
            }
          }
          for (int i = 0; i< m_RPLList1[curGOP].m_numRefPics; i++)
          {
            int absPOC = curPOC - m_RPLList1[curGOP].m_deltaRefPics[i];
            if (absPOC >= 0)
            {
              bool alreadyExist = false;
              for (int j = 0; !alreadyExist && j < numRefs; j++)
              {
                if (refList[j] == absPOC)
                {
                  alreadyExist = true;
                }
              }
              if (!alreadyExist)
              {
                refList[numRefs] = absPOC;
                numRefs++;
              }
            }
          }
          refList[numRefs] = curPOC;
          numRefs++;
        }
        checkGOP++;
      }
      xConfirmPara(errorGOP, "Invalid GOP structure given");
    
    
      for(int i=0; i<m_iGOPSize; i++)
      {
        if(m_GOPList[i].m_temporalId >= m_maxTempLayer)
        {
          m_maxTempLayer = m_GOPList[i].m_temporalId+1;
        }
        xConfirmPara(m_GOPList[i].m_sliceType!='B' && m_GOPList[i].m_sliceType!='P' && m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
      }
      for(int i=0; i<MAX_TLAYER; i++)
      {
        m_numReorderPics[i] = 0;
        m_maxDecPicBuffering[i] = 1;
      }
      for(int i=0; i<m_iGOPSize; i++)
      {
    
    Hendry's avatar
    Hendry committed
        int numRefPic = m_RPLList0[i].m_numRefPics;
        for (int tmp = 0; tmp < m_RPLList1[i].m_numRefPics; tmp++)
        {
          bool notSame = true;
          for (int jj = 0; notSame && jj < m_RPLList0[i].m_numRefPics; jj++)
          {
            if (m_RPLList1[i].m_deltaRefPics[tmp] == m_RPLList0[i].m_deltaRefPics[jj]) notSame = false;
          }
          if (notSame) numRefPic++;
        }
        if (numRefPic + 1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
        {
          m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = numRefPic + 1;
        }
    
        int highestDecodingNumberWithLowerPOC = 0;
        for(int j=0; j<m_iGOPSize; j++)
        {
          if(m_GOPList[j].m_POC <= m_GOPList[i].m_POC)
          {
            highestDecodingNumberWithLowerPOC = j;
          }
        }
        int numReorder = 0;
        for(int j=0; j<highestDecodingNumberWithLowerPOC; j++)
        {
          if(m_GOPList[j].m_temporalId <= m_GOPList[i].m_temporalId &&
            m_GOPList[j].m_POC > m_GOPList[i].m_POC)
          {
            numReorder++;
          }
        }
        if(numReorder > m_numReorderPics[m_GOPList[i].m_temporalId])
        {
          m_numReorderPics[m_GOPList[i].m_temporalId] = numReorder;
        }
      }
    
      for(int i=0; i<MAX_TLAYER-1; i++)
      {
        // a lower layer can not have higher value of m_numReorderPics than a higher layer
        if(m_numReorderPics[i+1] < m_numReorderPics[i])
        {
          m_numReorderPics[i+1] = m_numReorderPics[i];
        }
        // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] - 1, inclusive
        if(m_numReorderPics[i] > m_maxDecPicBuffering[i] - 1)
        {
          m_maxDecPicBuffering[i] = m_numReorderPics[i] + 1;
        }
        // a lower layer can not have higher value of m_uiMaxDecPicBuffering than a higher layer
        if(m_maxDecPicBuffering[i+1] < m_maxDecPicBuffering[i])
        {
          m_maxDecPicBuffering[i+1] = m_maxDecPicBuffering[i];
        }
      }
    
      // the value of num_reorder_pics[ i ] shall be in the range of 0 to max_dec_pic_buffering[ i ] -  1, inclusive
      if(m_numReorderPics[MAX_TLAYER-1] > m_maxDecPicBuffering[MAX_TLAYER-1] - 1)
      {
        m_maxDecPicBuffering[MAX_TLAYER-1] = m_numReorderPics[MAX_TLAYER-1] + 1;
      }
    
    
      if( m_picPartitionFlag ) 
      {
        PPS pps;
        uint32_t colIdx, rowIdx;
        uint32_t remSize;
     
        pps.setPicWidthInLumaSamples( m_iSourceWidth );
        pps.setPicHeightInLumaSamples( m_iSourceHeight );
        pps.setLog2CtuSize( floorLog2(m_uiCTUSize) );
    
        // set default tile column if not provided
        if( m_tileColumnWidth.size() == 0 ) 
        {
          m_tileColumnWidth.push_back( pps.getPicWidthInCtu() );
        }
        // set default tile row if not provided
        if( m_tileRowHeight.size() == 0 ) 
        {
          m_tileRowHeight.push_back( pps.getPicHeightInCtu() );
        }
    
        // remove any tile columns that can be specified implicitly
        while( m_tileColumnWidth.size() > 1 && m_tileColumnWidth.end()[-1] == m_tileColumnWidth.end()[-2] )
        {
          m_tileColumnWidth.pop_back();
        }
    
        // remove any tile rows that can be specified implicitly
        while( m_tileRowHeight.size() > 1 && m_tileRowHeight.end()[-1] == m_tileRowHeight.end()[-2] )
        {
          m_tileRowHeight.pop_back();
        }
    
        // setup tiles in temporary PPS structure
        remSize = pps.getPicWidthInCtu();
        for( colIdx=0; remSize > 0 && colIdx<m_tileColumnWidth.size(); colIdx++ )
        {
          xConfirmPara(m_tileColumnWidth[ colIdx ] == 0, "Tile column widths cannot be equal to 0");
          m_tileColumnWidth[ colIdx ] = std::min( remSize, m_tileColumnWidth[ colIdx ]);
          pps.addTileColumnWidth( m_tileColumnWidth[ colIdx ] );
          remSize -= m_tileColumnWidth[ colIdx ];
        }
        m_tileColumnWidth.resize( colIdx );
        pps.setNumExpTileColumns( (uint32_t)m_tileColumnWidth.size() );    
        remSize = pps.getPicHeightInCtu();
        for( rowIdx=0; remSize > 0 && rowIdx<m_tileRowHeight.size(); rowIdx++ )
        {
          xConfirmPara(m_tileRowHeight[ rowIdx ] == 0, "Tile row heights cannot be equal to 0");
          m_tileRowHeight[ rowIdx ] = std::min( remSize, m_tileRowHeight[ rowIdx ]);
          pps.addTileRowHeight( m_tileRowHeight[ rowIdx ] );
          remSize -= m_tileRowHeight[ rowIdx ];
        }
        m_tileRowHeight.resize( rowIdx );
        pps.setNumExpTileRows( (uint32_t)m_tileRowHeight.size() );
        pps.initTiles();
        xConfirmPara(pps.getNumTileColumns() > getMaxTileColsByLevel( m_level ), "Number of tile columns exceeds maximum number allowed according to specified level");
        xConfirmPara(pps.getNumTileRows()    > getMaxTileRowsByLevel( m_level ), "Number of tile rows exceeds maximum number allowed according to specified level");
        m_numTileCols = pps.getNumTileColumns();
        m_numTileRows = pps.getNumTileRows();
    
        // rectangular slices
        if( !m_rasterSliceFlag )
        {
          uint32_t sliceIdx;
          bool     needTileIdxDelta = false;
    
          // generate slice list for the simplified fixed-rectangular-slice-size config option
          if( m_rectSliceFixedWidth > 0 && m_rectSliceFixedHeight > 0 )
          {
            int tileIdx = 0;
            m_rectSlicePos.clear();
            while( tileIdx < pps.getNumTiles() ) 
            {
              uint32_t startTileX = tileIdx % pps.getNumTileColumns();
              uint32_t startTileY = tileIdx / pps.getNumTileColumns();
              uint32_t startCtuX  = pps.getTileColumnBd( startTileX );
              uint32_t startCtuY  = pps.getTileRowBd( startTileY );
              uint32_t stopCtuX   = (startTileX + m_rectSliceFixedWidth)  >= pps.getNumTileColumns() ? pps.getPicWidthInCtu() - 1  : pps.getTileColumnBd( startTileX + m_rectSliceFixedWidth ) - 1;
              uint32_t stopCtuY   = (startTileY + m_rectSliceFixedHeight) >= pps.getNumTileRows()    ? pps.getPicHeightInCtu() - 1 : pps.getTileRowBd( startTileY + m_rectSliceFixedHeight ) - 1;
              uint32_t stopTileX  = pps.ctuToTileCol( stopCtuX );
              uint32_t stopTileY  = pps.ctuToTileRow( stopCtuY );
              
              // add rectangular slice to list
              m_rectSlicePos.push_back( startCtuY * pps.getPicWidthInCtu() + startCtuX );          
              m_rectSlicePos.push_back( stopCtuY  * pps.getPicWidthInCtu() + stopCtuX  );
              
              // get slice size in tiles
              uint32_t sliceWidth  = stopTileX - startTileX + 1;
              uint32_t sliceHeight = stopTileY - startTileY + 1;
    
              // move to next tile in raster scan order
              tileIdx += sliceWidth;
              if( tileIdx % pps.getNumTileColumns() == 0 )
              {
                tileIdx += (sliceHeight - 1) * pps.getNumTileColumns();
              }
            }
          }
    
          xConfirmPara( m_rectSlicePos.size() & 1, "Odd number of rectangular slice positions provided. Rectangular slice positions must be specified in pairs of (top-left / bottom-right) raster-scan CTU addresses.");
          
          // set default slice size if not provided
          if( m_rectSlicePos.size() == 0 ) 
          {
            m_rectSlicePos.push_back( 0 );
            m_rectSlicePos.push_back( pps.getPicWidthInCtu() * pps.getPicHeightInCtu() - 1 );
          }
          pps.setNumSlicesInPic( (uint32_t)(m_rectSlicePos.size() >> 1) );
          xConfirmPara(pps.getNumSlicesInPic() > getMaxSlicesByLevel( m_level ), "Number of rectangular slices exceeds maximum number allowed according to specified level");
          pps.initRectSlices();
    
          // set slice parameters from CTU addresses
          for( sliceIdx = 0; sliceIdx < pps.getNumSlicesInPic(); sliceIdx++ )
          {
            xConfirmPara( m_rectSlicePos[2*sliceIdx]     >= pps.getPicWidthInCtu() * pps.getPicHeightInCtu(), "Rectangular slice position exceeds total number of CTU in picture.");
            xConfirmPara( m_rectSlicePos[2*sliceIdx + 1] >= pps.getPicWidthInCtu() * pps.getPicHeightInCtu(), "Rectangular slice position exceeds total number of CTU in picture.");
    
            // map raster scan CTU address to X/Y position
            uint32_t startCtuX = m_rectSlicePos[2*sliceIdx]     % pps.getPicWidthInCtu();
            uint32_t startCtuY = m_rectSlicePos[2*sliceIdx]     / pps.getPicWidthInCtu();
            uint32_t stopCtuX  = m_rectSlicePos[2*sliceIdx + 1] % pps.getPicWidthInCtu();
            uint32_t stopCtuY  = m_rectSlicePos[2*sliceIdx + 1] / pps.getPicWidthInCtu();
            
            // get corresponding tile index
            uint32_t startTileX = pps.ctuToTileCol( startCtuX );
            uint32_t startTileY = pps.ctuToTileRow( startCtuY );
            uint32_t stopTileX  = pps.ctuToTileCol( stopCtuX );
            uint32_t stopTileY  = pps.ctuToTileRow( stopCtuY );
            uint32_t tileIdx    = startTileY * pps.getNumTileColumns() + startTileX;
    
            // get slice size in tiles
            uint32_t sliceWidth  = stopTileX - startTileX + 1;
            uint32_t sliceHeight = stopTileY - startTileY + 1;
            
            // check for slice / tile alignment
            xConfirmPara( startCtuX != pps.getTileColumnBd( startTileX ), "Rectangular slice position does not align with a left tile edge.");
            xConfirmPara( stopCtuX  != (pps.getTileColumnBd( stopTileX + 1 ) - 1), "Rectangular slice position does not align with a right tile edge.");
            if( sliceWidth > 1 || sliceHeight > 1 )
            {
              xConfirmPara( startCtuY != pps.getTileRowBd( startTileY ), "Rectangular slice position does not align with a top tile edge.");
              xConfirmPara( stopCtuY  != (pps.getTileRowBd( stopTileY + 1 ) - 1), "Rectangular slice position does not align with a bottom tile edge.");
            }
    
            // set slice size and tile index
            pps.setSliceWidthInTiles( sliceIdx, sliceWidth );
            pps.setSliceHeightInTiles( sliceIdx, sliceHeight );
            pps.setSliceTileIdx( sliceIdx, tileIdx );
            if( sliceIdx > 0 && !needTileIdxDelta )
            {
              uint32_t lastTileIdx = pps.getSliceTileIdx( sliceIdx-1 );
              lastTileIdx += pps.getSliceWidthInTiles( sliceIdx-1 );
              if( lastTileIdx % pps.getNumTileColumns() == 0)
              {
                lastTileIdx += (pps.getSliceHeightInTiles( sliceIdx-1 ) - 1) * pps.getNumTileColumns();
              }
              if( lastTileIdx != tileIdx )
              {
                needTileIdxDelta = true;
              }
            }
    
            // special case for multiple slices within a single tile
            if( sliceWidth == 1 && sliceHeight == 1 )
            {
              uint32_t firstSliceIdx = sliceIdx;
              uint32_t numSlicesInTile = 1;
              pps.setSliceHeightInCtu( sliceIdx, stopCtuY - startCtuY + 1 );
              
              while( sliceIdx < pps.getNumSlicesInPic()-1 ) 
              {
                uint32_t nextTileIdx;
                startCtuX   = m_rectSlicePos[2*(sliceIdx+1)]     % pps.getPicWidthInCtu();
                startCtuY   = m_rectSlicePos[2*(sliceIdx+1)]     / pps.getPicWidthInCtu();
                stopCtuX    = m_rectSlicePos[2*(sliceIdx+1) + 1] % pps.getPicWidthInCtu();
                stopCtuY    = m_rectSlicePos[2*(sliceIdx+1) + 1] / pps.getPicWidthInCtu();          
                startTileX  = pps.ctuToTileCol( startCtuX );
                startTileY  = pps.ctuToTileRow( startCtuY );
                stopTileX   = pps.ctuToTileCol( stopCtuX );
                stopTileY   = pps.ctuToTileRow( stopCtuY );
                nextTileIdx = startTileY * pps.getNumTileColumns() + startTileX;
                sliceWidth  = stopTileX - startTileX + 1;
                sliceHeight = stopTileY - startTileY + 1;
                if(nextTileIdx != tileIdx || sliceWidth != 1 || sliceHeight != 1) 
                {
                  break;
                }
                numSlicesInTile++;
                sliceIdx++;
                pps.setSliceWidthInTiles( sliceIdx, 1 );
                pps.setSliceHeightInTiles( sliceIdx, 1 );
                pps.setSliceTileIdx( sliceIdx, tileIdx );    
                pps.setSliceHeightInCtu( sliceIdx, stopCtuY - startCtuY + 1 );
              }
              pps.setNumSlicesInTile( firstSliceIdx, numSlicesInTile );
            }
          }
          pps.setTileIdxDeltaPresentFlag( needTileIdxDelta );
          m_tileIdxDeltaPresentFlag = needTileIdxDelta;
          
          // check rectangular slice mapping and full picture CTU coverage
          pps.initRectSliceMap();
    
          // store rectangular slice parameters from temporary PPS structure
          m_numSlicesInPic = pps.getNumSlicesInPic();
          m_rectSlices.resize( pps.getNumSlicesInPic() );
          for( sliceIdx = 0; sliceIdx < pps.getNumSlicesInPic(); sliceIdx++ )
          {
            m_rectSlices[sliceIdx].setSliceWidthInTiles( pps.getSliceWidthInTiles(sliceIdx) );
            m_rectSlices[sliceIdx].setSliceHeightInTiles( pps.getSliceHeightInTiles(sliceIdx) );
            m_rectSlices[sliceIdx].setNumSlicesInTile( pps.getNumSlicesInTile(sliceIdx) );
            m_rectSlices[sliceIdx].setSliceHeightInCtu( pps.getSliceHeightInCtu(sliceIdx) );
            m_rectSlices[sliceIdx].setTileIdx( pps.getSliceTileIdx(sliceIdx) );
          }
        }
        // raster-scan slices
        else
        {
          uint32_t listIdx = 0;
          uint32_t remTiles = pps.getNumTiles();
    
          // set default slice size if not provided
          if( m_rasterSliceSize.size() == 0 ) 
          {
            m_rasterSliceSize.push_back( remTiles );
          }
    
          // set raster slice sizes
          while( remTiles > 0 )
          {
            // truncate if size exceeds number of remaining tiles
            if( listIdx < m_rasterSliceSize.size() )
            {
              m_rasterSliceSize[listIdx] = std::min( remTiles, m_rasterSliceSize[listIdx] );
              remTiles -= m_rasterSliceSize[listIdx];
            }
            // replicate last size uniformly as needed to cover the remainder of the picture
            else
            {
              m_rasterSliceSize.push_back( std::min( remTiles, m_rasterSliceSize.back() ) );
              remTiles -= m_rasterSliceSize.back();
            }
            listIdx++;
          }
          // shrink list if too many sizes were provided
          m_rasterSliceSize.resize( listIdx );
          
          m_numSlicesInPic = (uint32_t)m_rasterSliceSize.size();
          xConfirmPara(m_rasterSliceSize.size() > getMaxSlicesByLevel( m_level ), "Number of raster-scan slices exceeds maximum number allowed according to specified level");
        }
      }
      else 
      {
        m_numTileCols = 1;
        m_numTileRows = 1;
        m_numSlicesInPic = 1;
      }
    
      if ((m_MCTSEncConstraint) && (!m_disableLFCrossTileBoundaryFlag))
    
    Valeri George's avatar
    Valeri George committed
      {
        printf("Warning: Constrained Encoding for Motion Constrained Tile Sets (MCTS) is enabled. Disabling filtering across tile boundaries!\n");
    
        m_disableLFCrossTileBoundaryFlag = true;
    
    Valeri George's avatar
    Valeri George committed
      }
      if ((m_MCTSEncConstraint) && (m_TMVPModeId))
      {
        printf("Warning: Constrained Encoding for Motion Constrained Tile Sets (MCTS) is enabled. Disabling TMVP!\n");
        m_TMVPModeId = 0;
      }
    
      if ((m_MCTSEncConstraint) && ( m_alf ))
      {
        printf("Warning: Constrained Encoding for Motion Constrained Tile Sets (MCTS) is enabled. Disabling ALF!\n");
        m_alf = false;
      }
      if( ( m_MCTSEncConstraint ) && ( m_BIO ) )
      {
        printf( "Warning: Constrained Encoding for Motion Constrained Tile Sets (MCTS) is enabled. Disabling BIO!\n" );
        m_BIO = false;
      }
    
    #if !JVET_Q0482_REMOVE_CONSTANT_PARAMS
    
      // If m_PPSorSliceFlag is equal to 1, for each PPS parameter below,
      //     0:  value is signaled in slice header
      //     >0: value is derived from PPS parameter as value - 1
      switch (m_PPSorSliceMode)
      {
      case 0: // All parameter values are signaled in slice header
        m_constantSliceHeaderParamsEnabledFlag = 0;
        m_PPSDepQuantEnabledIdc = 0;
        m_PPSRefPicListSPSIdc0 = 0;
        m_PPSRefPicListSPSIdc1 = 0;
        m_PPSMvdL1ZeroIdc = 0;
        m_PPSCollocatedFromL0Idc = 0;
        m_PPSSixMinusMaxNumMergeCandPlus1 = 0;
    
        m_PPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1 = 0;
    
    #else
        m_PPSMaxNumMergeCandMinusMaxNumGeoCandPlus1 = 0;
    #endif
    
        break;
      case 1: // RA setting
        m_constantSliceHeaderParamsEnabledFlag = 1;
    
        m_PPSDepQuantEnabledIdc = (m_depQuantEnabledFlag ? 1 : 0) + 1;
    
        m_PPSRefPicListSPSIdc0 = 0;
        m_PPSRefPicListSPSIdc1 = 0;
    
        m_PPSSixMinusMaxNumMergeCandPlus1 = 6 - m_maxNumMergeCand + 1;
    
        m_PPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1 = m_maxNumMergeCand - m_maxNumTriangleCand + 1;
    
    #else
        m_PPSMaxNumMergeCandMinusMaxNumGeoCandPlus1 = m_maxNumMergeCand - m_maxNumGeoCand + 1;
    #endif
    
        break;
      case 2: // LDB setting
        m_constantSliceHeaderParamsEnabledFlag = 1;
    
        m_PPSDepQuantEnabledIdc = (m_depQuantEnabledFlag ? 1 : 0) + 1;
    
        m_PPSRefPicListSPSIdc0 = 2;
        m_PPSRefPicListSPSIdc1 = 2;
        m_PPSMvdL1ZeroIdc = 2;
        m_PPSCollocatedFromL0Idc = 1;
    
        m_PPSSixMinusMaxNumMergeCandPlus1 = 6 - m_maxNumMergeCand + 1;
    
        m_PPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1 = m_maxNumMergeCand - m_maxNumTriangleCand + 1;
    
    #else
        m_PPSMaxNumMergeCandMinusMaxNumGeoCandPlus1 = m_maxNumMergeCand - m_maxNumGeoCand + 1;
    #endif
    
        break;
      case 3: // LDP setting
        m_constantSliceHeaderParamsEnabledFlag = 1;
    
        m_PPSDepQuantEnabledIdc = (m_depQuantEnabledFlag ? 1 : 0) + 1;
    
        m_PPSRefPicListSPSIdc0 = 2;
        m_PPSRefPicListSPSIdc1 = 2;
        m_PPSMvdL1ZeroIdc = 0;
        m_PPSCollocatedFromL0Idc = 0;
    
        m_PPSSixMinusMaxNumMergeCandPlus1 = 6 - m_maxNumMergeCand + 1;
    
        m_PPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1 = 0;
    
    #else
        m_PPSMaxNumMergeCandMinusMaxNumGeoCandPlus1 = 0;
    #endif
    
        break;
      default:
        THROW("Invalid value for PPSorSliceMode");
      }
    
      xConfirmPara(m_drapPeriod > 0 && m_PPSRefPicListSPSIdc0 > 0, "PPSRefPicListSPSIdc0 shall be 0 when DRAP is used. This can be fixed by setting PPSorSliceMode=0.");
      xConfirmPara(m_drapPeriod > 0 && m_PPSRefPicListSPSIdc1 > 0, "PPSRefPicListSPSIdc1 shall be 0 when DRAP is used. This can be fixed by setting PPSorSliceMode=0.");
    
      xConfirmPara( m_sariAspectRatioIdc < 0 || m_sariAspectRatioIdc > 255, "SEISARISampleAspectRatioIdc must be in the range of 0 to 255");
    
      if ( m_RCEnableRateControl )
      {
        if ( m_RCForceIntraQP )
        {
          if ( m_RCInitialQP == 0 )
          {
            msg( WARNING, "\nInitial QP for rate control is not specified. Reset not to use force intra QP!" );
            m_RCForceIntraQP = false;
          }
        }
        xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
    #if U0132_TARGET_BITS_SATURATION
        if ((m_RCCpbSaturationEnabled) && (m_level!=Level::NONE) && (m_profile!=Profile::NONE))
        {
          uint32_t uiLevelIdx = (m_level / 10) + (uint32_t)((m_level % 10) / 3);    // (m_level / 30)*3 + ((m_level % 10) / 3);
          xConfirmPara(m_RCCpbSize > g_uiMaxCpbSize[m_levelTier][uiLevelIdx], "RCCpbSize should be smaller than or equal to Max CPB size according to tier and level");
          xConfirmPara(m_RCInitialCpbFullness > 1, "RCInitialCpbFullness should be smaller than or equal to 1");
        }
    #endif
      }
    #if U0132_TARGET_BITS_SATURATION
      else
      {
        xConfirmPara( m_RCCpbSaturationEnabled != 0, "Target bits saturation cannot be processed without Rate control" );
      }
    #endif
    
      if (m_framePackingSEIEnabled)
      {
        xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
      }
    
      if( m_erpSEIEnabled && !m_erpSEICancelFlag )
      {
        xConfirmPara( m_erpSEIGuardBandType < 0 || m_erpSEIGuardBandType > 8, "SEIEquirectangularprojectionGuardBandType must be in the range of 0 to 7");
        xConfirmPara( (m_chromaFormatIDC == CHROMA_420 || m_chromaFormatIDC == CHROMA_422) && (m_erpSEILeftGuardBandWidth%2 == 1), "SEIEquirectangularprojectionLeftGuardBandWidth must be an even number for 4:2:0 or 4:2:2 chroma format");
        xConfirmPara( (m_chromaFormatIDC == CHROMA_420 || m_chromaFormatIDC == CHROMA_422) && (m_erpSEIRightGuardBandWidth%2 == 1), "SEIEquirectangularprojectionRightGuardBandWidth must be an even number for 4:2:0 or 4:2:2 chroma format");
      }
    
      if( m_sphereRotationSEIEnabled && !m_sphereRotationSEICancelFlag )
      {
        xConfirmPara( m_sphereRotationSEIYaw  < -(180<<16) || m_sphereRotationSEIYaw > (180<<16)-1, "SEISphereRotationYaw must be in the range of -11 796 480 to 11 796 479");
        xConfirmPara( m_sphereRotationSEIPitch < -(90<<16) || m_sphereRotationSEIYaw > (90<<16),    "SEISphereRotationPitch must be in the range of -5 898 240 to 5 898 240");
        xConfirmPara( m_sphereRotationSEIRoll < -(180<<16) || m_sphereRotationSEIYaw > (180<<16)-1, "SEISphereRotationRoll must be in the range of -11 796 480 to 11 796 479");
      }
    
      if ( m_omniViewportSEIEnabled && !m_omniViewportSEICancelFlag )
      {
        xConfirmPara( m_omniViewportSEIId < 0 || m_omniViewportSEIId > 1023, "SEIomniViewportId must be in the range of 0 to 1023");
        xConfirmPara( m_omniViewportSEICntMinus1 < 0 || m_omniViewportSEICntMinus1 > 15, "SEIomniViewportCntMinus1 must be in the range of 0 to 15");
        for ( uint32_t i=0; i<=m_omniViewportSEICntMinus1; i++ )
        {
          xConfirmPara( m_omniViewportSEIAzimuthCentre[i] < -(180<<16)  || m_omniViewportSEIAzimuthCentre[i] > (180<<16)-1, "SEIOmniViewportAzimuthCentre must be in the range of -11 796 480 to 11 796 479");
          xConfirmPara( m_omniViewportSEIElevationCentre[i] < -(90<<16) || m_omniViewportSEIElevationCentre[i] > (90<<16),  "SEIOmniViewportSEIElevationCentre must be in the range of -5 898 240 to 5 898 240");
          xConfirmPara( m_omniViewportSEITiltCentre[i] < -(180<<16)     || m_omniViewportSEITiltCentre[i] > (180<<16)-1,    "SEIOmniViewportTiltCentre must be in the range of -11 796 480 to 11 796 479");
          xConfirmPara( m_omniViewportSEIHorRange[i] < 1 || m_omniViewportSEIHorRange[i] > (360<<16), "SEIOmniViewportHorRange must be in the range of 1 to 360*2^16");
          xConfirmPara( m_omniViewportSEIVerRange[i] < 1 || m_omniViewportSEIVerRange[i] > (180<<16), "SEIOmniViewportVerRange must be in the range of 1 to 180*2^16");
        }
      }
    
    
      if (m_gcmpSEIEnabled && !m_gcmpSEICancelFlag)
      {
        xConfirmPara( m_gcmpSEIMappingFunctionType < 0 || m_gcmpSEIMappingFunctionType > 2, "SEIGcmpMappingFunctionType must be in the range of 0 to 2");
        int numFace = m_gcmpSEIPackingType == 4 || m_gcmpSEIPackingType == 5 ? 5 : 6;
        for ( int i = 0; i < numFace; i++ )
        {
          xConfirmPara( m_gcmpSEIFaceIndex[i] < 0 || m_gcmpSEIFaceIndex[i] > 5,       "SEIGcmpFaceIndex must be in the range of 0 to 5");
          xConfirmPara( m_gcmpSEIFaceRotation[i] < 0 || m_gcmpSEIFaceRotation[i] > 3, "SEIGcmpFaceRotation must be in the range of 0 to 3");
          if (m_gcmpSEIMappingFunctionType == 2)
          {
            xConfirmPara( m_gcmpSEIFunctionCoeffU[i] <= 0.0 || m_gcmpSEIFunctionCoeffU[i] > 1.0, "SEIGcmpFunctionCoeffU must be in the range (0, 1]");
            xConfirmPara( m_gcmpSEIFunctionCoeffV[i] <= 0.0 || m_gcmpSEIFunctionCoeffV[i] > 1.0, "SEIGcmpFunctionCoeffV must be in the range (0, 1]");
          }
        }
        if (m_gcmpSEIGuardBandFlag)
        {
          xConfirmPara( m_gcmpSEIGuardBandSamplesMinus1 < 0 || m_gcmpSEIGuardBandSamplesMinus1 > 15, "SEIGcmpGuardBandSamplesMinus1 must be in the range of 0 to 15");
        }
      }
    
    #if JVET_Q0297_MER
      xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
    #endif
    
    #if U0033_ALTERNATIVE_TRANSFER_CHARACTERISTICS_SEI
      xConfirmPara(m_preferredTransferCharacteristics > 255, "transfer_characteristics_idc should not be greater than 255.");
    #endif
    
      xConfirmPara( unsigned(m_ImvMode) > 1, "ImvMode exceeds range (0 to 1)" );
    
      xConfirmPara( m_decodeBitstreams[0] == m_bitstreamFileName, "Debug bitstream and the output bitstream cannot be equal.\n" );
      xConfirmPara( m_decodeBitstreams[1] == m_bitstreamFileName, "Decode2 bitstream and the output bitstream cannot be equal.\n" );
      xConfirmPara(unsigned(m_LMChroma) > 1, "LMMode exceeds range (0 to 1)");
    
      if (m_gopBasedTemporalFilterEnabled)
      {
        xConfirmPara(m_temporalSubsampleRatio != 1, "GOP Based Temporal Filter only support Temporal sub-sample ratio 1");
      }
    
    #if EXTENSION_360_VIDEO
      check_failed |= m_ext360.verifyParameters();
    #endif
    
    
    #if !JVET_Q0089_SLICE_LOSSLESS_CODING_CHROMA_BDPCM
    
      xConfirmPara(m_useBDPCM < 0 || m_useBDPCM > 2, "BDPCM must be in range 0..2");
    
    #if JVET_Q0820_ACT
      xConfirmPara(m_useColorTrans && (m_log2MaxTbSize == 6), "Log2MaxTbSize must be less than 6 when ACT is enabled, otherwise ACT needs to be disabled");
    #endif
    
    #undef xConfirmPara
      return check_failed;
    }
    
    const char *profileToString(const Profile::Name profile)
    {
      static const uint32_t numberOfProfiles = sizeof(strToProfile)/sizeof(*strToProfile);
    
      for (uint32_t profileIndex = 0; profileIndex < numberOfProfiles; profileIndex++)
      {
        if (strToProfile[profileIndex].value == profile)
        {
          return strToProfile[profileIndex].str;
        }
      }
    
      //if we get here, we didn't find this profile in the list - so there is an error
      EXIT( "ERROR: Unknown profile \"" << profile << "\" in profileToString" );
      return "";
    }
    
    void EncAppCfg::xPrintParameter()
    {
      //msg( DETAILS, "\n" );
      msg( DETAILS, "Input          File                    : %s\n", m_inputFileName.c_str() );
      msg( DETAILS, "Bitstream      File                    : %s\n", m_bitstreamFileName.c_str() );
      msg( DETAILS, "Reconstruction File                    : %s\n", m_reconFileName.c_str() );
      msg( DETAILS, "Real     Format                        : %dx%d %gHz\n", m_iSourceWidth - m_confWinLeft - m_confWinRight, m_iSourceHeight - m_confWinTop - m_confWinBottom, (double)m_iFrameRate / m_temporalSubsampleRatio );
      msg( DETAILS, "Internal Format                        : %dx%d %gHz\n", m_iSourceWidth, m_iSourceHeight, (double)m_iFrameRate / m_temporalSubsampleRatio );
      msg( DETAILS, "Sequence PSNR output                   : %s\n", ( m_printMSEBasedSequencePSNR ? "Linear average, MSE-based" : "Linear average only" ) );
    
      msg( DETAILS, "Hexadecimal PSNR output                : %s\n", ( m_printHexPsnr ? "Enabled" : "Disabled" ) );
    
      msg( DETAILS, "Sequence MSE output                    : %s\n", ( m_printSequenceMSE ? "Enabled" : "Disabled" ) );
      msg( DETAILS, "Frame MSE output                       : %s\n", ( m_printFrameMSE ? "Enabled" : "Disabled" ) );
      msg( DETAILS, "Cabac-zero-word-padding                : %s\n", ( m_cabacZeroWordPaddingEnabled ? "Enabled" : "Disabled" ) );
      if (m_isField)
      {
        msg( DETAILS, "Frame/Field                            : Field based coding\n" );
        msg( DETAILS, "Field index                            : %u - %d (%d fields)\n", m_FrameSkip, m_FrameSkip + m_framesToBeEncoded - 1, m_framesToBeEncoded );
        msg( DETAILS, "Field Order                            : %s field first\n", m_isTopFieldFirst ? "Top" : "Bottom" );
    
      }
      else
      {
        msg( DETAILS, "Frame/Field                            : Frame based coding\n" );
        msg( DETAILS, "Frame index                            : %u - %d (%d frames)\n", m_FrameSkip, m_FrameSkip + m_framesToBeEncoded - 1, m_framesToBeEncoded );
      }
      {
        msg( DETAILS, "Profile                                : %s\n", profileToString(m_profile) );
      }
    
    #if JVET_Q0468_Q0469_MIN_LUMA_CB_AND_MIN_QT_FIX
      msg(DETAILS, "CTU size / min CU size                 : %d / %d \n", m_uiMaxCUWidth, 1 << m_log2MinCuSize);
    #else
    
      msg( DETAILS, "CU size / depth / total-depth          : %d / %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth, m_uiMaxCodingDepth );
    
    #if JVET_Q0119_CLEANUPS
      msg(DETAILS, "subpicture info present flag                       : %d\n", m_subPicInfoPresentFlag);
      if (m_subPicInfoPresentFlag)
    #else
    
      msg(DETAILS, "subpicture present flag                            : %d\n", m_subPicPresentFlag);
    
        msg(DETAILS, "number of subpictures                            : %d\n", m_numSubPics);
    
          msg(DETAILS, "[%d]th subpictures location                           :[%d %d]\n", i, m_subPicCtuTopLeftX[i], m_subPicCtuTopLeftY[i]);
          msg(DETAILS, "[%d]th subpictures size                           :[%d %d]\n", i, m_subPicWidth[i], m_subPicHeight[i]);
    
          msg(DETAILS, "[%d]th subpictures treated as picture flag                           :%d\n", i, m_subPicTreatedAsPicFlag[i]);
          msg(DETAILS, "loop filter cross [%d]th subpictures enabled flag                           :%d\n", i, m_loopFilterAcrossSubpicEnabledFlag[i]);
    
      msg(DETAILS, "subpicture ID present flag                            : %d\n", m_subPicIdMappingExplicitlySignalledFlag);
      if (m_subPicIdMappingExplicitlySignalledFlag)
    
      {
        msg(DETAILS, "subpicture ID signalling present flag                            : %d\n", m_subPicIdMappingInSpsFlag);
    #else
    
      msg(DETAILS, "subpicture ID present flag                            : %d\n", m_subPicIdPresentFlag);
    
        msg(DETAILS, "subpicture ID signalling present flag                            : %d\n", m_subPicIdSignallingPresentFlag);
    
          msg(DETAILS, "[%d]th subpictures ID length                           :%d\n", i, m_subPicIdLen);
    
          msg(DETAILS, "[%d]th subpictures ID                          :%d\n", i, m_subPicId[i]);
    
      msg( DETAILS, "Max TB size                            : %d \n", 1 << m_log2MaxTbSize );
    
      msg( DETAILS, "Motion search range                    : %d\n", m_iSearchRange );
      msg( DETAILS, "Intra period                           : %d\n", m_iIntraPeriod );
      msg( DETAILS, "Decoding refresh type                  : %d\n", m_iDecodingRefreshType );
    
      msg( DETAILS, "DRAP period                            : %d\n", m_drapPeriod );
    
    #if QP_SWITCHING_FOR_PARALLEL
      if (m_qpIncrementAtSourceFrame.bPresent)
      {
        msg( DETAILS, "QP                                     : %d (incrementing internal QP at source frame %d)\n", m_iQP, m_qpIncrementAtSourceFrame.value);
      }
      else
      {
        msg( DETAILS, "QP                                     : %d\n", m_iQP);
      }
    #else
      msg( DETAILS, "QP                                     : %5.2f\n", m_fQP );
    #endif
    
      msg( DETAILS, "Max dQP signaling subdiv               : %d\n", m_cuQpDeltaSubdiv);
    
    
      msg( DETAILS, "Cb QP Offset (dual tree)               : %d (%d)\n", m_cbQpOffset, m_cbQpOffsetDualTree);
      msg( DETAILS, "Cr QP Offset (dual tree)               : %d (%d)\n", m_crQpOffset, m_crQpOffsetDualTree);
      msg( DETAILS, "QP adaptation                          : %d (range=%d)\n", m_bUseAdaptiveQP, (m_bUseAdaptiveQP ? m_iQPAdaptationRange : 0) );
      msg( DETAILS, "GOP size                               : %d\n", m_iGOPSize );
      msg( DETAILS, "Input bit depth                        : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] );
      msg( DETAILS, "MSB-extended bit depth                 : (Y:%d, C:%d)\n", m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA], m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] );
      msg( DETAILS, "Internal bit depth                     : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
      msg( DETAILS, "Intra reference smoothing              : %s\n", (m_enableIntraReferenceSmoothing           ? "Enabled" : "Disabled") );
    
      msg( DETAILS, "cu_chroma_qp_offset_subdiv             : %d\n", m_cuChromaQpOffsetSubdiv);
    
      msg( DETAILS, "extended_precision_processing_flag     : %s\n", (m_extendedPrecisionProcessingFlag         ? "Enabled" : "Disabled") );
      msg( DETAILS, "implicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_IMPLICIT] ? "Enabled" : "Disabled") );
      msg( DETAILS, "explicit_rdpcm_enabled_flag            : %s\n", (m_rdpcmEnabledFlag[RDPCM_SIGNAL_EXPLICIT] ? "Enabled" : "Disabled") );
      msg( DETAILS, "transform_skip_rotation_enabled_flag   : %s\n", (m_transformSkipRotationEnabledFlag        ? "Enabled" : "Disabled") );
      msg( DETAILS, "transform_skip_context_enabled_flag    : %s\n", (m_transformSkipContextEnabledFlag         ? "Enabled" : "Disabled") );
    
      msg( DETAILS, "cross_component_prediction_enabled_flag: %s\n", (m_crossComponentPredictionEnabledFlag     ? (m_reconBasedCrossCPredictionEstimate ? "Enabled (reconstructed-residual-based estimate)" : "Enabled (encoder-side-residual-based estimate)") : "Disabled") );
    
      msg( DETAILS, "high_precision_offsets_enabled_flag    : %s\n", (m_highPrecisionOffsetsEnabledFlag         ? "Enabled" : "Disabled") );
      msg( DETAILS, "persistent_rice_adaptation_enabled_flag: %s\n", (m_persistentRiceAdaptationEnabledFlag     ? "Enabled" : "Disabled") );
      msg( DETAILS, "cabac_bypass_alignment_enabled_flag    : %s\n", (m_cabacBypassAlignmentEnabledFlag         ? "Enabled" : "Disabled") );
    
    #if !JVET_Q0441_SAO_MOD_12_BIT
    
      if (m_bUseSAO)
      {
        msg( DETAILS, "log2_sao_offset_scale_luma             : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_LUMA] );
        msg( DETAILS, "log2_sao_offset_scale_chroma           : %d\n", m_log2SaoOffsetScale[CHANNEL_TYPE_CHROMA] );
      }
    
    
      switch (m_costMode)
      {
        case COST_STANDARD_LOSSY:               msg( DETAILS, "Cost function:                         : Lossy coding (default)\n"); break;
        case COST_SEQUENCE_LEVEL_LOSSLESS:      msg( DETAILS, "Cost function:                         : Sequence_level_lossless coding\n"); break;
        case COST_LOSSLESS_CODING:              msg( DETAILS, "Cost function:                         : Lossless coding with fixed QP of %d\n", LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP); break;
        case COST_MIXED_LOSSLESS_LOSSY_CODING:  msg( DETAILS, "Cost function:                         : Mixed_lossless_lossy coding with QP'=%d for lossless evaluation\n", LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME); break;
        default:                                msg( DETAILS, "Cost function:                         : Unknown\n"); break;
      }
    
      msg( DETAILS, "RateControl                            : %d\n", m_RCEnableRateControl );
    
      msg( DETAILS, "WeightedPredMethod                     : %d\n", int(m_weightedPredictionMethod));
    
    
      if(m_RCEnableRateControl)
      {
        msg( DETAILS, "TargetBitrate                          : %d\n", m_RCTargetBitrate );
        msg( DETAILS, "KeepHierarchicalBit                    : %d\n", m_RCKeepHierarchicalBit );
        msg( DETAILS, "LCULevelRC                             : %d\n", m_RCLCULevelRC );
        msg( DETAILS, "UseLCUSeparateModel                    : %d\n", m_RCUseLCUSeparateModel );
        msg( DETAILS, "InitialQP                              : %d\n", m_RCInitialQP );
        msg( DETAILS, "ForceIntraQP                           : %d\n", m_RCForceIntraQP );
    #if U0132_TARGET_BITS_SATURATION
        msg( DETAILS, "CpbSaturation                          : %d\n", m_RCCpbSaturationEnabled );
        if (m_RCCpbSaturationEnabled)
        {
          msg( DETAILS, "CpbSize                                : %d\n", m_RCCpbSize);
          msg( DETAILS, "InitalCpbFullness                      : %.2f\n", m_RCInitialCpbFullness);
        }
    #endif
      }
    
      msg( DETAILS, "Max Num Merge Candidates               : %d\n", m_maxNumMergeCand );
    
      msg( DETAILS, "Max Num Affine Merge Candidates        : %d\n", m_maxNumAffineMergeCand );
    
      msg( DETAILS, "Max Num Triangle Merge Candidates      : %d\n", m_maxNumTriangleCand );
    
    #else
      msg( DETAILS, "Max Num Geo Merge Candidates           : %d\n", m_maxNumGeoCand );
    #endif
    
    Yan Zhang's avatar
    Yan Zhang committed
      msg( DETAILS, "Max Num IBC Merge Candidates           : %d\n", m_maxNumIBCMergeCand );
    
      msg( DETAILS, "\n");
    
      msg( VERBOSE, "TOOL CFG: ");
      msg( VERBOSE, "IBD:%d ", ((m_internalBitDepth[CHANNEL_TYPE_LUMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA]) || (m_internalBitDepth[CHANNEL_TYPE_CHROMA] > m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA])));
      msg( VERBOSE, "HAD:%d ", m_bUseHADME                          );
      msg( VERBOSE, "RDQ:%d ", m_useRDOQ                            );
      msg( VERBOSE, "RDQTS:%d ", m_useRDOQTS                        );
      msg( VERBOSE, "RDpenalty:%d ", m_rdPenalty                    );
    #if SHARP_LUMA_DELTA_QP
      msg( VERBOSE, "LQP:%d ", m_lumaLevelToDeltaQPMapping.mode     );
    #endif
      msg( VERBOSE, "SQP:%d ", m_uiDeltaQpRD                        );
      msg( VERBOSE, "ASR:%d ", m_bUseASR                            );
      msg( VERBOSE, "MinSearchWindow:%d ", m_minSearchWindow        );
      msg( VERBOSE, "RestrictMESampling:%d ", m_bRestrictMESampling );
      msg( VERBOSE, "FEN:%d ", int(m_fastInterSearchMode)           );
      msg( VERBOSE, "ECU:%d ", m_bUseEarlyCU                        );
      msg( VERBOSE, "FDM:%d ", m_useFastDecisionForMerge            );
      msg( VERBOSE, "CFM:%d ", m_bUseCbfFastMode                    );
      msg( VERBOSE, "ESD:%d ", m_useEarlySkipDetection              );
      msg( VERBOSE, "TransformSkip:%d ",     m_useTransformSkip     );
      msg( VERBOSE, "TransformSkipFast:%d ", m_useTransformSkipFast );
      msg( VERBOSE, "TransformSkipLog2MaxSize:%d ", m_log2MaxTransformSkipBlockSize);
    
      msg(VERBOSE, "ChromaTS:%d ", m_useChromaTS);
    
      msg( VERBOSE, "BDPCM:%d ", m_useBDPCM                         );
    
      msg( VERBOSE, "Tiles: %dx%d ", m_numTileCols, m_numTileRows );
      msg( VERBOSE, "Slices: %d ", m_numSlicesInPic);
    
      msg( VERBOSE, "MCTS:%d ", m_MCTSEncConstraint );
    
      msg( VERBOSE, "SAO:%d ", (m_bUseSAO)?(1):(0));
      msg( VERBOSE, "ALF:%d ", m_alf ? 1 : 0 );
    
    #if JVET_Q0795_CCALF
      msg( VERBOSE, "CCALF:%d ", m_ccalf ? 1 : 0 );
    #endif
    
    
      msg( VERBOSE, "WPP:%d ", (int)m_useWeightedPred);
      msg( VERBOSE, "WPB:%d ", (int)m_useWeightedBiPred);
    
    #if JVET_Q0297_MER
      msg( VERBOSE, "PME:%d ", m_log2ParallelMergeLevel);
    #endif
    
      const int iWaveFrontSubstreams = m_entropyCodingSyncEnabledFlag ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
      msg( VERBOSE, " WaveFrontSynchro:%d WaveFrontSubstreams:%d", m_entropyCodingSyncEnabledFlag?1:0, iWaveFrontSubstreams);
      msg( VERBOSE, " ScalingList:%d ", m_useScalingListId );
    
      msg( VERBOSE, "TMVPMode:%d ", m_TMVPModeId );
    
      msg( VERBOSE, " DQ:%d ", m_depQuantEnabledFlag);
      msg( VERBOSE, " SignBitHidingFlag:%d ", m_signDataHidingEnabledFlag);
      msg( VERBOSE, "RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
    
      {
    
        msg( VERBOSE, "\nTOOL CFG: " );
    
        msg( VERBOSE, "LFNST:%d ", m_LFNST );
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
        msg( VERBOSE, "MMVD:%d ", m_MMVD);
    
        msg( VERBOSE, "Affine:%d ", m_Affine );
        if ( m_Affine )
        {
          msg( VERBOSE, "AffineType:%d ", m_AffineType );
        }
    
        msg(VERBOSE, "SubPuMvp:%d+%d ", m_SubPuMvpMode & 1, (m_SubPuMvpMode & 2) == 2);
    
    Karsten Suehring's avatar
    Karsten Suehring committed
        msg( VERBOSE, "DualITree:%d ", m_dualTree );
    
        msg( VERBOSE, "BIO:%d ", m_BIO );
    
        msg( VERBOSE, "HorCollocatedChroma:%d ", m_horCollocatedChromaFlag );
        msg( VERBOSE, "VerCollocatedChroma:%d ", m_verCollocatedChromaFlag );
    
    Tung Nguyen's avatar
    Tung Nguyen committed
        msg( VERBOSE, "MTS: %1d(intra) %1d(inter) ", m_MTS & 1, ( m_MTS >> 1 ) & 1 );
    
        msg( VERBOSE, "SBT:%d ", m_SBT );
    
        msg( VERBOSE, "ISP:%d ", m_ISP );
    
        msg( VERBOSE, "SMVD:%d ", m_SMVD );
    
    Tung Nguyen's avatar
    Tung Nguyen committed
        msg( VERBOSE, "CompositeLTReference:%d ", m_compositeRefEnabled);
    
        msg( VERBOSE, "Bcw:%d ", m_bcw );
        msg( VERBOSE, "BcwFast:%d ", m_BcwFast );
    
    #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
        msg( VERBOSE, "LADF:%d ", m_LadfEnabed );
    
        msg(VERBOSE, "CIIP:%d ", m_ciip);
    
        msg( VERBOSE, "Triangle:%d ", m_Triangle );
    
    #else
        msg( VERBOSE, "Geo:%d ", m_Geo );
    #endif
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
        m_allowDisFracMMVD = m_MMVD ? m_allowDisFracMMVD : false;
        if ( m_MMVD )
          msg(VERBOSE, "AllowDisFracMMVD:%d ", m_allowDisFracMMVD);
    
        msg( VERBOSE, "AffineAmvr:%d ", m_AffineAmvr );
    
        m_AffineAmvrEncOpt = m_AffineAmvr ? m_AffineAmvrEncOpt : false;
        msg( VERBOSE, "AffineAmvrEncOpt:%d ", m_AffineAmvrEncOpt );
    
        msg(VERBOSE, "DMVR:%d ", m_DMVR);
    
        msg(VERBOSE, "MmvdDisNum:%d ", m_MmvdDisNum);
    
        msg(VERBOSE, "JointCbCr:%d ", m_JointCbCrMode);
    
    #if JVET_Q0820_ACT
      m_useColorTrans = (m_chromaFormatIDC == CHROMA_444) ? m_useColorTrans : 0u;
    #else
    
      m_useColorTrans = (m_chromaFormatIDC == CHROMA_444 && m_costMode != COST_LOSSLESS_CODING) ? m_useColorTrans : 0u;
    
      msg(VERBOSE, "ACT:%d ", m_useColorTrans);
    
    #if !JVET_Q0504_PLT_NON444
    
        m_PLTMode = ( m_chromaFormatIDC == CHROMA_444) ? m_PLTMode : 0u;
    
    Yu Han's avatar
    Yu Han committed
        msg(VERBOSE, "IBC:%d ", m_IBCMode);
    
      msg( VERBOSE, "HashME:%d ", m_HashME );
    
      msg( VERBOSE, "WrapAround:%d ", m_wrapAround);
      if( m_wrapAround )
    
    Philippe Hanhart's avatar
    Philippe Hanhart committed
      {
    
        msg( VERBOSE, "WrapAroundOffset:%d ", m_wrapAroundOffset );
    
    Philippe Hanhart's avatar
    Philippe Hanhart committed
      }
    
      // ADD_NEW_TOOL (add some output indicating the usage of tools)
    
    #if JVET_Q0246_VIRTUAL_BOUNDARY_ENABLE_FLAG 
      msg( VERBOSE, "VirtualBoundariesEnabledFlag:%d ", m_virtualBoundariesEnabledFlag );
      msg( VERBOSE, "VirtualBoundariesPresentInSPSFlag:%d ", m_virtualBoundariesPresentFlag );
      if( m_virtualBoundariesPresentFlag )
      {
    #else
    
      msg(VERBOSE, "LoopFilterAcrossVirtualBoundaries:%d ", m_loopFilterAcrossVirtualBoundariesDisabledFlag);
      if ( m_loopFilterAcrossVirtualBoundariesDisabledFlag )
      {
    
        msg(VERBOSE, "vertical virtual boundaries:[");
        for (unsigned i = 0; i < m_numVerVirtualBoundaries; i++)
        {
          msg(VERBOSE, " %d", m_virtualBoundariesPosX[i]);
        }
        msg(VERBOSE, " ] horizontal virtual boundaries:[");
        for (unsigned i = 0; i < m_numHorVirtualBoundaries; i++)
        {
          msg(VERBOSE, " %d", m_virtualBoundariesPosY[i]);
        }
        msg(VERBOSE, " ] ");
      }
    
        msg(VERBOSE, "Reshape:%d ", m_lmcsEnabled);
        if (m_lmcsEnabled)
    
          msg(VERBOSE, "(Signal:%s ", m_reshapeSignalType == 0 ? "SDR" : (m_reshapeSignalType == 2 ? "HDR-HLG" : "HDR-PQ"));
          msg(VERBOSE, "Opt:%d", m_adpOption);
          if (m_adpOption > 0) { msg(VERBOSE, " CW:%d", m_initialCW); }
    
          msg(VERBOSE, " CSoffset:%d", m_CSoffset);
    
    Taoran Lu's avatar
    Taoran Lu committed
          msg(VERBOSE, ") ");
        }