⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fgscoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
          pcCoefMap[ui] = SIGNIFICANT;
          ucBlockSig                                            = SIGNIFICANT;

          if (piCoeff[pucScan[ui]] < 0)
            pcCoefMap[ui] |= BASE_SIGN;
        }

        if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
          rucScanPos = ui;
        }
      rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) = ucBlockSig;
    }
  }

  return Err::m_nOK;
}


ErrVal
FGSCoder::xUpdateCodingPath()
{
  for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
  for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB;  uiMbX++ )
  {
    MbDataAccess* pcMbDataAccessBL = 0;
    MbDataAccess* pcMbDataAccessEL = 0;
    RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX ) );
    RNOK( m_cMbDataCtrlEL    .initMb( pcMbDataAccessEL, uiMbY, uiMbX ) );

    //===== scale enhancement layer coefficients =====
    pcMbDataAccessEL->getMbData().setTransformSize8x8( pcMbDataAccessBL->getMbData().isTransformSize8x8() );    
    RNOK( xScaleTCoeffs( *pcMbDataAccessEL, false ) );
    //===== update coefficients, CBP, QP =====
    RNOK( xUpdateMacroblock( *pcMbDataAccessBL, *pcMbDataAccessEL, uiMbY, uiMbX ) );
  }

  return Err::m_nOK;
}


ErrVal FGSCoder::xClearCodingPath()
{
  for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
  {
    for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB;  uiMbX++ )
    {
      MbDataAccess* pcMbDataAccessBL = 0;
      RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX ) );

      MbData& rcMbData        = pcMbDataAccessBL->getMbData();
      UInt    uiMbIndex       = uiMbY * m_uiWidthInMB + uiMbX;
      Bool    bIntra4x4       =     rcMbData.isIntra4x4   ();
      Bool    bIsSigLuma      = ( ( rcMbData.getMbCbp() & 0xFF ) > 0 );
      Bool    b8x8Present     = (   pcMbDataAccessBL->getSH().getPPS().getTransform8x8ModeFlag() &&
			                            rcMbData.is8x8TrafoFlagPresent( pcMbDataAccessBL->getSH().getSPS().getDirect8x8InferenceFlag()) );
      Bool    b8x8Transform   = ( b8x8Present && ( bIsSigLuma || bIntra4x4 ) && rcMbData.isTransformSize8x8() );
      UInt    uiMbCbp         = pcMbDataAccessBL->getAutoCbp();

      //===== set macroblock mode =====
      MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
      rcMbFGSCoefMap.resetNumCoded();
      rcMbFGSCoefMap.getMbMap() &= SIGNIFICANT | TRANSFORM_SPECIFIED;
      //--- LUMA ---
      for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
      {
        rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
        if( b8x8Transform )
        {
          if( pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
          {
          for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
          {
            rcMbFGSCoefMap.getLumaScanPos( cIdx ) = ((cIdx.x()%2) == 0 && (cIdx.y()%2) == 0) ? 64:0;
            rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
          }
          }
          else
          {
          for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
          {
            rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
            rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
          }
          }

          //===== set transform coefficients =====
          UInt ui8x8ScanIndex;
          CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
          for( ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
          {
            pcCoefMap[ui8x8ScanIndex] &= ~CODED & ~NEWSIG;
          }
          for( ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
          {
            if( pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
            {
              S4x4Idx cIdx2 = S4x4Idx( c8x8Idx );
              if( !( pcCoefMap[ui8x8ScanIndex] & (SIGNIFICANT|CODED) ) && rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) == 64 )
                rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) = ui8x8ScanIndex;
            }
            else
            {
            S4x4Idx cIdx2 = S4x4Idx( c8x8Idx ) + (ui8x8ScanIndex & 3);
            if( !( pcCoefMap[ui8x8ScanIndex] & (SIGNIFICANT|CODED) ) && rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) == 16 )
              rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) = ui8x8ScanIndex >> 2;
          }
        }
        }
        else
        {
          for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
          {
            UInt uiScanIndex;
            CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
            for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
              pcCoefMap[uiScanIndex] &= ~CODED & ~NEWSIG;
            UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
            rucScanPos = 16;
            for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
              if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
                rucScanPos = uiScanIndex;

            rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
          }
        }
      }


      //--- CHROMA DC ---
      for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
      {
        UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
        rucScanPos = 4;

        for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
        {
          rcMbFGSCoefMap.getCoefMap( cCIdx )[0]  &= ~CODED & ~NEWSIG;
          if( !( rcMbFGSCoefMap.getCoefMap( cCIdx )[0] & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
            rucScanPos = cCIdx&3;
        }
        rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) &= ~CODED;
      }
      //--- CHROMA AC ---
      for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
      {
        UInt  ui;
        UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
        rucScanPos = 16;

        CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
        for( ui = 1; ui < 16; ui++ )
        {
          pcCoefMap[ui] &= ~CODED & ~NEWSIG;
          if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
            rucScanPos = ui;
        }
        rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) &= ~CODED;
      }
    }
  }

  return Err::m_nOK;
}


