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

📄 fgscoder.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
      if( b8x8Transform )
      {
          if( pcMbDataAccess->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 ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
            }
          }
          else
          {
          for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
          {
            rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
            rcMbFGSCoefMap.getB4x4Map( cIdx ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
          }
          }
          //===== set transform coefficients =====
          CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
        TCoeff* piCoeff         = rcMbData.getMbTCoeffs().get8x8( c8x8Idx );
        for( UInt ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
        {
            if( 0 != piCoeff[g_aucFrameScan64[ui8x8ScanIndex]] )
          {
              pcCoefMap[ui8x8ScanIndex] = SIGNIFICANT;
            if (piCoeff[g_aucFrameScan64[ui8x8ScanIndex]] < 0)
                pcCoefMap[ui8x8ScanIndex] |= BASE_SIGN;
          }
            if( pcMbDataAccess->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++ )
        {
          TCoeff* piCoeff     = rcMbData.getMbTCoeffs().get( cIdx );
          UChar   ucBlockSig  = CLEAR;

            UChar& rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
            rucScanPos = 16;
            CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
          //===== set transform coefficients =====
          for( UInt uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
          {
            if( piCoeff[g_aucFrameScan[uiScanIndex]] )
            {
                pcCoefMap[uiScanIndex]  = SIGNIFICANT;
              ucBlockSig                                  = SIGNIFICANT;

              if (piCoeff[g_aucFrameScan[uiScanIndex]] < 0)
                  pcCoefMap[uiScanIndex] |= BASE_SIGN;
            }

              if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
                rucScanPos = uiScanIndex;
          }

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

    //--- CHROMA DC ---
      for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
    {
      UChar   ucBlockSig  = CLEAR;
        UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
        rucScanPos = 4;
        for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
        {
          TCoeff   iCoeff    = rcMbData.getMbTCoeffs().get( cCIdx )[0];
          CoefMap& rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
          if( 0 != iCoeff )
        {
            rcCoefMap  = SIGNIFICANT;
          ucBlockSig                                      = SIGNIFICANT;

            if( iCoeff < 0 )
              rcCoefMap |= BASE_SIGN;
        }

          if( !( rcCoefMap & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
            rucScanPos = cCIdx&3;
      }
        rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = ucBlockSig;
    }
    //--- CHROMA AC ---
    for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
    {
      TCoeff* piCoeff     = rcMbData.getMbTCoeffs().get( cCIdx );
      UChar   ucBlockSig  = CLEAR;
        CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
        UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
        rucScanPos = 16;
      for( UInt ui = 1; ui < 16; ui++ )
      {
        if( piCoeff[g_aucFrameScan[ui]] )
        {
            pcCoefMap[ui] = SIGNIFICANT;
          ucBlockSig                                            = SIGNIFICANT;
          if (piCoeff[g_aucFrameScan[ui]] < 0)
              pcCoefMap[ui] |= BASE_SIGN;
        }

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

	//--ICU/ETRI FMO Implementation
    if(pcSliceHeader !=NULL)
      uiMbAddress = pcSliceHeader->getFMO()->getNextMBNr(uiMbAddress );
    else
      uiMbAddress ++;
  }
  }

  return Err::m_nOK;
}


// FGS FMO ICU/ETRI
ErrVal
FGSCoder::xUpdateCodingPath(SliceHeader* pcSliceHeader)
{
  //--ICU/ETRI FMO Implementation 1206
  UInt uiFirstMbInSlice;
  UInt uiLastMbInSlice;

  if(pcSliceHeader !=NULL)
  {
    uiFirstMbInSlice  = pcSliceHeader->getFirstMbInSlice();
    uiLastMbInSlice  = pcSliceHeader->getLastMbInSlice();  
  }
  else
  {
    uiFirstMbInSlice =0;
    uiLastMbInSlice  = (m_uiWidthInMB*m_uiHeightInMB) -1;

  }

  for(UInt uiMbAddress= uiFirstMbInSlice ;uiMbAddress<=uiLastMbInSlice ;)
  {
    UInt uiMbY  = uiMbAddress / m_uiWidthInMB;
    UInt uiMbX  = uiMbAddress % m_uiWidthInMB;

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

    //--ICU/ETRI FMO Implementation
    if(pcSliceHeader !=NULL)
      uiMbAddress = pcSliceHeader->getFMO()->getNextMBNr(uiMbAddress );
    else
      uiMbAddress ++;

  }
  return Err::m_nOK;
}



ErrVal
FGSCoder::xInitializeCodingPath()
{
	//===== loop over macroblocks =====
  for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
  for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB;  uiMbX++ )
  {
    MbDataAccess* pcMbDataAccess = 0;
    RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
    
    const Bool bFrame = (FRAME == pcMbDataAccess->getMbPicType());
    
    MbData& rcMbData        = pcMbDataAccess->getMbData();
    UInt    uiMbIndex       = uiMbY * m_uiWidthInMB + uiMbX;
    Bool    bIntra4x4       =     rcMbData.isIntra4x4   ();
    Bool    bIntra16x16     =     rcMbData.isIntra16x16 ();
    Bool    bIsSignificant  = (   rcMbData.getMbCbp()          > 0 );
    Bool    bIsSigLuma      = ( ( rcMbData.getMbCbp() & 0x0F ) > 0 );
    Bool    b8x8Present     = (   pcMbDataAccess->getSH().getPPS().getTransform8x8ModeFlag() &&
                                  rcMbData.is8x8TrafoFlagPresent( pcMbDataAccess->getSH().getSPS().getDirect8x8InferenceFlag()) );
    Bool    b8x8Transform   = ( b8x8Present && ( bIsSigLuma || bIntra4x4 ) && rcMbData.isTransformSize8x8() );
    UInt    uiMbCbp         = pcMbDataAccess->getAutoCbp();

    if( ! pcMbDataAccess->getMbData().isIntra() )
      pcMbDataAccess->getMbData().activateMotionRefinement();
    //===== set macroblock mode =====
    MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];

    rcMbFGSCoefMap.resetNumCoded();
    rcMbFGSCoefMap.resetMbRefCtx();
    rcMbFGSCoefMap.resetMbCoefMap();

    rcMbFGSCoefMap.getMbMap() = ( bIntra16x16 || bIsSignificant                           ? SIGNIFICANT         : CLEAR )
                                   +  ( bIntra16x16 || bIntra4x4 || bIsSigLuma || !b8x8Present  ? TRANSFORM_SPECIFIED : CLEAR );
    //--- LUMA ---
    for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
    {
      rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
      if( b8x8Transform )
      {
        TCoeff* piCoeff         = rcMbData.getMbTCoeffs().get8x8( c8x8Idx );

        if( pcMbDataAccess->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 ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
          }
        }
        else
        {
        for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
        {
          rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
          rcMbFGSCoefMap.getB4x4Map( cIdx ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
        }
        }
        const UChar*  pucScan64 = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;

        CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap(c8x8Idx);
        //===== set transform coefficients =====
        for( UInt ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
        {
          if( 0 != piCoeff[pucScan64[ui8x8ScanIndex]] )
          {
            pcCoefMap[ui8x8ScanIndex] = SIGNIFICANT;
            if( piCoeff[pucScan64[ui8x8ScanIndex]] < 0 )
              pcCoefMap[ui8x8ScanIndex] |= BASE_SIGN;
          }

          if( pcMbDataAccess->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
      {
        const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
        for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
        {
          TCoeff* piCoeff     = rcMbData.getMbTCoeffs().get( cIdx );
          UChar   ucBlockSig  = CLEAR;

          UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
          rucScanPos = 16;
          CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
          //===== set transform coefficients =====
          for( UInt uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
          {
            if( piCoeff[pucScan[uiScanIndex]] )
            {
              pcCoefMap[uiScanIndex] = SIGNIFICANT;
              ucBlockSig                                  = SIGNIFICANT;
              if (piCoeff[pucScan[uiScanIndex]] < 0)
                pcCoefMap[uiScanIndex] |= BASE_SIGN;
            }

            if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
              rucScanPos = uiScanIndex;
          }

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


    //--- CHROMA DC ---
    for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
    {
      UChar   ucBlockSig  = CLEAR;
      UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
      rucScanPos = 4;
      for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
      {
        TCoeff   iCoeff    = rcMbData.getMbTCoeffs().get( cCIdx )[0];
        CoefMap& rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
        if( iCoeff )
        {
          rcCoefMap  = SIGNIFICANT;
          ucBlockSig                                      = SIGNIFICANT;

          if( iCoeff < 0 )
            rcCoefMap |= BASE_SIGN;
        }

        if( !( rcCoefMap & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
          rucScanPos = cCIdx&3;
      }
      rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = ucBlockSig;
    }

    const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
    //--- CHROMA AC ---
    for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
    {
      TCoeff* piCoeff     = rcMbData.getMbTCoeffs().get( cCIdx );
      CoefMap* pcCoefMap  = rcMbFGSCoefMap.getCoefMap( cCIdx );
      UChar   ucBlockSig  = CLEAR;
      UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
      rucScanPos = 16;
      for( UInt ui = 1; ui < 16; ui++ )
      {
        if( piCoeff[pucScan[ui]] )
        {

⌨️ 快捷键说明

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