Skip to content
Snippets Groups Projects
EncModeCtrl.cpp 65.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •   this->BestEncInfoCache   ::copyState( *pOther, area );
    #endif
      this->SaveLoadEncInfoSbt ::copyState( *pOther );
    
    
      m_skipThreshold = pOther->m_skipThreshold;
    }
    
    int EncModeCtrlMTnoRQT::getNumParallelJobs( const CodingStructure &cs, Partitioner& partitioner ) const
    {
    
      int numJobs = 0;
    
      if(      partitioner.canSplit( CU_TRIH_SPLIT, cs ) )
    
        numJobs = 6;
    
      else if( partitioner.canSplit( CU_TRIV_SPLIT, cs ) )
    
        numJobs = 5;
    
      else if( partitioner.canSplit( CU_HORZ_SPLIT, cs ) )
    
    Adam Wieckowski's avatar
    Adam Wieckowski committed
      else if( partitioner.canSplit( CU_VERT_SPLIT, cs ) )
    
        numJobs = 3;
    
      else if( partitioner.canSplit( CU_QUAD_SPLIT, cs ) )
    
        numJobs = 2;
      }
      else if( partitioner.canSplit( CU_DONT_SPLIT, cs ) )
      {
        numJobs = 1;
    
      }
    
      CHECK( numJobs >= NUM_RESERVERD_SPLIT_JOBS, "More jobs specified than allowed" );
    
      return numJobs;
    }
    
    bool EncModeCtrlMTnoRQT::isParallelSplit( const CodingStructure &cs, Partitioner& partitioner ) const
    {
      if( partitioner.getImplicitSplit( cs ) != CU_DONT_SPLIT || cs.picture->scheduler.getSplitJobId() != 0 ) return false;
    
      if( cs.pps->getUseDQP() && partitioner.currQgEnable() ) return false;
    
      const int numJobs = getNumParallelJobs( cs, partitioner );
      const int numPxl  = partitioner.currArea().Y().area();
      const int parlAt  = m_pcEncCfg->getNumSplitThreads() <= 3 ? 1024 : 256;
      if(  cs.slice->isIntra() && numJobs > 2 && ( numPxl == parlAt || !partitioner.canSplit( CU_QUAD_SPLIT, cs ) ) ) return true;
      if( !cs.slice->isIntra() && numJobs > 1 && ( numPxl == parlAt || !partitioner.canSplit( CU_QUAD_SPLIT, cs ) ) ) return true;
    
    }
    
    bool EncModeCtrlMTnoRQT::parallelJobSelector( const EncTestMode& encTestmode, const CodingStructure &cs, Partitioner& partitioner ) const
    {
      // Job descriptors
      //  - 1: all non-split modes
      //  - 2: QT-split
      //  - 3: all vertical modes but TT_V
      //  - 4: all horizontal modes but TT_H
      //  - 5: TT_V
      //  - 6: TT_H
      switch( cs.picture->scheduler.getSplitJobId() )
      {
      case 1:
        // be sure to execute post dont split
        return !isModeSplit( encTestmode );
        break;
      case 2:
        return encTestmode.type == ETM_SPLIT_QT;
        break;
      case 3:
    
        return encTestmode.type == ETM_SPLIT_BT_V;
    
        return encTestmode.type == ETM_SPLIT_BT_H;
    
        break;
      case 5:
        return encTestmode.type == ETM_SPLIT_TT_V;
        break;
      case 6:
        return encTestmode.type == ETM_SPLIT_TT_H;
        break;
      default:
        THROW( "Unknown job-ID for parallelization of EncModeCtrlMTnoRQT: " << cs.picture->scheduler.getSplitJobId() );
        break;
      }
    }
    
    #endif