xcheckRDcostIntra

来源:互联网 发布:我爱男保姆知乎 编辑:程序博客网 时间:2024/06/05 11:01
Void TEncCu::xCheckRDCostIntra( TComDataCU *&rpcBestCU,                                TComDataCU *&rpcTempCU,                                Double      &cost,                                PartSize     eSize                                DEBUG_STRING_FN_DECLARE(sDebug) ){  DEBUG_STRING_NEW(sTest)  if(getFastDeltaQp())  {    const TComSPS &sps=*(rpcTempCU->getSlice()->getSPS());    const UInt fastDeltaQPCuMaxSize = Clip3(sps.getMaxCUHeight()>>(sps.getLog2DiffMaxMinCodingBlockSize()), sps.getMaxCUHeight(), 32u);    if(rpcTempCU->getWidth( 0 ) > fastDeltaQPCuMaxSize)    {      return; // only check necessary 2Nx2N Intra in fast deltaqp mode    }  }  UInt uiDepth = rpcTempCU->getDepth( 0 );  rpcTempCU->setSkipFlagSubParts( false, 0, uiDepth );  rpcTempCU->setPartSizeSubParts( eSize, 0, uiDepth );  rpcTempCU->setPredModeSubParts( MODE_INTRA, 0, uiDepth );  rpcTempCU->setChromaQpAdjSubParts( rpcTempCU->getCUTransquantBypass(0) ? 0 : m_cuChromaQpOffsetIdxPlus1, 0, uiDepth );  Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE];  m_pcPredSearch->estIntraPredLumaQT( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcRecoYuvTemp[uiDepth], resiLuma DEBUG_STRING_PASS_INTO(sTest) );  m_ppcRecoYuvTemp[uiDepth]->copyToPicComponent(COMPONENT_Y, rpcTempCU->getPic()->getPicYuvRec(), rpcTempCU->getCtuRsAddr(), rpcTempCU->getZorderIdxInCtu() );  if (rpcBestCU->getPic()->getChromaFormat()!=CHROMA_400)  {    m_pcPredSearch->estIntraPredChromaQT( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcRecoYuvTemp[uiDepth], resiLuma DEBUG_STRING_PASS_INTO(sTest) );  }  m_pcEntropyCoder->resetBits();  if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())  {    m_pcEntropyCoder->encodeCUTransquantBypassFlag( rpcTempCU, 0,          true );  }  m_pcEntropyCoder->encodeSkipFlag ( rpcTempCU, 0,          true );  m_pcEntropyCoder->encodePredMode( rpcTempCU, 0,          true );  m_pcEntropyCoder->encodePartSize( rpcTempCU, 0, uiDepth, true );  m_pcEntropyCoder->encodePredInfo( rpcTempCU, 0 );  m_pcEntropyCoder->encodeIPCMInfo(rpcTempCU, 0, true );  // Encode Coefficients  Bool bCodeDQP = getdQPFlag();  Bool codeChromaQpAdjFlag = getCodeChromaQpAdjFlag();  m_pcEntropyCoder->encodeCoeff( rpcTempCU, 0, uiDepth, bCodeDQP, codeChromaQpAdjFlag );  setCodeChromaQpAdjFlag( codeChromaQpAdjFlag );  setdQPFlag( bCodeDQP );  m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);  rpcTempCU->getTotalBits() = m_pcEntropyCoder->getNumberOfWrittenBits();  rpcTempCU->getTotalBins() = ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();  rpcTempCU->getTotalCost() = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() );  xCheckDQP( rpcTempCU );  cost = rpcTempCU->getTotalCost();  xCheckBestMode(rpcBestCU, rpcTempCU, uiDepth DEBUG_STRING_PASS_INTO(sDebug) DEBUG_STRING_PASS_INTO(sTest));}

0 0