ErrVal
FGSCoder::xUpdateMacroblock( MbDataAccess&  rcMbDataAccessBL,
                             MbDataAccess&  rcMbDataAccessEL,
                             UInt           uiMbY,
                             UInt           uiMbX )
{
  UInt  uiExtCbp  = 0;
  Bool  b8x8      = rcMbDataAccessBL.getMbData().isTransformSize8x8();
  UInt  uiMbIndex = uiMbY*m_uiWidthInMB + uiMbX;
  MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
  const Bool  bFrame = (FRAME == rcMbDataAccessBL.getMbPicType());

  if( ! rcMbDataAccessBL.getMbData().isIntra() && ! rcMbDataAccessEL.getMbData().getBLSkipFlag() )
  {
    //----- update motion parameters -----
    rcMbDataAccessBL.getMbData().copyFrom  ( rcMbDataAccessEL.getMbData() );
    rcMbDataAccessBL.getMbData().copyMotion( rcMbDataAccessEL.getMbData() );
  }
  //===== luma =====
  if( b8x8 )
  {
    const UChar*  pucScan64 = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
    for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
    {
      Bool    bSig      = false;
      TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get8x8( c8x8Idx );
      TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get8x8( c8x8Idx );
      CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
      for( UInt ui8x8ScanIdx = 0; ui8x8ScanIdx < 64; ui8x8ScanIdx++ )
      {
        UInt  uiPos         = pucScan64[ui8x8ScanIdx];
        if(  m_bUpdateWithoutMap || (pcCoefMap[ui8x8ScanIdx] & CODED ) )
        {
          xUpdateCoefMap(piCoeffBL[uiPos], piCoeffEL[uiPos], pcCoefMap[ui8x8ScanIdx] );
        }
        if( piCoeffBL[uiPos] )
        {
          bSig = true;
        }
      }
      if( bSig )
      {
        uiExtCbp |= ( 0x33 << c8x8Idx.b4x4() );
      }
    }
  }
  else
  {
    const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
    for( S4x4Idx c4x4Idx; c4x4Idx.isLegal(); c4x4Idx++ )
    {
      Bool    bSig      = false;
      TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( c4x4Idx );
      TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( c4x4Idx );
      CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( c4x4Idx );
      for( UInt uiScanIdx = 0; uiScanIdx < 16; uiScanIdx++ )
      {
        UInt  uiPos         = pucScan[uiScanIdx];

        if( m_bUpdateWithoutMap || pcCoefMap[uiScanIdx] & CODED )
        {
          xUpdateCoefMap(piCoeffBL[uiPos], piCoeffEL[uiPos], pcCoefMap[uiScanIdx] );
        }
        if( piCoeffBL[uiPos] )
        {
          bSig = true;
        }
      }
      if( bSig )
      {
        uiExtCbp |= ( 1 << c4x4Idx );
      }
    }
  }


  //===== chroma DC =====
  Bool  bSigDC = false;
  for( CIdx cCIdx2; cCIdx2.isLegal(); cCIdx2++ )
    {
    CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx2)[0];
    TCoeff  &riCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( cCIdx2 )[0];

    if( m_bUpdateWithoutMap || rcCoefMap & CODED )
      {
      TCoeff  &riCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( cCIdx2 )[0];
      xUpdateCoefMap( riCoeffBL, riCoeffEL, rcCoefMap );
      }

    if( riCoeffBL )
        bSigDC = true;
      }
  //===== chroma AC =====
  Bool  bSigAC = false;
  const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
  for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
  {
    TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( cCIdx );
    TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( cCIdx );
    CoefMap* piCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
    for( UInt uiScanIdx = 1; uiScanIdx < 16; uiScanIdx++ )
    {
      UInt  uiPos     = pucScan[uiScanIdx];
      if( m_bUpdateWithoutMap || piCoefMap[uiScanIdx] & CODED )
        xUpdateCoefMap( piCoeffBL[uiPos], piCoeffEL[uiPos], piCoefMap[uiScanIdx] );
      if( piCoeffBL[uiPos] )
      {
        bSigAC = true;
      }
    }
  }

  
  //===== set CBP =====
  UInt  uiChromaCBP = ( bSigAC ? 2 : bSigDC ? 1 : 0 );
  uiExtCbp         |= ( uiChromaCBP << 16 );
  rcMbDataAccessBL.getMbData().setAndConvertMbExtCbp( uiExtCbp );


  //===== set QP =====
  Int iELQP     = rcMbDataAccessEL.getMbData().getQp();
  Int iNumCoded = rcMbFGSCoefMap.getNumCoded();
  Int iQPDelta  = ( 384 - iNumCoded ) / 64;

  Int iQP       = min( 51, iELQP + iQPDelta );
  if( ! ( rcMbFGSCoefMap.getMbMap() & SIGNIFICANT ) )
  {
    iQP = rcMbDataAccessEL.getSH().getPicQp();
  }
  rcMbDataAccessBL.getMbData().setQp( iQP );

  return Err::m_nOK;
}


