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

📄 fgscoder.cpp

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



ErrVal
FGSCoder::reconstruct( IntFrame* pcRecResidual, Bool bDecoder )
{
  ROF( m_bInit );
  ROF( m_bPicInit );
  ROF( pcRecResidual );

  UInt            uiLayer         = m_pcSliceHeader->getLayerId(); 
  YuvBufferCtrl*  pcYuvBufferCtrl = m_papcYuvFullPelBufferCtrl[ uiLayer ];
  IntYuvMbBuffer  cMbBuffer;

  RNOK( m_pcCurrMbDataCtrl->initSlice ( *m_pcSliceHeader, PRE_PROCESS, bDecoder, NULL ) );

	const PicType ePicType = m_pcSliceHeader->getPicType();
	const Bool    bMbAff   = m_pcSliceHeader->isMbAff   ();

	if( ePicType!=FRAME )
	{
		RNOK( pcRecResidual->addFieldBuffer     ( ePicType ) );
		RNOK( m_pcBaseLayerSbb->addFieldBuffer( ePicType ) );//TMM_INTERLACE
	}
	else if( bMbAff )
	{
		RNOK( pcRecResidual->addFrameFieldBuffer() );
		RNOK( m_pcBaseLayerSbb->addFrameFieldBuffer() );//TMM_INTERLACE
	}

	//===== loop over macroblocks =====
 for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
  for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB;  uiMbX++ )
  {
    MbDataAccess* pcMbDataAccessBL = NULL;
   	RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX         ) );
    RNOK( pcYuvBufferCtrl   ->initMb(                   uiMbY, uiMbX, bMbAff ) );

    RNOK( xReconstructMacroblock    ( *pcMbDataAccessBL, cMbBuffer           ) );
		const PicType eMbPicType = pcMbDataAccessBL->getMbPicType();
		RNOK( pcRecResidual->getPic( eMbPicType )->getFullPelYuvBuffer()->loadBuffer( &cMbBuffer ) );
  }

	if( ePicType!=FRAME )
	{
		RNOK( pcRecResidual->removeFieldBuffer     ( ePicType ) );
	}
	else if( bMbAff )
	{
		RNOK( pcRecResidual->removeFrameFieldBuffer()           );
	}

  return Err::m_nOK;
}

ErrVal
FGSCoder::xScaleBaseLayerCoeffs( Bool bDecoder )
{
//===== loop over macroblocks =====
 for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
  for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB;  uiMbX++ )
  {
    MbDataAccess* pcMbDataAccessBL = NULL;
    RNOK( m_pcCurrMbDataCtrl->initMb         (  pcMbDataAccessBL, uiMbY, uiMbX ) );
    RNOK( xScaleTCoeffs                      ( *pcMbDataAccessBL, true         ) );
  }
  
  return Err::m_nOK;
}

ErrVal
FGSCoder::xClearBaseCoeffs( MbDataAccess& rcMbDataAccess, 
                            MbDataAccess* pcMbDataAccessBase )
{
  UInt uiMbY     = pcMbDataAccessBase->getMbY();
  UInt uiMbX     = pcMbDataAccessBase->getMbX();
  UInt uiMbIndex = uiMbY * m_uiWidthInMB + uiMbX;
  MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
  rcMbFGSCoefMap.resetNumCoded();
  rcMbFGSCoefMap.resetMbRefCtx();
  rcMbFGSCoefMap.resetMbCoefMap();
  rcMbFGSCoefMap.getMbMap() = rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() && rcMbDataAccess.getMbData().is8x8TrafoFlagPresent(rcMbDataAccess.getSH().getSPS().getDirect8x8InferenceFlag()) ? CLEAR : TRANSFORM_SPECIFIED;
  //--- LUMA ---
  for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
  {
    rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = CLEAR;
    for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
    {
      UInt    uiScanIndex;
      CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
      UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
      rucScanPos = 16;
      for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
        if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
          rucScanPos = uiScanIndex;

      //===== set block mode =====
      rcMbFGSCoefMap.getB4x4Map( cIdx ) = CLEAR;
    }
  }

  //--- 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] = CLEAR;
      if( !( rcMbFGSCoefMap.getCoefMap( cCIdx )[0] & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
        rucScanPos = cCIdx&3;
      }
    rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = CLEAR;
    }
  //--- CHROMA AC ---
  for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
  {
    UInt    ui;
    CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
    UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
    rucScanPos = 16;
    for( ui = 1; ui < 16; ui++ )
    {
      pcCoefMap[ui]  = CLEAR;
      if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
        rucScanPos = ui;
    }
    rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) = CLEAR;
  }

  //pcMbDataAccessBase->getMbData().setMbCbp( 0 );
  pcMbDataAccessBase->getMbTCoeffs().clear();
  pcMbDataAccessBase->getMbData().setTransformSize8x8( false );

  IntYuvMbBuffer cZeroBuffer;
  cZeroBuffer.setAllSamplesToZero();
  RNOK( m_pcBaseLayerSbb->getFullPelYuvBuffer()->loadBuffer( &cZeroBuffer ) );

  return Err::m_nOK;
}

