HM变换系数修改

jhzj / 2024-01-20 / 原文

一. 边预测边修改:

(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);