ErrVal
FGSCoder::xScale4x4Block( TCoeff*            piCoeff,
                          const UChar*       pucScale,
                          UInt               uiStart,
                          const QpParameter& rcQP )
{
  if( pucScale )
  {
    Int iAdd = ( rcQP.per() <= 3 ? ( 1 << ( 3 - rcQP.per() ) ) : 0 );
    
    for( UInt ui = uiStart; ui < 16; ui++ )
    {
      piCoeff[ui] = ( ( piCoeff[ui] * g_aaiDequantCoef[rcQP.rem()][ui] * pucScale[ui] + iAdd ) << rcQP.per() ) >> 4;
    }
  }
  else
  {
    for( UInt ui = uiStart; ui < 16; ui++ )
    {
      piCoeff[ui] *= ( g_aaiDequantCoef[rcQP.rem()][ui] << rcQP.per() );
    }
  }

  return Err::m_nOK;
}


ErrVal
FGSCoder::xScale8x8Block( TCoeff*            piCoeff,
                          const UChar*       pucScale,
                          const QpParameter& rcQP )
{
  Int iAdd = ( rcQP.per() <= 5 ? ( 1 << ( 5 - rcQP.per() ) ) : 0 );

  if( pucScale )
  {
    for( UInt ui = 0; ui < 64; ui++ )
    {
      piCoeff[ui] = ( ( piCoeff[ui] * g_aaiDequantCoef64[rcQP.rem()][ui] * pucScale[ui] + iAdd ) << rcQP.per() ) >> 6;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -