一. 边预测边修改:
(1)在 TEncCu::compressCtu中提取分块信息:
// analysis of CU DEBUG_STRING_NEW(sDebug) xCompressCU( m_ppcBestCU[0], m_ppcTempCU[0], 0 DEBUG_STRING_PASS_INTO(sDebug) ); /* string ctu = to_string(pCtu->getCtuRsAddr()); ofstream Tufile(ctu.c_str(), ios::in | ios::app); TComSlice* const pcSlice = pCtu->getSlice(); const TComSPS& sps = *(pcSlice->getSPS()); int iWidthInPart = sps.getMaxCUWidth() >> 2; for (int i = 0; i < pCtu->getTotalNumPart(); i++) { if (pCtu->getTransformSkip(i, COMPONENT_Y) == 0 && pCtu->getTransformIdx(g_auiRasterToZscan[i]) + pCtu->getDepth(g_auiRasterToZscan[i])==4) Tufile <<g_auiRasterToZscan[i] << " "; } Tufile.close(); */ DEBUG_STRING_OUTPUT(std::cout, sDebug)
(2)在TEncSearch::xIntraCodingTUBlock中修改变换系数:
#if ADAPTIVE_QP_SELECTION pcArlCoeff, #endif uiAbsSum, cQP ); if (pcCoeff[0]!=0 && compID == 0 && uiLog2TrSize == 2) { pcCoeff[0] = pcCoeff[0] + 1; pcCoeff[2] = pcCoeff[2] - 1; pcCoeff[3] = pcCoeff[3] + 1; pcCoeff[8] = pcCoeff[8] - 1; pcCoeff[10] = pcCoeff[10] + 1; pcCoeff[11] = pcCoeff[11] - 1; pcCoeff[12] = pcCoeff[12] + 1; pcCoeff[14] = pcCoeff[14] - 1; pcCoeff[15] = pcCoeff[15] + 1; uiAbsSum = 0; for (int i = 0; i < 16; i++)uiAbsSum = abs(pcCoeff[i]) + uiAbsSum; } //--- inverse transform --- #if DEBUG_STRING if ( (uiAbsSum > 0) || (DebugOptionList::DebugString_InvTran.getInt()&debugPredModeMask) )
(3)在TEncSearch::xIntraCodingTUBlock中修改cost:
ruiDist += m_pcRdCost->getDistPart( bitDepth, piReco, uiStride, piOrg, uiStride, uiWidth, uiHeight, compID ); if (compID == 0 && uiLog2TrSize == 2) { fstream f; string ctu = to_string(pcCU->getCtuRsAddr()); f.open(ctu.c_str(), ios::in); int x; while (f >> x) { if (x== uiZOrder ) { ruiDist = -999999; break; } } f.close(); }
二. 熵编码之前修改变换系数
修改位置:TEncSbac::codeCoeffNxN
if( uiWidth > sps.getMaxTrSize() ) { std::cerr << "ERROR: codeCoeffNxN was passed a TU with dimensions larger than the maximum allowed size" << std::endl; assert(false); exit(1); } #if ENC_DEC_TRACE if (pcCoef[0] != 0 && pcCoef[0] != -1 && compID == 0 && g_bJustDoIt && rTu.GetTransformDepthTotal() == 4) { pcCoef[0] = pcCoef[0] + 1; pcCoef[2] = pcCoef[2] - 1; pcCoef[3] = pcCoef[3] + 1; pcCoef[8] = pcCoef[8] - 1; pcCoef[10] = pcCoef[10] + 1; pcCoef[11] = pcCoef[11] - 1; pcCoef[12] = pcCoef[12] + 1; pcCoef[14] = pcCoef[14] - 1; pcCoef[15] = pcCoef[15] + 1; } #endif // compute number of significant coefficients UInt uiNumSig = TEncEntropy::countNonZeroCoeffs(pcCoef, uiWidth * uiHeight);
标签:&&,ctu,系数,string,变换,uiAbsSum,pCtu,HM,pcCoeff From: https://www.cnblogs.com/jhzj/p/17976538