ErrVal
FGSCoder::xUpdateMbMaps ( MbDataAccess*      pcMbDataAccessBL,
                          MbDataAccess*      pcMbDataAccessEL,
                          MbFGSCoefMap       &rcMbFGSCoefMap,
                          Int*               piRemainingTCoeff )
{
  for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx ++ ) {
    Bool bSigCBP = ( pcMbDataAccessEL->getMbData().getMbCbp() >> c8x8Idx.b8x8Index() ) & 1;

    rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) |= CODED; 
    if( bSigCBP )
      rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) |= SIGNIFICANT; 

    if( !bSigCBP ) {
      //===== set coefficient and block map =====
      for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
        CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(cIdx);

        rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;
        rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 
          (pcMbDataAccessEL->getMbData().isTransformSize8x8() && pcMbDataAccessEL->getSH().getPPS().getEntropyCodingModeFlag()) ? 64:16 ;

        for( UInt ui = 0; ui < 16; ui++ ) {
          if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
            pcCoefMap[ui] |= CODED;
            if( piRemainingTCoeff )
              *piRemainingTCoeff -= 1;
            rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ); 
          }
        }
      }
    }
    else {
      if( pcMbDataAccessBL->getMbData().isTransformSize8x8() && pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
      {
      }
      else if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
      {
        CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(c8x8Idx);
        for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
          UInt uiOffset = (cIdx.x() % 2) + (cIdx.y() %2) * 2;
          rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;

          // BCBP for the enhancement layer is set in pcMbDataAccessEL
          if(  pcMbDataAccessEL->getMbData().getBCBP( cIdx.b4x4() ) )
            rcMbFGSCoefMap.getB4x4Map( cIdx ) |= SIGNIFICANT;
          else {
            rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
            for( UInt ui = 0; ui < 16; ui++ ) {
              if( ! ( pcCoefMap[ui*4 + uiOffset] & SIGNIFICANT ) ) {
                pcCoefMap[ui*4 + uiOffset] |= CODED;
                if( piRemainingTCoeff )
                  *piRemainingTCoeff -= 1;
                rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ); 
              }
            }
          }
        }
      }
      else
      {
        for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ ) {
          CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap(cIdx);

          rcMbFGSCoefMap.getB4x4Map( cIdx ) |= CODED;

          // BCBP for the enhancement layer is set in pcMbDataAccessEL
          if(  pcMbDataAccessEL->getMbData().getBCBP( cIdx.b4x4() ) )
            rcMbFGSCoefMap.getB4x4Map( cIdx ) |= SIGNIFICANT;
          else {
            rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
            for( UInt ui = 0; ui < 16; ui++ ) {
              if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
                pcCoefMap[ui] |= CODED;
                if( piRemainingTCoeff )
                  *piRemainingTCoeff -= 1;
                rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ); 
              }
            }
          }
        }
      }
    }
  }

  if( ( pcMbDataAccessEL->getMbData().getMbCbp() >> 4 ) <= 1 ) {
    //----- chroma AC -----
    for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ ) {
      CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );

      rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) |= CODED; 
      rcMbFGSCoefMap.getChromaACScanPos( cCIdx ) = 16; 

      for( UInt ui = 1; ui < 16; ui++ ) {
        if( ! ( pcCoefMap[ui] & SIGNIFICANT ) ) {
          pcCoefMap[ui] |= CODED;
          if( piRemainingTCoeff )
            *piRemainingTCoeff -= 1;
          rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ); 
        }
      }
    }
  }

  if( ( pcMbDataAccessEL->getMbData().getMbCbp() >> 4 ) == 0 ) {
    //----- chroma DC -----
    for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
    {
      rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) |= CODED; 
      rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx ) = 4;

      for( UInt ui = 0; ui < 4; ui++ ) {
        CoefMap &cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( cCPlaneIdx ) + ui )[0];
 //       CoefMap cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( cCPlaneIdx ) + ui )[0];
        if( ! ( cCoefMap & SIGNIFICANT ) ) {
          cCoefMap |= CODED;
          if( piRemainingTCoeff )
            *piRemainingTCoeff -= 1;
          rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ); 
        }
      }
    }
  }

  return Err::m_nOK;
}


