Skip to content
Snippets Groups Projects
IntraSearch.cpp 306 KiB
Newer Older
  • Learn to ignore specific revisions
  •             for (int mRefNum = 1; mRefNum < numOfPassesExtendRef; mRefNum++)
                {
                  int multiRefIdx = MULTI_REF_LINE_IDX[mRefNum];
    
                  pu.multiRefIdx = multiRefIdx;
                  {
                    initIntraPatternChType(cu, pu.Y(), true);
                  }
                  for (int x = 1; x < numMPMs; x++)
                  {
                    uint32_t mode = multiRefMPM[x];
                    {
                      pu.intraDir[0] = mode;
                      initPredIntraParams(pu, pu.Y(), sps);
    
                      predIntraAng(COMPONENT_Y, piPred, pu);
    
                      // Use the min between SAD and SATD as the cost criterion
                      // SAD is scaled by 2 to align with the scaling of HAD
                      Distortion minSadHad =
                        std::min(distParamSad.distFunc(distParamSad) * 2, distParamHad.distFunc(distParamHad));
    
                      // NB xFracModeBitsIntra will not affect the mode for chroma that may have already been pre-estimated.
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
                      m_CABACEstimator->getCtx() = SubCtx( Ctx::TmpFlag, ctxStartTpmFlag );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::MipFlag, ctxStartMipFlag);
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
                      m_CABACEstimator->getCtx() = SubCtx( Ctx::TimdFlag, ctxStartTimdFlag );
    
    fan wang's avatar
    fan wang committed
    #endif
    #if JVET_AB0155_SGPM
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::SgpmFlag, ctxStartSgpmFlag);
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::ISPMode, ctxStartIspMode);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SECONDARY_MPM
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMPMIdx, ctxStartMPMIdxFlag);
    #endif
    
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaPlanarFlag, ctxStartPlanarFlag);
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMpmFlag, ctxStartIntraMode);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SECONDARY_MPM
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaSecondMpmFlag, ctxStartIntraMode2);
    #endif
    
                      m_CABACEstimator->getCtx() = SubCtx(Ctx::MultiRefLineIdx, ctxStartMrlIdx);
    
                      uint64_t fracModeBits = xFracModeBitsIntra(pu, mode, CHANNEL_TYPE_LUMA);
    
                      double cost = (double) minSadHad + (double) fracModeBits * sqrtLambdaForFirstPass;
                      updateCandList(ModeInfo(false, false, multiRefIdx, NOT_INTRA_SUBPARTITIONS, mode), cost, uiRdModeList,
                                     CandCostList, numModesForFullRD);
                      updateCandList(ModeInfo(false, false, multiRefIdx, NOT_INTRA_SUBPARTITIONS, mode), double(minSadHad),
                                     uiHadModeList, CandHadList, numHadCand);
                    }
                  }
                }
                CHECKD(uiRdModeList.size() != numModesForFullRD, "Error: RD mode list size");
    
                if (LFNSTSaveFlag && testMip
                    && !allowLfnstWithMip(cu.firstPU->lumaSize()))   // save a different set for the next run
                {
                  // save found best modes
                  m_uiSavedRdModeListLFNST = uiRdModeList;
                  m_dSavedModeCostLFNST    = CandCostList;
                  // PBINTRA fast
                  m_uiSavedHadModeListLFNST = uiHadModeList;
                  m_dSavedHadListLFNST      = CandHadList;
                  m_uiSavedNumRdModesLFNST =
                    g_aucIntraModeNumFast_UseMPM_2D[uiWidthBit - MIN_CU_LOG2][uiHeightBit - MIN_CU_LOG2];
                  m_uiSavedRdModeListLFNST.resize(m_uiSavedNumRdModesLFNST);
                  m_dSavedModeCostLFNST.resize(m_uiSavedNumRdModesLFNST);
                  // PBINTRA fast
                  m_uiSavedHadModeListLFNST.resize(3);
                  m_dSavedHadListLFNST.resize(3);
                  LFNSTSaveFlag = false;
                }
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
                // derive TPM candidate using hadamard
                if( testTpm )
                {
                  cu.tmpFlag = true;
                  cu.mipFlag = false;
                  pu.multiRefIdx = 0;
    
                  int foundCandiNum = 0;
                  bool bsuccessfull = 0;
                  CodingUnit cu_cpy = cu;
    
    
    #if JVET_W0069_TMP_BOUNDARY
    
                  RefTemplateType templateType = getRefTemplateType( cu_cpy, cu_cpy.blocks[COMPONENT_Y] );
                  if( templateType != NO_TEMPLATE )
    
    Vadim Seregin's avatar
    Vadim Seregin committed
                  if( isRefTemplateAvailable( cu_cpy, cu_cpy.blocks[COMPONENT_Y] ) )
    
    #endif
    
    #if JVET_W0069_TMP_BOUNDARY
    
                    getTargetTemplate( &cu_cpy, pu.lwidth(), pu.lheight(), templateType );
                    candidateSearchIntra( &cu_cpy, pu.lwidth(), pu.lheight(), templateType );
                    bsuccessfull = generateTMPrediction( piPred.buf, piPred.stride, pu.lwidth(), pu.lheight(), foundCandiNum );
    
                    getTargetTemplate( &cu_cpy, pu.lwidth(), pu.lheight() );
                    candidateSearchIntra( &cu_cpy, pu.lwidth(), pu.lheight() );
                    bsuccessfull = generateTMPrediction( piPred.buf, piPred.stride, pu.lwidth(), pu.lheight(), foundCandiNum );
    
    #endif
    
    #if JVET_W0069_TMP_BOUNDARY
    
    Vadim Seregin's avatar
    Vadim Seregin committed
                  else
                  {
                    foundCandiNum = 1;
    
                    bsuccessfull = generateTmDcPrediction( piPred.buf, piPred.stride, pu.lwidth(), pu.lheight(), 1 << (cu_cpy.cs->sps->getBitDepth( CHANNEL_TYPE_LUMA ) - 1) );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
                  }
    
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
                  if( bsuccessfull && foundCandiNum >= 1 )
                  {
    
                    Distortion minSadHad =
                      std::min( distParamSad.distFunc( distParamSad ) * 2, distParamHad.distFunc( distParamHad ) );
    
                    m_CABACEstimator->getCtx() = SubCtx( Ctx::TmpFlag, ctxStartTpmFlag );
    
                    uint64_t fracModeBits = xFracModeBitsIntra( pu, 0, CHANNEL_TYPE_LUMA );
    
                    double cost = double( minSadHad ) + double( fracModeBits ) * sqrtLambdaForFirstPass;
                    DTRACE( g_trace_ctx, D_INTRA_COST, "IntraTPM: %u, %llu, %f (%d)\n", minSadHad, fracModeBits, cost, 0 );
    
                    updateCandList( ModeInfo( 0, 0, 0, NOT_INTRA_SUBPARTITIONS, 0, 1 ), cost, uiRdModeList, CandCostList, numModesForFullRD );
                    updateCandList( ModeInfo( 0, 0, 0, NOT_INTRA_SUBPARTITIONS, 0, 1 ), 0.8 * double( minSadHad ), uiHadModeList, CandHadList, numHadCand );
                  }
                }
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
                //*** Derive MIP candidates using Hadamard
                if (testMip && !supportedMipBlkSize)
                {
                  // avoid estimation for unsupported blk sizes
                  const int transpOff    = getNumModesMip(pu.Y());
                  const int numModesFull = (transpOff << 1);
                  for (uint32_t uiModeFull = 0; uiModeFull < numModesFull; uiModeFull++)
                  {
                    const bool     isTransposed = (uiModeFull >= transpOff ? true : false);
                    const uint32_t uiMode       = (isTransposed ? uiModeFull - transpOff : uiModeFull);
    
                    numModesForFullRD++;
                    uiRdModeList.push_back(ModeInfo(true, isTransposed, 0, NOT_INTRA_SUBPARTITIONS, uiMode));
                    CandCostList.push_back(0);
                  }
                }
                else if (testMip)
                {
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
                  cu.tmpFlag = 0;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
                  cu.mipFlag     = true;
                  pu.multiRefIdx = 0;
    
                  double mipHadCost[MAX_NUM_MIP_MODE] = { MAX_DOUBLE };
    
                  initIntraPatternChType(cu, pu.Y());
                  initIntraMip(pu, pu.Y());
    
                  const int transpOff    = getNumModesMip(pu.Y());
                  const int numModesFull = (transpOff << 1);
                  for (uint32_t uiModeFull = 0; uiModeFull < numModesFull; uiModeFull++)
                  {
                    const bool     isTransposed = (uiModeFull >= transpOff ? true : false);
                    const uint32_t uiMode       = (isTransposed ? uiModeFull - transpOff : uiModeFull);
    
                    pu.mipTransposedFlag           = isTransposed;
                    pu.intraDir[CHANNEL_TYPE_LUMA] = uiMode;
                    predIntraMip(COMPONENT_Y, piPred, pu);
    
                    // Use the min between SAD and HAD as the cost criterion
                    // SAD is scaled by 2 to align with the scaling of HAD
                    Distortion minSadHad =
                      std::min(distParamSad.distFunc(distParamSad) * 2, distParamHad.distFunc(distParamHad));
    
                    m_CABACEstimator->getCtx() = SubCtx(Ctx::MipFlag, ctxStartMipFlag);
    
                    uint64_t fracModeBits = xFracModeBitsIntra(pu, uiMode, CHANNEL_TYPE_LUMA);
    
                    double cost            = double(minSadHad) + double(fracModeBits) * sqrtLambdaForFirstPass;
                    mipHadCost[uiModeFull] = cost;
                    DTRACE(g_trace_ctx, D_INTRA_COST, "IntraMIP: %u, %llu, %f (%d)\n", minSadHad, fracModeBits, cost,
                           uiModeFull);
    
                    updateCandList(ModeInfo(true, isTransposed, 0, NOT_INTRA_SUBPARTITIONS, uiMode), cost, uiRdModeList,
                                   CandCostList, numModesForFullRD + 1);
                    updateCandList(ModeInfo(true, isTransposed, 0, NOT_INTRA_SUBPARTITIONS, uiMode),
                                   0.8 * double(minSadHad), uiHadModeList, CandHadList, numHadCand);
                  }
    
                  const double thresholdHadCost = 1.0 + 1.4 / sqrt((double) (pu.lwidth() * pu.lheight()));
                  reduceHadCandList(uiRdModeList, CandCostList, numModesForFullRD, thresholdHadCost, mipHadCost, pu,
                                    fastMip);
    
                if (sps.getUseMIP() && LFNSTSaveFlag)
    
                  // save found best modes
                  m_uiSavedNumRdModesLFNST = numModesForFullRD;
                  m_uiSavedRdModeListLFNST = uiRdModeList;
                  m_dSavedModeCostLFNST    = CandCostList;
                  // PBINTRA fast
                  m_uiSavedHadModeListLFNST = uiHadModeList;
                  m_dSavedHadListLFNST      = CandHadList;
                  LFNSTSaveFlag             = false;
    
              else   // if( sps.getUseMIP() && LFNSTLoadFlag)
              {
                // restore saved modes
                numModesForFullRD = m_uiSavedNumRdModesLFNST;
                uiRdModeList      = m_uiSavedRdModeListLFNST;
                CandCostList      = m_dSavedModeCostLFNST;
                // PBINTRA fast
                uiHadModeList = m_uiSavedHadModeListLFNST;
                CandHadList   = m_dSavedHadListLFNST;
              }
    
    
    fan wang's avatar
    fan wang committed
    #if JVET_AB0155_SGPM
              if (testSgpm)
              {
                if (SGPMSaveFlag)
                {
                  m_uiSavedRdModeListSGPM.clear();
                  m_dSavedModeCostSGPM.clear();
                  m_uiSavedHadModeListSGPM.clear();
                  m_dSavedHadListSGPM.clear();
    
                  cu.tmpFlag      = false;
                  pu.multiRefIdx  = 0;
                  cu.mipFlag      = false;
                  
                  initIntraPatternChType(cu, pu.Y(), true);
    
                  // get single mode predictions
                  for (int sgpmIdx = 0; sgpmIdx < SGPM_NUM; sgpmIdx++)
                  {
                    int      sgpmMode[2];
                    sgpmMode[0] = sgpmInfoList[sgpmIdx].sgpmMode0;
                    sgpmMode[1] = sgpmInfoList[sgpmIdx].sgpmMode1;
                    for (int idxIn2 = 0; idxIn2 < 2; idxIn2++)
                    {
                      if (!m_intraModeReady[sgpmMode[idxIn2]])
                      {
                        pu.intraDir[0] = sgpmMode[idxIn2];
    
                        initPredIntraParams(pu, pu.Y(), sps);
                        predIntraAng(COMPONENT_Y, piPred, pu);
    
                        PelBuf predBuf(m_intraPredBuf[sgpmMode[idxIn2]], tmpArea);
                        predBuf.copyFrom(piPred);
                        m_intraModeReady[sgpmMode[idxIn2]] = 1;
                      }
                    }
                  }
    
                  cu.sgpm = true;
                  // frac bits calculate once because all are the same
                  cu.sgpmIdx      = 0;
                  cu.sgpmSplitDir = sgpmInfoList[0].sgpmSplitDir;
                  cu.sgpmMode0    = sgpmInfoList[0].sgpmMode0;
                  cu.sgpmMode1    = sgpmInfoList[0].sgpmMode1;
                  pu.intraDir[0]  = cu.sgpmMode0;
                  pu.intraDir1[0] = cu.sgpmMode1;
                  
                  // NB xFracModeBitsIntra will not affect the mode for chroma that may have already been pre-estimated.
    #if JVET_V0130_INTRA_TMP
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::TmpFlag, ctxStartTpmFlag);
    #endif
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::MipFlag, ctxStartMipFlag);
    #if JVET_W0123_TIMD_FUSION
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::TimdFlag, ctxStartTimdFlag);
    #endif
    #if JVET_AB0155_SGPM
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::SgpmFlag, ctxStartSgpmFlag);
    #endif
    
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::ISPMode, ctxStartIspMode);
    #if SECONDARY_MPM
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMPMIdx, ctxStartMPMIdxFlag);
    #endif
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaPlanarFlag, ctxStartPlanarFlag);
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMpmFlag, ctxStartIntraMode);
    #if SECONDARY_MPM
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaSecondMpmFlag, ctxStartIntraMode2);
    #endif
                  m_CABACEstimator->getCtx() = SubCtx(Ctx::MultiRefLineIdx, ctxStartMrlIdx);
    
                  uint64_t fracModeBits = xFracModeBitsIntra(pu, 0, CHANNEL_TYPE_LUMA);
    
                  for (int sgpmIdx = 0; sgpmIdx < SGPM_NUM; sgpmIdx++)
                  {
                    int sgpmMode0 = sgpmInfoList[sgpmIdx].sgpmMode0;
                    int sgpmMode1 = sgpmInfoList[sgpmIdx].sgpmMode1;
                    PelBuf src0(m_intraPredBuf[sgpmMode0], tmpArea);
                    PelBuf src1(m_intraPredBuf[sgpmMode1], tmpArea);
    
                    m_if.m_weightedSgpm(pu, width, height, COMPONENT_Y, sgpmInfoList[sgpmIdx].sgpmSplitDir, piPred, src0, src1);
    
                    PelBuf predBuf(m_sgpmPredBuf[sgpmIdx], tmpArea);
                    predBuf.copyFrom(piPred);
    
                    Distortion minSadHad = 0;
                    minSadHad += std::min(distParamSad.distFunc(distParamSad) * 2, distParamHad.distFunc(distParamHad));
                    double cost = (double) minSadHad + (double) fracModeBits * sqrtLambdaForFirstPass;
    
                    updateCandList(ModeInfo(false, false, 0, NOT_INTRA_SUBPARTITIONS, SGPM_IDX, 0, 1,
                                            sgpmInfoList[sgpmIdx].sgpmSplitDir, sgpmInfoList[sgpmIdx].sgpmMode0,
                                            sgpmInfoList[sgpmIdx].sgpmMode1, sgpmIdx),
                                   cost, m_uiSavedRdModeListSGPM, m_dSavedModeCostSGPM, SGPM_NUM);
                    updateCandList(ModeInfo(false, false, 0, NOT_INTRA_SUBPARTITIONS, SGPM_IDX, 0, 1,
                                            sgpmInfoList[sgpmIdx].sgpmSplitDir, sgpmInfoList[sgpmIdx].sgpmMode0,
                                            sgpmInfoList[sgpmIdx].sgpmMode1, sgpmIdx),
                                   double(minSadHad), m_uiSavedHadModeListSGPM, m_dSavedHadListSGPM, SGPM_NUM);
                  }
    
                  cu.sgpm = false;
                }
    
                int updateNum = (numModesForFullRD + 1) / 2;
                for (auto listIdx = 0; listIdx < updateNum; listIdx++)
                {
                  updateCandList(m_uiSavedRdModeListSGPM[listIdx], m_dSavedModeCostSGPM[listIdx], uiRdModeList,
                                 CandCostList, numModesForFullRD);
                  updateCandList(m_uiSavedHadModeListSGPM[listIdx], m_dSavedHadListSGPM[listIdx], uiHadModeList,
                                 CandHadList, numHadCand);
                }
              }
    #endif
    
    
              if (m_pcEncCfg->getFastUDIUseMPMEnabled())
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    
    #if SECONDARY_MPM
                auto uiPreds = m_mpmList;
    #else
    
                const int numMPMs = NUM_MOST_PROBABLE_MODES;
                unsigned  uiPreds[numMPMs];
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    
                pu.multiRefIdx = 0;
    
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SECONDARY_MPM
                int numCand = m_mpmListSize;
                numCand = (numCand > 2) ? 2 : numCand;
    #else
    
                const int numCand = PU::getIntraMPMs(pu, uiPreds);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
                for (int j = 0; j < numCand; j++)
                {
                  bool     mostProbableModeIncluded = false;
    
                  ModeInfo mostProbableMode( false, false, 0, NOT_INTRA_SUBPARTITIONS, uiPreds[j] );
    
                  for (int i = 0; i < numModesForFullRD; i++)
    
                    mostProbableModeIncluded |= (mostProbableMode == uiRdModeList[i]);
    
                  }
                  if (!mostProbableModeIncluded)
                  {
    
                    numModesForFullRD++;
                    uiRdModeList.push_back(mostProbableMode);
                    CandCostList.push_back(0);
                  }
                }
                if (saveDataForISP)
                {
                  // we add the MPMs to the list that contains only regular intra modes
                  for (int j = 0; j < numCand; j++)
                  {
                    bool     mostProbableModeIncluded = false;
                    ModeInfo mostProbableMode(false, false, 0, NOT_INTRA_SUBPARTITIONS, uiPreds[j]);
    
                    for (int i = 0; i < m_ispCandListHor.size(); i++)
                    {
                      mostProbableModeIncluded |= (mostProbableMode == m_ispCandListHor[i]);
                    }
                    if (!mostProbableModeIncluded)
                    {
                      m_ispCandListHor.push_back(mostProbableMode);
                    }
    
            else
            {
              THROW("Full search not supported for MIP");
            }
            if (sps.getUseLFNST() && mtsUsageFlag == 1)
            {
              // Store the modes to be checked with RD
              m_savedNumRdModes[lfnstIdx] = numModesForFullRD;
              std::copy_n(uiRdModeList.begin(), numModesForFullRD, m_savedRdModeList[lfnstIdx]);
            }
    
          else   // mtsUsage = 2 (here we potentially reduce the number of modes that will be full-RD checked)
    
            if ((m_pcEncCfg->getUseFastLFNST() || !cu.slice->isIntra()) && m_bestModeCostValid[lfnstIdx])
            {
              numModesForFullRD = 0;
    
    #if JVET_W0103_INTRA_MTS
              double thresholdSkipMode = 1.0 + ((cu.lfnstIdx > 0) ? 0.1 : 0.8) * (1.4 / sqrt((double)(width * height)));
              std::vector<std::pair<ModeInfo, double>> ModeInfoWithDCT2Cost(m_savedNumRdModes[0]);
              for (int i = 0; i < m_savedNumRdModes[0]; i++)
              {
                ModeInfoWithDCT2Cost[i] = { m_savedRdModeList[0][i], m_modeCostStore[0][i] };
              }
              std::stable_sort(ModeInfoWithDCT2Cost.begin(), ModeInfoWithDCT2Cost.end(), [](const std::pair<ModeInfo, double> & l, const std::pair<ModeInfo, double> & r) {return l.second < r.second; });
    
              // **Reorder the modes** and Skip checking the modes with much larger R-D cost than the best mode
              for (int i = 0; i < m_savedNumRdModes[0]; i++)
              {
                if (ModeInfoWithDCT2Cost[i].second <= thresholdSkipMode * ModeInfoWithDCT2Cost[0].second)
                {
                  uiRdModeList.push_back(ModeInfoWithDCT2Cost[i].first);
                  numModesForFullRD++;
                }
              }
    #else
    
              double thresholdSkipMode = 1.0 + ((cu.lfnstIdx > 0) ? 0.1 : 1.0) * (1.4 / sqrt((double) (width * height)));
    
              // Skip checking the modes with much larger R-D cost than the best mode
              for (int i = 0; i < m_savedNumRdModes[lfnstIdx]; i++)
    
                if (m_modeCostStore[lfnstIdx][i] <= thresholdSkipMode * m_bestModeCostStore[lfnstIdx])
                {
                  uiRdModeList.push_back(m_savedRdModeList[lfnstIdx][i]);
                  numModesForFullRD++;
                }
    
            else   // this is necessary because we skip the candidates list calculation, since it was already obtained for
                   // the DCT-II. Now we load it
            {
              // Restore the modes to be checked with RD
              numModesForFullRD = m_savedNumRdModes[lfnstIdx];
              uiRdModeList.resize(numModesForFullRD);
              std::copy_n(m_savedRdModeList[lfnstIdx], m_savedNumRdModes[lfnstIdx], uiRdModeList.begin());
              CandCostList.resize(numModesForFullRD);
            }
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_DIMD
          bool isDimdValid = cu.slice->getSPS()->getUseDimd();
          if (isDimdValid)
          {
            cu.dimd = false;
            ModeInfo m = ModeInfo( false, false, 0, NOT_INTRA_SUBPARTITIONS, DIMD_IDX );
            uiRdModeList.push_back(m);
    
    Jie's avatar
    Jie committed
    #if !JVET_V0087_DIMD_NO_ISP
    
    Vadim Seregin's avatar
    Vadim Seregin committed
            if (testISP)
            {
              m.ispMod = HOR_INTRA_SUBPARTITIONS;
              m_ispCandListHor.push_back(m);
              m.ispMod = VER_INTRA_SUBPARTITIONS;
              m_ispCandListVer.push_back(m);
            }
    
    Jie's avatar
    Jie committed
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
          }
    #else
    
          CHECK(numModesForFullRD != uiRdModeList.size(), "Inconsistent state!");
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
          // after this point, don't use numModesForFullRD
          // PBINTRA fast
          if (m_pcEncCfg->getUsePbIntraFast() && !cs.slice->isIntra() && uiRdModeList.size() < numModesAvailable
              && !cs.slice->getDisableSATDForRD() && (mtsUsageFlag != 2 || lfnstIdx > 0))
    
            double   pbintraRatio = (lfnstIdx > 0) ? 1.25 : PBINTRA_RATIO;
            int      maxSize      = -1;
            ModeInfo bestMipMode;
            int      bestMipIdx = -1;
            for (int idx = 0; idx < uiRdModeList.size(); idx++)
    
              if (uiRdModeList[idx].mipFlg)
              {
                bestMipMode = uiRdModeList[idx];
                bestMipIdx  = idx;
                break;
              }
    
            const int numHadCand = 3;
            for (int k = numHadCand - 1; k >= 0; k--)
    
              if (CandHadList.size() < (k + 1) || CandHadList[k] > cs.interHad * pbintraRatio)
    
                maxSize = k;
    
            if (maxSize > 0)
    
              uiRdModeList.resize(std::min<size_t>(uiRdModeList.size(), maxSize));
    
    
              if (sps.getUseLFNST() && mtsUsageFlag == 1)
              {
                // Update also the number of stored modes to avoid partial fill of mode storage
                m_savedNumRdModes[lfnstIdx] = std::min<int32_t>(int32_t(uiRdModeList.size()), m_savedNumRdModes[lfnstIdx]);
              }
    
    
              if (bestMipIdx >= 0)
              {
                if (uiRdModeList.size() <= bestMipIdx)
                {
                  uiRdModeList.push_back(bestMipMode);
                }
              }
              if (saveDataForISP)
              {
                m_ispCandListHor.resize(std::min<size_t>(m_ispCandListHor.size(), maxSize));
              }
    
            if (maxSize == 0)
            {
              cs.dist     = std::numeric_limits<Distortion>::max();
              cs.interHad = 0;
    
              //===== reset context models =====
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
              m_CABACEstimator->getCtx() = SubCtx( Ctx::TmpFlag, ctxStartTpmFlag );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
              m_CABACEstimator->getCtx() = SubCtx(Ctx::MipFlag, ctxStartMipFlag);
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
              m_CABACEstimator->getCtx() = SubCtx( Ctx::TimdFlag, ctxStartTimdFlag );
    
    fan wang's avatar
    fan wang committed
    #endif
    #if JVET_AB0155_SGPM
              m_CABACEstimator->getCtx() = SubCtx(Ctx::SgpmFlag, ctxStartSgpmFlag);
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
              m_CABACEstimator->getCtx() = SubCtx(Ctx::ISPMode, ctxStartIspMode);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SECONDARY_MPM
              m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMPMIdx, ctxStartMPMIdxFlag);
    #endif
    
              m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaPlanarFlag, ctxStartPlanarFlag);
              m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaMpmFlag, ctxStartIntraMode);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if SECONDARY_MPM
              m_CABACEstimator->getCtx() = SubCtx(Ctx::IntraLumaSecondMpmFlag, ctxStartIntraMode2);
    #endif
    
              m_CABACEstimator->getCtx() = SubCtx(Ctx::MultiRefLineIdx, ctxStartMrlIdx);
    
              return false;
            }
    
    #if JVET_Y0142_ADAPT_INTRA_MTS
        if (sps.getUseLFNST() && m_modesForMTS.size() == 0 && cu.mtsFlag)
        {
          return false;
        }
    #endif
    
        int numNonISPModes = (int)uiRdModeList.size();
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
        bool isTimdValid = cu.slice->getSPS()->getUseTimd();
        if (cu.lwidth() * cu.lheight() > 1024 && cu.slice->getSliceType() == I_SLICE)
        {
          isTimdValid = false;
        }
        if (isTimdValid)
        {
          cu.timd = false;
          uiRdModeList.push_back( ModeInfo( false, false, 0, NOT_INTRA_SUBPARTITIONS, TIMD_IDX ) );
          numNonISPModes++;
          if (lfnstIdx == 0 && !cu.mtsFlag)
          {
            bool isFirstLineOfCtu     = (((pu.block(COMPONENT_Y).y) & ((pu.cs->sps)->getMaxCUWidth() - 1)) == 0);
    
    #if JVET_Y0116_EXTENDED_MRL_LIST
            int  numOfPassesExtendRef = 3;
            if (!sps.getUseMRL() || isFirstLineOfCtu) 
            {
              numOfPassesExtendRef = 1;
            }
            else
            {
              bool checkLineOutsideCtu[2];
              for (int mrlIdx = 1; mrlIdx < 3; mrlIdx++)
              {
                bool isLineOutsideCtu =
                  ((cu.block(COMPONENT_Y).y) % ((cu.cs->sps)->getMaxCUWidth()) <= MULTI_REF_LINE_IDX[mrlIdx]) ? true
                                                                                                              : false;
                checkLineOutsideCtu[mrlIdx-1] = isLineOutsideCtu;
              }
              if (checkLineOutsideCtu[0]) 
              {
                numOfPassesExtendRef = 1;
              }
              else
              {
                if (checkLineOutsideCtu[1] && !checkLineOutsideCtu[0])
                {
                  numOfPassesExtendRef = 2;
                }
              }
            }
    #else
    
    Keming Cao's avatar
    Keming Cao committed
            int  numOfPassesExtendRef = ((!sps.getUseMRL() || isFirstLineOfCtu) ? 1 : MRL_NUM_REF_LINES);
    
    Keming Cao's avatar
    Keming Cao committed
            for (int mRefNum = 1; mRefNum < numOfPassesExtendRef; mRefNum++)
            {
              int multiRefIdx = MULTI_REF_LINE_IDX[mRefNum];
              uiRdModeList.push_back( ModeInfo( false, false, multiRefIdx, NOT_INTRA_SUBPARTITIONS, TIMD_IDX ) );
              numNonISPModes++;
            }
          }
        }
    #endif
    
          // we reserve positions for ISP in the common full RD list
    
          const int maxNumRDModesISP = sps.getUseLFNST() ? 16 * NUM_LFNST_NUM_PER_SET : 16;
          m_curIspLfnstIdx = 0;
    
          for (int i = 0; i < maxNumRDModesISP; i++)
    
            uiRdModeList.push_back( ModeInfo( false, false, 0, INTRA_SUBPARTITIONS_RESERVED, 0 ) );
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
    
        if (isTimdValid && sps.getUseISP() && CU::canUseISP(width, height, cu.cs->sps->getMaxTbSize()) && lfnstIdx == 0 && !cu.mtsFlag)
    
    Keming Cao's avatar
    Keming Cao committed
        {
          uiRdModeList.push_back( ModeInfo( false, false, 0, HOR_INTRA_SUBPARTITIONS, TIMD_IDX ) );
          uiRdModeList.push_back( ModeInfo( false, false, 0, VER_INTRA_SUBPARTITIONS, TIMD_IDX ) );
        }
    #endif
    
        ModeInfo       uiBestPUMode;
    
        int            bestBDPCMMode = 0;
        double         bestCostNonBDPCM = MAX_DOUBLE;
    
    #if INTRA_TRANS_ENC_OPT
        double         bestISPCostTested = MAX_DOUBLE;
        ISPType        bestISPModeTested = NOT_INTRA_SUBPARTITIONS;
    #endif
    
        CodingStructure *csTemp = m_pTempCS[gp_sizeIdxInfo->idxFrom( cu.lwidth() )][gp_sizeIdxInfo->idxFrom( cu.lheight() )];
        CodingStructure *csBest = m_pBestCS[gp_sizeIdxInfo->idxFrom( cu.lwidth() )][gp_sizeIdxInfo->idxFrom( cu.lheight() )];
    
        csTemp->slice = cs.slice;
        csBest->slice = cs.slice;
        csTemp->initStructData();
        csBest->initStructData();
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if !INTRA_RM_SMALL_BLOCK_SIZE_CONSTRAINTS
    
        csTemp->picture = cs.picture;
        csBest->picture = cs.picture;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
        // just to be sure
        numModesForFullRD = ( int ) uiRdModeList.size();
    
        TUIntraSubPartitioner subTuPartitioner( partitioner );
    
        if ( testISP )
        {
          m_modeCtrl->setIspCost( MAX_DOUBLE );
          m_modeCtrl->setMtsFirstPassNoIspCost( MAX_DOUBLE );
        }
        int bestLfnstIdx = cu.lfnstIdx;
    
        for (int mode = isSecondColorSpace ? 0 : -2 * int(testBDPCM); mode < (int)uiRdModeList.size(); mode++)
    
        {
          // set CU/PU to luma prediction mode
          ModeInfo uiOrgMode;
    
          if (sps.getUseColorTrans() && !m_pcEncCfg->getRGBFormatFlag() && isSecondColorSpace && mode)
          {
            continue;
          }
    
          if (mode < 0 || (isSecondColorSpace && m_savedBDPCMModeFirstColorSpace[m_savedRdModeIdx][mode]))
    
            cu.bdpcmMode = mode < 0 ? -mode : m_savedBDPCMModeFirstColorSpace[m_savedRdModeIdx][mode];
    
            uiOrgMode = ModeInfo( false, false, 0, NOT_INTRA_SUBPARTITIONS, cu.bdpcmMode == 2 ? VER_IDX : HOR_IDX );
    
            uiOrgMode = uiRdModeList[mode];
          }
    
          if (!cu.bdpcmMode && uiRdModeList[mode].ispMod == INTRA_SUBPARTITIONS_RESERVED)
    
          {
            if (mode == numNonISPModes)   // the list needs to be sorted only once
    
              if (m_pcEncCfg->getUseFastISP())
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
                if (bestTimdMode)
                {
                  m_modeCtrl->setBestPredModeDCT2(MAP131TO67(uiBestPUMode.modeId));
                }
                else
                {
                  m_modeCtrl->setBestPredModeDCT2(uiBestPUMode.modeId);
                }
    #else
    
                m_modeCtrl->setBestPredModeDCT2(uiBestPUMode.modeId);
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
              ModeInfo tempBestPUMode = uiBestPUMode;
              if (bestTimdMode)
              {
                tempBestPUMode.modeId = MAP131TO67(tempBestPUMode.modeId);
              }
              if (!xSortISPCandList(bestCurrentCost, csBest->cost, tempBestPUMode))
    #else
    
              if (!xSortISPCandList(bestCurrentCost, csBest->cost, uiBestPUMode))
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
              {
                break;
              }
            }
            xGetNextISPMode(uiRdModeList[mode], (mode > 0 ? &uiRdModeList[mode - 1] : nullptr), Size(width, height));
            if (uiRdModeList[mode].ispMod == INTRA_SUBPARTITIONS_RESERVED)
            {
              continue;
    
            cu.lfnstIdx = m_curIspLfnstIdx;
            uiOrgMode   = uiRdModeList[mode];
          }
    
    #if ENABLE_DIMD && INTRA_TRANS_ENC_OPT
    
          if ((m_pcEncCfg->getIntraPeriod() == 1) && cu.slice->getSPS()->getUseDimd() && mode >= 0 && !cu.dimdBlending && uiOrgMode.ispMod == 0 && uiOrgMode.mRefId == 0 && uiOrgMode.modeId != TIMD_IDX && uiOrgMode.modeId != DIMD_IDX)
    
          {
            bool modeDuplicated = (uiOrgMode.modeId == cu.dimdMode);
            if (modeDuplicated)
            {
    
    Sunmi Yoo's avatar
    Sunmi Yoo committed
              m_modeCostStore[lfnstIdx][mode] = MAX_DOUBLE / 2.0;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_DIMD
          cu.dimd = false;
          if( mode >= 0 && uiOrgMode.modeId == DIMD_IDX ) /*to check*/
          {
            uiOrgMode.modeId = cu.dimdMode;
            cu.dimd = true;
          }
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    fan wang's avatar
    fan wang committed
    #if JVET_AB0155_SGPM
          cu.sgpm = uiOrgMode.sgpmFlag;
          if (cu.sgpm)
          {
            uiOrgMode.modeId = uiOrgMode.sgpmMode0;
            cu.sgpmSplitDir  = uiOrgMode.sgpmSplitDir;
            cu.sgpmMode0     = uiOrgMode.sgpmMode0;
            cu.sgpmMode1     = uiOrgMode.sgpmMode1;
            cu.sgpmIdx       = uiOrgMode.sgpmIdx;
            pu.intraDir1[CHANNEL_TYPE_LUMA] = uiOrgMode.sgpmMode1;
          }
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
          cu.tmpFlag = uiOrgMode.tmpFlag;
    
    #if JVET_W0103_INTRA_MTS
          if (cu.tmpFlag && cu.mtsFlag) continue;
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
          cu.mipFlag                     = uiOrgMode.mipFlg;
    
          pu.mipTransposedFlag           = uiOrgMode.mipTrFlg;
    
          cu.ispMode                     = uiOrgMode.ispMod;
          pu.multiRefIdx                 = uiOrgMode.mRefId;
          pu.intraDir[CHANNEL_TYPE_LUMA] = uiOrgMode.modeId;
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
          cu.timd = false;
          if (mode >= 0 && uiOrgMode.modeId == TIMD_IDX)
          {
            if (cu.ispMode)
            {
              cu.lfnstIdx = lfnstIdx;
    
    #if INTRA_TRANS_ENC_OPT
              if ((m_pcEncCfg->getIntraPeriod() == 1) && ((bestISPModeTested == HOR_INTRA_SUBPARTITIONS) || (bestISPModeTested == VER_INTRA_SUBPARTITIONS)))
              {
                if (cu.ispMode != bestISPModeTested)
                {
                  continue;
                }
              }
    #endif
    
    Keming Cao's avatar
    Keming Cao committed
              if (cu.ispMode == VER_INTRA_SUBPARTITIONS && uiBestPUMode.ispMod == 0 && !bestTimdMode)
              {
                continue;
              }
            }
    
    #if INTRA_TRANS_ENC_OPT
            else if (m_skipTimdLfnstMtsPass)
            {
              CHECK(!cu.lfnstIdx && !cu.mtsFlag, "invalid logic");
              continue;
            }
    #endif
    
    Keming Cao's avatar
    Keming Cao committed
            uiOrgMode.modeId = cu.timdMode;
            pu.intraDir[CHANNEL_TYPE_LUMA] = uiOrgMode.modeId;
            cu.timd = true;
          }
    #endif
    
    
          CHECK(cu.mipFlag && pu.multiRefIdx, "Error: combination of MIP and MRL not supported");
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
          if (!cu.timd)
          {
    #endif
            CHECK(pu.multiRefIdx && (pu.intraDir[0] == PLANAR_IDX),
                  "Error: combination of MRL and Planar mode not supported");
    #if JVET_W0123_TIMD_FUSION
          }
    #endif
    
          CHECK(cu.ispMode && cu.mipFlag, "Error: combination of ISP and MIP not supported");
          CHECK(cu.ispMode && pu.multiRefIdx, "Error: combination of ISP and MRL not supported");
    
          CHECK(cu.ispMode&& cu.colorTransform, "Error: combination of ISP and ACT not supported");
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
          CHECK( cu.mipFlag && cu.tmpFlag, "Error: combination of MIP and TPM not supported" );
          CHECK( cu.tmpFlag && cu.ispMode, "Error: combination of TPM and ISP not supported" );
          CHECK( cu.tmpFlag && pu.multiRefIdx, "Error: combination of TPM and MRL not supported" );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    fan wang's avatar
    fan wang committed
    #if JVET_AB0155_SGPM
          CHECK(cu.sgpm && cu.tmpFlag, "Error: combination of SGPM and TPM not supported");
          CHECK(cu.sgpm && cu.ispMode, "Error: combination of SGPM and ISP not supported");
          CHECK(cu.sgpm && pu.multiRefIdx, "Error: combination of SGPM and MRL not supported");
          CHECK(cu.sgpm && cu.mipFlag, "Error: combination of SGPM and MIP not supported");
          CHECK(cu.sgpm && cu.timd, "Error: combination of SGPM and TIMD not supported");
          CHECK(cu.sgpm && cu.dimd, "Error: combination of SGPM and DIMD not supported");
          CHECK(cu.sgpm && cu.bdpcmMode, "Error: combination of SGPM and BDPCM not supported");
    #endif
    
    
    Jie's avatar
    Jie committed
    #if ENABLE_DIMD && JVET_V0087_DIMD_NO_ISP
          CHECK(cu.ispMode && cu.dimd, "Error: combination of ISP and DIMD not supported");
    #endif
    
          pu.intraDir[CHANNEL_TYPE_CHROMA] = cu.colorTransform ? DM_CHROMA_IDX : pu.intraDir[CHANNEL_TYPE_CHROMA];
    
    #if JVET_Y0142_ADAPT_INTRA_MTS
          if (cu.mtsFlag)
          {
            int mtsModeIdx = -1;
            for (int i = 0; i < m_modesForMTS.size(); i++)
            {
              if (uiOrgMode == m_modesForMTS[i])
              {
                mtsModeIdx = i;
                break;
              }
            }
            if (mtsModeIdx == -1)
            {
              mtsModeIdx = 0;
            }
            CHECK(mtsModeIdx == -1, "mtsModeIdx==-1");
            m_coeffAbsSumDCT2 = (m_modesForMTS.size() == 0) ? 10 : m_modesCoeffAbsSumDCT2[mtsModeIdx];
          }
    #endif
    
          // set context models
          m_CABACEstimator->getCtx() = ctxStart;
    
          // determine residual for partition
          cs.initSubStructure( *csTemp, partitioner.chType, cs.area, true );
    
    
          bool tmpValidReturn = false;
    
            if ( m_pcEncCfg->getUseFastISP() )
            {
              m_modeCtrl->setISPWasTested(true);
            }
    
            tmpValidReturn = xIntraCodingLumaISP(*csTemp, subTuPartitioner, bestCurrentCost);
            if (csTemp->tus.size() == 0)
            {
              // no TUs were coded
              csTemp->cost = MAX_DOUBLE;
              continue;
            }
    
            // we save the data for future tests
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
            if (!cu.timd)
            {
    #endif
    
            m_ispTestedModes[m_curIspLfnstIdx].setModeResults((ISPType)cu.ispMode, (int)uiOrgMode.modeId, (int)csTemp->tus.size(), csTemp->cus[0]->firstTU->cbf[COMPONENT_Y] ? csTemp->cost : MAX_DOUBLE, csBest->cost);
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
            }
    #endif
    
            csTemp->cost = !tmpValidReturn ? MAX_DOUBLE : csTemp->cost;
    
    #if INTRA_TRANS_ENC_OPT
            if (csTemp->cost < bestISPCostTested)
            {
              bestISPCostTested = csTemp->cost;
              bestISPModeTested = (ISPType)cu.ispMode;
            }
    #endif
    
            if (cu.colorTransform)
            {
              tmpValidReturn = xRecurIntraCodingACTQT(*csTemp, partitioner, mtsCheckRangeFlag, mtsFirstCheckId, mtsLastCheckId, moreProbMTSIdxFirst);
            }
            else
    
            {
              tmpValidReturn = xRecurIntraCodingLumaQT(
                *csTemp, partitioner, uiBestPUMode.ispMod ? bestCurrentCost : MAX_DOUBLE, -1, TU_NO_ISP,
                uiBestPUMode.ispMod, mtsCheckRangeFlag, mtsFirstCheckId, mtsLastCheckId, moreProbMTSIdxFirst);
            }
    
    #if JVET_Y0142_ADAPT_INTRA_MTS
    
    #if JVET_W0123_TIMD_FUSION
    
          if (!cu.mtsFlag && !lfnstIdx && mode < numNonISPModes && !(cu.timd && pu.multiRefIdx))
    
    #else
          if( !cu.mtsFlag && !lfnstIdx && mode < numNonISPModes && !pu.multiRefIdx )
    #endif
    
          {
            m_modesForMTS.push_back(uiOrgMode);
            m_modesCoeffAbsSumDCT2.push_back(m_coeffAbsSumDCT2);
          }
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
    
    fan wang's avatar
    fan wang committed
          if (!cu.ispMode && !cu.mtsFlag && !cu.lfnstIdx && !cu.bdpcmMode && !pu.multiRefIdx && !cu.mipFlag && !cu.tmpFlag && testISP && !cu.timd
    #if JVET_AB0155_SGPM
            && !cu.sgpm
    #endif
            )
    
    Keming Cao's avatar
    Keming Cao committed
    #else
    
    Vadim Seregin's avatar
    Vadim Seregin committed
          if( !cu.ispMode && !cu.mtsFlag && !cu.lfnstIdx && !cu.bdpcmMode && !pu.multiRefIdx && !cu.mipFlag && !cu.tmpFlag && testISP )
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    #else
    #if JVET_W0123_TIMD_FUSION
          if (!cu.ispMode && !cu.mtsFlag && !cu.lfnstIdx && !cu.bdpcmMode && !pu.multiRefIdx && !cu.mipFlag && testISP && !cu.timd)
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #else
    
          if (!cu.ispMode && !cu.mtsFlag && !cu.lfnstIdx && !cu.bdpcmMode && !pu.multiRefIdx && !cu.mipFlag && testISP)
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
            m_regIntraRDListWithCosts.push_back( ModeInfoWithCost( cu.mipFlag, pu.mipTransposedFlag, pu.multiRefIdx, cu.ispMode, uiOrgMode.modeId, cu.tmpFlag, csTemp->cost ) );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #else
    
            m_regIntraRDListWithCosts.push_back( ModeInfoWithCost( cu.mipFlag, pu.mipTransposedFlag, pu.multiRefIdx, cu.ispMode, uiOrgMode.modeId, csTemp->cost ) );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
          if( cu.ispMode && !csTemp->cus[0]->firstTU->cbf[COMPONENT_Y] )
          {
            csTemp->cost = MAX_DOUBLE;
    
    Nan Hu's avatar
    Nan Hu committed
            csTemp->costDbOffset = 0;
    
          validReturn |= tmpValidReturn;
    
    
    Keming Cao's avatar
    Keming Cao committed
    #if JVET_W0123_TIMD_FUSION
          if( sps.getUseLFNST() && mtsUsageFlag == 1 && !cu.ispMode && mode >= 0 && !cu.timd )
    #else
    
          if( sps.getUseLFNST() && mtsUsageFlag == 1 && !cu.ispMode && mode >= 0 )
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    
            m_modeCostStore[lfnstIdx][mode] = tmpValidReturn ? csTemp->cost : (MAX_DOUBLE / 2.0); //(MAX_DOUBLE / 2.0) ??
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if JVET_V0130_INTRA_TMP
          DTRACE( g_trace_ctx, D_INTRA_COST, "IntraCost T [x=%d,y=%d,w=%d,h=%d] %f (%d,%d,%d,%d,%d,%d,%d) \n", cu.blocks[0].x,
                  cu.blocks[0].y, ( int ) width, ( int ) height, csTemp->cost, uiOrgMode.modeId, uiOrgMode.ispMod,
                  pu.multiRefIdx, cu.tmpFlag, cu.mipFlag, cu.lfnstIdx, cu.mtsFlag );
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #else
    
          DTRACE(g_trace_ctx, D_INTRA_COST, "IntraCost T [x=%d,y=%d,w=%d,h=%d] %f (%d,%d,%d,%d,%d,%d) \n", cu.blocks[0].x,
    
                 cu.blocks[0].y, (int) width, (int) height, csTemp->cost, uiOrgMode.modeId, uiOrgMode.ispMod,
                 pu.multiRefIdx, cu.mipFlag, cu.lfnstIdx, cu.mtsFlag);
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif
    
            if (isFirstColorSpace)
            {
              if (m_pcEncCfg->getRGBFormatFlag() || !cu.ispMode)
              {
                sortRdModeListFirstColorSpace(uiOrgMode, csTemp->cost, cu.bdpcmMode, m_savedRdModeFirstColorSpace[m_savedRdModeIdx], m_savedRdCostFirstColorSpace[m_savedRdModeIdx], m_savedBDPCMModeFirstColorSpace[m_savedRdModeIdx], m_numSavedRdModeFirstColorSpace[m_savedRdModeIdx]);
              }
            }
    
    #if INTRA_TRANS_ENC_OPT
            if (setSkipTimdControl && !cu.ispMode)
            {
    
    #if JVET_W0123_TIMD_FUSION || ENABLE_DIMD
    #if JVET_W0123_TIMD_FUSION && ENABLE_DIMD
    
              if (!cu.dimd && !cu.timd)
    
    #elif ENABLE_DIMD
              if( !cu.dimd )
    #else
              if( !cu.timd )
    #endif
    
              {
                if (csTemp->cost < regAngCost)
                {
                  regAngCost = csTemp->cost;
                }
              }
    
    #endif
    #if JVET_W0123_TIMD_FUSION
    
              if (cu.timd)
              {
                if (csTemp->cost < timdAngCost)
                {
                  timdAngCost = csTemp->cost;
                }
              }
    
            // check r-d cost
            if( csTemp->cost < csBest->cost )
            {
              std::swap( csTemp, csBest );
    
              uiBestPUMode  = uiOrgMode;
              bestBDPCMMode = cu.bdpcmMode;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #if ENABLE_DIMD
              bestDimdMode = cu.dimd;
    
    Keming Cao's avatar
    Keming Cao committed
    #endif
    #if JVET_W0123_TIMD_FUSION
              bestTimdMode = cu.timd;
    
    Vadim Seregin's avatar
    Vadim Seregin committed
    #endif