Skip to content
Snippets Groups Projects
EncAppCfg.cpp 230 KiB
Newer Older
  • Learn to ignore specific revisions
  • Hendry's avatar
    Hendry committed
                  }
                  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");
    #else
    
      m_extraRPSs=0;
      //start looping through frames in coding order until we can verify that the GOP structure is correct.
      while(!verifiedGOP&&!errorGOP)
      {
        int curGOP = (checkGOP-1)%m_iGOPSize;
    
        int curPOC = ((checkGOP - 1) / m_iGOPSize)*m_iGOPSize * multipleFactor + m_GOPList[curGOP].m_POC;
    
        if(m_GOPList[curGOP].m_POC<0)
        {
          msg( WARNING, "\nError: found fewer Reference Picture Sets than GOPSize\n");
          errorGOP=true;
        }
        else
        {
          //check that all reference pictures are available, or have a POC < 0 meaning they might be available in the next GOP.
          bool beforeI = false;
          for(int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
          {
            int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
            if(absPOC < 0)
            {
              beforeI=true;
            }
            else
            {
              bool found=false;
              for(int j=0; j<numRefs; j++)
              {
                if(refList[j]==absPOC)
                {
                  found=true;
                  for(int k=0; k<m_iGOPSize; k++)
                  {
    
                    if (absPOC % (m_iGOPSize * multipleFactor) == m_GOPList[k].m_POC % (m_iGOPSize * multipleFactor))
    
                    {
                      if(m_GOPList[k].m_temporalId==m_GOPList[curGOP].m_temporalId)
                      {
                        m_GOPList[k].m_refPic = true;
                      }
                      m_GOPList[curGOP].m_usedByCurrPic[i]=m_GOPList[k].m_temporalId<=m_GOPList[curGOP].m_temporalId;
                    }
                  }
                }
              }
              if(!found)
              {
                msg( WARNING, "\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1);
                errorGOP=true;
              }
            }
          }
          if(!beforeI&&!errorGOP)
          {
            //all ref frames were present
            if(!isOK[curGOP])
            {
              numOK++;
              isOK[curGOP]=true;
              if(numOK==m_iGOPSize)
              {
                verifiedGOP=true;
              }
            }
          }
          else
          {
            //create a new GOPEntry for this frame containing all the reference pictures that were available (POC > 0)
            m_GOPList[m_iGOPSize+m_extraRPSs]=m_GOPList[curGOP];
            int newRefs=0;
            for(int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
            {
              int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
              if(absPOC>=0)
              {
                m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[newRefs]=m_GOPList[curGOP].m_referencePics[i];
                m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[newRefs]=m_GOPList[curGOP].m_usedByCurrPic[i];
                newRefs++;
              }
            }
            int numPrefRefs = m_GOPList[curGOP].m_numRefPicsActive;
    
            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_GOPList[offGOP].m_POC;
    
              if(offPOC>=0&&m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId)
              {
                bool newRef=false;
                for(int i=0; i<numRefs; i++)
                {
                  if(refList[i]==offPOC)
                  {
                    newRef=true;
                  }
                }
                for(int i=0; i<newRefs; i++)
                {
                  if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[i]==offPOC-curPOC)
                  {
                    newRef=false;
                  }
                }
                if(newRef)
                {
                  int insertPoint=newRefs;
                  //this picture can be added, find appropriate place in list and insert it.
                  if(m_GOPList[offGOP].m_temporalId==m_GOPList[curGOP].m_temporalId)
                  {
                    m_GOPList[offGOP].m_refPic = true;
                  }
                  for(int j=0; j<newRefs; j++)
                  {
                    if(m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]<offPOC-curPOC||m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]>0)
                    {
                      insertPoint = j;
                      break;
                    }
                  }
                  int prev = offPOC-curPOC;
                  int prevUsed = m_GOPList[offGOP].m_temporalId<=m_GOPList[curGOP].m_temporalId;
                  for(int j=insertPoint; j<newRefs+1; j++)
                  {
                    int newPrev = m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j];
                    int newUsed = m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j];
                    m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j]=prev;
                    m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j]=prevUsed;
                    prevUsed=newUsed;
                    prev=newPrev;
                  }
                  newRefs++;
                }
              }
              if(newRefs>=numPrefRefs)
              {
                break;
              }
            }
            m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics=newRefs;
            m_GOPList[m_iGOPSize+m_extraRPSs].m_POC = curPOC;
            if (m_extraRPSs == 0)
            {
              m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 0;
              m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = 0;
            }
            else
            {
              int rIdx =  m_iGOPSize + m_extraRPSs - 1;
              int refPOC = m_GOPList[rIdx].m_POC;
              int refPics = m_GOPList[rIdx].m_numRefPics;
              int newIdc=0;
              for(int i = 0; i<= refPics; i++)
              {
                int deltaPOC = ((i != refPics)? m_GOPList[rIdx].m_referencePics[i] : 0);  // check if the reference abs POC is >= 0
                int absPOCref = refPOC+deltaPOC;
                int refIdc = 0;
                for (int j = 0; j < m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefPics; j++)
                {
                  if ( (absPOCref - curPOC) == m_GOPList[m_iGOPSize+m_extraRPSs].m_referencePics[j])
                  {
                    if (m_GOPList[m_iGOPSize+m_extraRPSs].m_usedByCurrPic[j])
                    {
                      refIdc = 1;
                    }
                    else
                    {
                      refIdc = 2;
                    }
                  }
                }
                m_GOPList[m_iGOPSize+m_extraRPSs].m_refIdc[newIdc]=refIdc;
                newIdc++;
              }
              m_GOPList[m_iGOPSize+m_extraRPSs].m_interRPSPrediction = 1;
              m_GOPList[m_iGOPSize+m_extraRPSs].m_numRefIdc = newIdc;
              m_GOPList[m_iGOPSize+m_extraRPSs].m_deltaRPS = refPOC - m_GOPList[m_iGOPSize+m_extraRPSs].m_POC;
            }
            curGOP=m_iGOPSize+m_extraRPSs;
            m_extraRPSs++;
          }
          numRefs=0;
          for(int i = 0; i< m_GOPList[curGOP].m_numRefPics; i++)
          {
            int absPOC = curPOC+m_GOPList[curGOP].m_referencePics[i];
            if(absPOC >= 0)
            {
              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
    #if JVET_M0128
        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;
        }
    #else
    
        if(m_GOPList[i].m_numRefPics+1 > m_maxDecPicBuffering[m_GOPList[i].m_temporalId])
        {
          m_maxDecPicBuffering[m_GOPList[i].m_temporalId] = m_GOPList[i].m_numRefPics + 1;
        }
    
    Hendry's avatar
    Hendry committed
    #endif
    
        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;
      }
    
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #if !JVET_N0063_VUI
    
      if(m_vuiParametersPresentFlag && m_bitstreamRestrictionFlag)
      {
        int PicSizeInSamplesY =  m_iSourceWidth * m_iSourceHeight;
        if(tileFlag)
        {
          int maxTileWidth = 0;
          int maxTileHeight = 0;
          int widthInCU = (m_iSourceWidth % m_uiMaxCUWidth) ? m_iSourceWidth/m_uiMaxCUWidth + 1: m_iSourceWidth/m_uiMaxCUWidth;
          int heightInCU = (m_iSourceHeight % m_uiMaxCUHeight) ? m_iSourceHeight/m_uiMaxCUHeight + 1: m_iSourceHeight/m_uiMaxCUHeight;
          if(m_tileUniformSpacingFlag)
          {
            maxTileWidth = m_uiMaxCUWidth*((widthInCU+m_numTileColumnsMinus1)/(m_numTileColumnsMinus1+1));
            maxTileHeight = m_uiMaxCUHeight*((heightInCU+m_numTileRowsMinus1)/(m_numTileRowsMinus1+1));
            // if only the last tile-row is one treeblock higher than the others
            // the maxTileHeight becomes smaller if the last row of treeblocks has lower height than the others
            if(!((heightInCU-1)%(m_numTileRowsMinus1+1)))
            {
              maxTileHeight = maxTileHeight - m_uiMaxCUHeight + (m_iSourceHeight % m_uiMaxCUHeight);
            }
            // if only the last tile-column is one treeblock wider than the others
            // the maxTileWidth becomes smaller if the last column of treeblocks has lower width than the others
            if(!((widthInCU-1)%(m_numTileColumnsMinus1+1)))
            {
              maxTileWidth = maxTileWidth - m_uiMaxCUWidth + (m_iSourceWidth % m_uiMaxCUWidth);
            }
          }
          else // not uniform spacing
          {
            if(m_numTileColumnsMinus1<1)
            {
              maxTileWidth = m_iSourceWidth;
            }
            else
            {
              int accColumnWidth = 0;
              for(int col=0; col<(m_numTileColumnsMinus1); col++)
              {
                maxTileWidth = m_tileColumnWidth[col]>maxTileWidth ? m_tileColumnWidth[col]:maxTileWidth;
                accColumnWidth += m_tileColumnWidth[col];
              }
              maxTileWidth = (widthInCU-accColumnWidth)>maxTileWidth ? m_uiMaxCUWidth*(widthInCU-accColumnWidth):m_uiMaxCUWidth*maxTileWidth;
            }
            if(m_numTileRowsMinus1<1)
            {
              maxTileHeight = m_iSourceHeight;
            }
            else
            {
              int accRowHeight = 0;
              for(int row=0; row<(m_numTileRowsMinus1); row++)
              {
                maxTileHeight = m_tileRowHeight[row]>maxTileHeight ? m_tileRowHeight[row]:maxTileHeight;
                accRowHeight += m_tileRowHeight[row];
              }
              maxTileHeight = (heightInCU-accRowHeight)>maxTileHeight ? m_uiMaxCUHeight*(heightInCU-accRowHeight):m_uiMaxCUHeight*maxTileHeight;
            }
          }
          int maxSizeInSamplesY = maxTileWidth*maxTileHeight;
          m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/maxSizeInSamplesY-4;
        }
        else if(m_entropyCodingSyncEnabledFlag)
        {
          m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/((2*m_iSourceHeight+m_iSourceWidth)*m_uiMaxCUHeight)-4;
        }
        else if(m_sliceMode == FIXED_NUMBER_OF_CTU)
        {
          m_minSpatialSegmentationIdc = 4*PicSizeInSamplesY/(m_sliceArgument*m_uiMaxCUWidth*m_uiMaxCUHeight)-4;
        }
        else
        {
          m_minSpatialSegmentationIdc = 0;
        }
      }
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #endif
    
    Karsten Suehring's avatar
    Karsten Suehring committed
    #if JVET_N0857_TILES_BRICKS
      for (int i=0; i<MAX_TILES; i++)
      {
        if (m_brickSplits[i].m_tileIdx>=0)
        {
          m_brickSplitMap[m_brickSplits[i].m_tileIdx] = m_brickSplits[i];
          // ToDo: check that brick dimensions don't exceed tile dimensions
        }
      }
    #endif
    
    
    Valeri George's avatar
    Valeri George committed
      if ((m_MCTSEncConstraint) && (m_bLFCrossTileBoundaryFlag))
      {
        printf("Warning: Constrained Encoding for Motion Constrained Tile Sets (MCTS) is enabled. Disabling filtering across tile boundaries!\n");
        m_bLFCrossTileBoundaryFlag = false;
      }
      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 (m_toneMappingInfoSEIEnabled)
      {
        xConfirmPara( m_toneMapCodedDataBitDepth < 8 || m_toneMapCodedDataBitDepth > 14 , "SEIToneMapCodedDataBitDepth must be in rage 8 to 14");
        xConfirmPara( m_toneMapTargetBitDepth < 1 || (m_toneMapTargetBitDepth > 16 && m_toneMapTargetBitDepth < 255) , "SEIToneMapTargetBitDepth must be in rage 1 to 16 or equal to 255");
        xConfirmPara( m_toneMapModelId < 0 || m_toneMapModelId > 4 , "SEIToneMapModelId must be in rage 0 to 4");
        xConfirmPara( m_cameraIsoSpeedValue == 0, "SEIToneMapCameraIsoSpeedValue shall not be equal to 0");
        xConfirmPara( m_exposureIndexValue  == 0, "SEIToneMapExposureIndexValue shall not be equal to 0");
        xConfirmPara( m_extendedRangeWhiteLevel < 100, "SEIToneMapExtendedRangeWhiteLevel should be greater than or equal to 100");
        xConfirmPara( m_nominalBlackLevelLumaCodeValue >= m_nominalWhiteLevelLumaCodeValue, "SEIToneMapNominalWhiteLevelLumaCodeValue shall be greater than SEIToneMapNominalBlackLevelLumaCodeValue");
        xConfirmPara( m_extendedWhiteLevelLumaCodeValue < m_nominalWhiteLevelLumaCodeValue, "SEIToneMapExtendedWhiteLevelLumaCodeValue shall be greater than or equal to SEIToneMapNominalWhiteLevelLumaCodeValue");
      }
    
      if (m_kneeSEIEnabled && !m_kneeSEICancelFlag)
      {
        xConfirmPara( m_kneeSEINumKneePointsMinus1 < 0 || m_kneeSEINumKneePointsMinus1 > 998, "SEIKneeFunctionNumKneePointsMinus1 must be in the range of 0 to 998");
        for ( uint32_t i=0; i<=m_kneeSEINumKneePointsMinus1; i++ )
        {
          xConfirmPara( m_kneeSEIInputKneePoint[i] < 1 || m_kneeSEIInputKneePoint[i] > 999, "SEIKneeFunctionInputKneePointValue must be in the range of 1 to 999");
          xConfirmPara( m_kneeSEIOutputKneePoint[i] < 0 || m_kneeSEIOutputKneePoint[i] > 1000, "SEIKneeFunctionInputKneePointValue must be in the range of 0 to 1000");
          if ( i > 0 )
          {
            xConfirmPara( m_kneeSEIInputKneePoint[i-1] >= m_kneeSEIInputKneePoint[i],  "The i-th SEIKneeFunctionInputKneePointValue must be greater than the (i-1)-th value");
            xConfirmPara( m_kneeSEIOutputKneePoint[i-1] > m_kneeSEIOutputKneePoint[i],  "The i-th SEIKneeFunctionOutputKneePointValue must be greater than or equal to the (i-1)-th value");
          }
        }
      }
    
      if (m_chromaResamplingFilterSEIenabled)
      {
        xConfirmPara( (m_chromaFormatIDC == CHROMA_400 ), "chromaResamplingFilterSEI is not allowed to be present when ChromaFormatIDC is equal to zero (4:0:0)" );
        xConfirmPara(m_vuiParametersPresentFlag && m_chromaLocInfoPresentFlag && (m_chromaSampleLocTypeTopField != m_chromaSampleLocTypeBottomField ), "When chromaResamplingFilterSEI is enabled, ChromaSampleLocTypeTopField has to be equal to ChromaSampleLocTypeBottomField" );
      }
    
      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" );
      }
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #if !JVET_N0063_VUI
    
      if (m_vuiParametersPresentFlag)
      {
        xConfirmPara(m_RCTargetBitrate == 0, "A target bit rate is required to be set for VUI/HRD parameters.");
        if (m_RCCpbSize == 0)
        {
          msg( WARNING, "Warning: CPB size is set equal to zero. Adjusting value to be equal to TargetBitrate!\n");
          m_RCCpbSize = m_RCTargetBitrate;
        }
      }
    
    Virginie Drugeon's avatar
    Virginie Drugeon committed
    #endif
    
    #endif
    
      xConfirmPara(!m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0");
    
      xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
    
      if (m_framePackingSEIEnabled)
      {
        xConfirmPara(m_framePackingSEIType < 3 || m_framePackingSEIType > 5 , "SEIFramePackingType must be in rage 3 to 5");
      }
    
      if (m_segmentedRectFramePackingSEIEnabled)
      {
        xConfirmPara(m_framePackingSEIEnabled , "SEISegmentedRectFramePacking must be 0 when SEIFramePacking is 1");
      }
    
      if((m_numTileColumnsMinus1 <= 0) && (m_numTileRowsMinus1 <= 0) && m_tmctsSEIEnabled)
      {
        msg( WARNING, "Warning: SEITempMotionConstrainedTileSets is set to false to disable temporal motion-constrained tile sets SEI message because there are no tiles enabled.\n");
        m_tmctsSEIEnabled = false;
      }
    
      if(m_timeCodeSEIEnabled)
      {
        xConfirmPara(m_timeCodeSEINumTs > MAX_TIMECODE_SEI_SETS, "Number of time sets cannot exceed 3");
      }
    
    #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 EXTENSION_360_VIDEO
      check_failed |= m_ext360.verifyParameters();
    #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 );
      }
      if (m_profile == Profile::MAINREXT)
      {
        ExtendedProfileName validProfileName;
        if (m_onePictureOnlyConstraintFlag)
        {
          validProfileName = m_bitDepthConstraint == 8 ? MAIN_444_STILL_PICTURE : (m_bitDepthConstraint == 16 ? MAIN_444_16_STILL_PICTURE : NONE);
        }
        else
        {
          const uint32_t intraIdx = m_intraConstraintFlag ? 1:0;
          const uint32_t bitDepthIdx = (m_bitDepthConstraint == 8 ? 0 : (m_bitDepthConstraint ==10 ? 1 : (m_bitDepthConstraint == 12 ? 2 : (m_bitDepthConstraint == 16 ? 3 : 4 ))));
          const uint32_t chromaFormatIdx = uint32_t(m_chromaFormatConstraint);
          validProfileName = (bitDepthIdx > 3 || chromaFormatIdx>3) ? NONE : validRExtProfileNames[intraIdx][bitDepthIdx][chromaFormatIdx];
        }
        std::string rextSubProfile;
        if (validProfileName!=NONE)
        {
          rextSubProfile=enumToString(strToExtendedProfile, sizeof(strToExtendedProfile)/sizeof(*strToExtendedProfile), validProfileName);
        }
        if (rextSubProfile == "main_444_16")
        {
          rextSubProfile="main_444_16 [NON STANDARD]";
        }
        msg( DETAILS, "Profile                                : %s (%s)\n", profileToString(m_profile), (rextSubProfile.empty())?"INVALID REXT PROFILE":rextSubProfile.c_str() );
      }
      else
      {
        msg( DETAILS, "Profile                                : %s\n", profileToString(m_profile) );
      }
      msg( DETAILS, "CU size / depth / total-depth          : %d / %d / %d\n", m_uiMaxCUWidth, m_uiMaxCUDepth, m_uiMaxCodingDepth );
    
    #if MAX_TB_SIZE_SIGNALLING
      msg( DETAILS, "Max TB size                            : %d \n", 1 << m_log2MaxTbSize );
    #endif
    
      msg( DETAILS, "Min PCM size                           : %d\n", 1 << m_uiPCMLog2MinSize);
      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 );
    #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, "PCM sample bit depth                   : (Y:%d, C:%d)\n", m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA],
                                                                        m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] : 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 (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, "WPMethod                               : %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 );
    
    #if JVET_N0400_SIGNAL_TRIANGLE_CAND_NUM
      msg( DETAILS, "Max Num Triangle Merge Candidates      : %d\n", m_maxNumTriangleCand );
    #endif
    
      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, "Slice: M=%d ", int(m_sliceMode));
      if (m_sliceMode!=NO_SLICES)
      {
        msg( VERBOSE, "A=%d ", m_sliceArgument);
      }
    
    Valeri George's avatar
    Valeri George committed
      msg( VERBOSE, "Tiles:%dx%d ", m_numTileColumnsMinus1 + 1, m_numTileRowsMinus1 + 1 );
    
      msg( VERBOSE, "MCTS:%d ", m_MCTSEncConstraint );
    
      msg( VERBOSE, "CIP:%d ", m_bUseConstrainedIntraPred);
      msg( VERBOSE, "SAO:%d ", (m_bUseSAO)?(1):(0));
      msg( VERBOSE, "ALF:%d ", m_alf ? 1 : 0 );
      msg( VERBOSE, "PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
    
      if (m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce)
      {
        msg( VERBOSE, "TransQuantBypassEnabled: =1");
      }
      else
      {
        msg( VERBOSE, "TransQuantBypassEnabled:%d ", (m_TransquantBypassEnabledFlag)? 1:0 );
      }
    
      msg( VERBOSE, "WPP:%d ", (int)m_useWeightedPred);
      msg( VERBOSE, "WPB:%d ", (int)m_useWeightedBiPred);
      msg( VERBOSE, "PME:%d ", m_log2ParallelMergeLevel);
      const int iWaveFrontSubstreams = m_entropyCodingSyncEnabledFlag ? (m_iSourceHeight + m_uiMaxCUHeight - 1) / m_uiMaxCUHeight : 1;
      msg( VERBOSE, " WaveFrontSynchro:%d WaveFrontSubstreams:%d", m_entropyCodingSyncEnabledFlag?1:0, iWaveFrontSubstreams);
    #if HEVC_USE_SCALING_LISTS
      msg( VERBOSE, " ScalingList:%d ", m_useScalingListId );
    #endif
      msg( VERBOSE, "TMVPMode:%d ", m_TMVPModeId     );
    
      msg( VERBOSE, " DQ:%d ", m_depQuantEnabledFlag);
    #if HEVC_USE_SIGN_HIDING
      msg( VERBOSE, " SignBitHidingFlag:%d ", m_signDataHidingEnabledFlag);
    #endif
      msg( VERBOSE, "RecalQP:%d ", m_recalculateQPAccordingToLambda ? 1 : 0 );
    
      if( m_profile == Profile::NEXT )
      {
        msg( VERBOSE, "\nNEXT TOOL CFG: " );
    
    #if JVET_N0193_LFNST
        msg( VERBOSE, "LFNST:%d ", m_LFNST );
    #endif
    
    #if JVET_N0127_MMVD_SPS_FLAG
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
        msg( VERBOSE, "MMVD:%d ", m_MMVD);
    #endif
    
        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 );
    
    Philippe Hanhart's avatar
    Philippe Hanhart committed
        if( m_LMChroma && m_chromaFormatIDC == CHROMA_420 )
        {
          msg( VERBOSE, "CclmCollocatedChroma:%d ", m_cclmCollocatedChromaFlag );
        }
    
    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 );
    
    #if INCLUDE_ISP_CFG_FLAG
        msg( VERBOSE, "ISP:%d ", m_ISP );
    #endif
    
    #if JVET_N0235_SMVD_SPS
        msg( VERBOSE, "SMVD:%d ", m_SMVD );
    #endif
    
    Tung Nguyen's avatar
    Tung Nguyen committed
        msg( VERBOSE, "CompositeLTReference:%d ", m_compositeRefEnabled);
    
        msg( VERBOSE, "GBi:%d ", m_GBi );
        msg( VERBOSE, "GBiFast:%d ", m_GBiFast );
    
    #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET
        msg( VERBOSE, "LADF:%d ", m_LadfEnabed );
    
    #endif
        msg(VERBOSE, "MHIntra:%d ", m_MHIntra);
    
        msg( VERBOSE, "Triangle:%d ", m_Triangle );
    
    #if JVET_N0127_MMVD_SPS_FLAG
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
        m_allowDisFracMMVD = m_MMVD ? m_allowDisFracMMVD : false;
        if ( m_MMVD )
          msg(VERBOSE, "AllowDisFracMMVD:%d ", m_allowDisFracMMVD);
    #else
    
        msg( VERBOSE, "AllowDisFracMMVD:%d ", m_allowDisFracMMVD );
    
    Seungsoo Jeong's avatar
    Seungsoo Jeong committed
    #endif
    
        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);
    
    #if JVET_N0449_MMVD_SIMP
        msg(VERBOSE, "MmvdDisNum:%d ", m_MmvdDisNum);
    
    #endif
    #if JVET_N0413_RDPCM
        msg(VERBOSE, "RDPCM:%d ", m_RdpcmMode );
    
    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_N0438_LOOP_FILTER_DISABLED_ACROSS_VIR_BOUND
      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, " ] ");
      }
    #endif
    
    Taoran Lu's avatar
    Taoran Lu committed
        msg(VERBOSE, "Reshape:%d ", m_lumaReshapeEnable);
        if (m_lumaReshapeEnable)
    
    Taoran Lu's avatar
    Taoran Lu committed
          msg(VERBOSE, "(Sigal:%s ", m_reshapeSignalType==0? "SDR" : "HDR-PQ");
    
    Taoran Lu's avatar
    Taoran Lu committed
          msg(VERBOSE, ") ");
        }
    
    #if JVET_N0217_MATRIX_INTRAPRED
        msg(VERBOSE, "MIP:%d ", m_MIP);
    #endif
    
    Nan Hu's avatar
    Nan Hu committed
        msg(VERBOSE, "EncDbOpt:%d ", m_encDbOpt);
    
      msg( VERBOSE, "LCTUFast:%d ", m_useFastLCTU );
    
      msg( VERBOSE, "FastMrg:%d ", m_useFastMrg );
      msg( VERBOSE, "PBIntraFast:%d ", m_usePbIntraFast );
    
      if( m_ImvMode ) msg( VERBOSE, "IMV4PelFast:%d ", m_Imv4PelFast );
    
    Tung Nguyen's avatar
    Tung Nguyen committed
      if( m_MTS ) msg( VERBOSE, "MTSMaxCand: %1d(intra) %1d(inter) ", m_MTSIntraMaxCand, m_MTSInterMaxCand );
    
    #if INCLUDE_ISP_CFG_FLAG
      if( m_ISP ) msg( VERBOSE, "ISPFast:%d ", m_useFastISP );
    #else
    
      msg( VERBOSE, "ISPFast:%d ", m_useFastISP );
    
    #endif
    #if JVET_N0193_LFNST
      if( m_LFNST ) msg( VERBOSE, "FastLFNST:%d ", m_useFastLFNST );
    
    Karsten Suehring's avatar
    Karsten Suehring committed
      msg( VERBOSE, "AMaxBT:%d ", m_useAMaxBT );
      msg( VERBOSE, "E0023FastEnc:%d ", m_e0023FastEnc );
      msg( VERBOSE, "ContentBasedFastQtbt:%d ", m_contentBasedFastQtbt );
    
    #if JVET_N0242_NON_LINEAR_ALF
      msg( VERBOSE, "UseNonLinearALFLuma:%d ", m_useNonLinearAlfLuma );
      msg( VERBOSE, "UseNonLinearALFChroma:%d ", m_useNonLinearAlfChroma );
    #endif
    
    #if JVET_N0217_MATRIX_INTRAPRED
      if( m_MIP ) msg(VERBOSE, "FastMIP:%d ", m_useFastMIP);
    #endif
    
    
      msg( VERBOSE, "NumSplitThreads:%d ", m_numSplitThreads );
      if( m_numSplitThreads > 1 )
      {
        msg( VERBOSE, "ForceSingleSplitThread:%d ", m_forceSplitSequential );
      }
      msg( VERBOSE, "NumWppThreads:%d+%d ", m_numWppThreads, m_numWppExtraLines );
      msg( VERBOSE, "EnsureWppBitEqual:%d ", m_ensureWppBitEqual );
    
    #if EXTENSION_360_VIDEO
      m_ext360.outputConfigurationSummary();
    #endif
    
      msg( VERBOSE, "\n\n");
    
      msg( NOTICE, "\n");
    
      fflush( stdout );
    }
    
    bool confirmPara(bool bflag, const char* message)
    {
      if (!bflag)
      {
        return false;
      }
    
      msg( ERROR, "Error: %s\n",message);
      return true;
    }
    
    //! \}