UInt 
FGSCoder::xDeriveComponentPosVectors( UInt*  puiRefPosVect,
                                      Int*   piMaxPosLuma,
                                      Int*   piMaxPosChromaAC,
                                      Int*   piMaxPosChromaDC,
                                      UInt   uiChromaStartCycle )
{
  Bool bAllowChromaDC, bAllowChromaAC;
  UInt uiCycle, uiNumFrags, uiFirstCycle, uiLastCycle;

  uiNumFrags = uiFirstCycle = 0;
  piMaxPosChromaAC[0] = 0;
  piMaxPosChromaDC[0] = -1;
  do {
    piMaxPosLuma[uiNumFrags] = puiRefPosVect[uiNumFrags];
    uiLastCycle = piMaxPosLuma[uiNumFrags];

    if( uiNumFrags > 0 ) {
      piMaxPosChromaAC[uiNumFrags] = piMaxPosChromaAC[uiNumFrags - 1];
      piMaxPosChromaDC[uiNumFrags] = piMaxPosChromaDC[uiNumFrags - 1];
    }

    // find the max position for chroma AC
    for( uiCycle = uiFirstCycle; uiCycle <= uiLastCycle; uiCycle ++ ) {
      bAllowChromaDC = (uiCycle == 0) || ((uiCycle >= uiChromaStartCycle) && ((uiCycle-uiChromaStartCycle) % 2 == 0));
      bAllowChromaAC = (uiCycle > 0) && ((uiCycle == uiChromaStartCycle) || ((uiCycle >= uiChromaStartCycle) && ((uiCycle-uiChromaStartCycle) % 3 == 1)));

      piMaxPosChromaDC[uiNumFrags] += bAllowChromaDC;
      if( piMaxPosChromaDC[uiNumFrags] > 3 )
        piMaxPosChromaDC[uiNumFrags] = 3;
      piMaxPosChromaAC[uiNumFrags] += bAllowChromaAC;
      if( piMaxPosChromaAC[uiNumFrags] > 15 )
        piMaxPosChromaAC[uiNumFrags] = 15;
    }

    uiFirstCycle = uiLastCycle + 1;
    uiNumFrags ++;
  } while( piMaxPosLuma[uiNumFrags - 1] < 15 );

  // dirty fix
  piMaxPosChromaDC[uiNumFrags - 1] = 3;
  piMaxPosChromaAC[uiNumFrags - 1] = 15;

  return uiNumFrags;
}


ErrVal
FGSCoder::xSetNumCoefficients( UInt               uiMbX, 
                               UInt               uiMbY,
                               MbFGSCoefMap       &rcMbFGSCoefMap,
                               UInt               uiMbCoeffsDecoded )
{
  // now partially it is set in xDecodeMbHeader, should be changed also
  rcMbFGSCoefMap.resetNumCoded();
  rcMbFGSCoefMap.increaseAndCheckNumCoded( uiMbCoeffsDecoded ); 
  if( uiMbCoeffsDecoded > 384 )
    return Err::m_nERR;
  else
    return Err::m_nOK;
}


H264AVC_NAMESPACE_END


⌨️ 快捷键说明

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