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

📄 fgssubbanddecoder.cpp

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

    Bool bNeedEob = ( uiScanIndex > uiStartIndex );
    UInt uiNumCoefRead;

    RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL,
      LUMA_SCAN, b8x8, rcIdx, uiScanIndex, bNeedEob, uiNumCoefRead ) );
    if(b8x8)
    {
      UInt    uiOffset = (rcIdx.y() % 2) * 2 + (rcIdx.x() % 2); 
      UInt    ui8x8ScanIndex = uiOffset + uiScanIndex * 4; 

      for ( UInt ui8x8 = 0; ui8x8ScanIndex < 64 && ( ui8x8 < uiNumCoefRead || bNeedEob ); ui8x8ScanIndex += 4 )
      {
        if( ! ( pcCoefMap[ui8x8ScanIndex] & SIGNIFICANT ) )
        {
          if( pcMbDataAccessEL->getMbTCoeffs().get8x8( c8x8Idx )[ g_aucFrameScan64[ui8x8ScanIndex] ] )
          {
            rcMbFGSCoefMap.getRefCtx( c8x8Idx )[ui8x8ScanIndex] = 1;
            pcCoefMap[ui8x8ScanIndex] |= SIGNIFICANT | NEWSIG;
          }
          pcCoefMap[ui8x8ScanIndex] |= CODED;
          RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
          ui8x8++;
        }
      }
      rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ui8x8ScanIndex / 4;
      while( ui8x8ScanIndex < 64 && ( pcCoefMap[ui8x8ScanIndex] & SIGNIFICANT ) )
      {
        ui8x8ScanIndex += 4;
        rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ui8x8ScanIndex / 4;
      }
    }
    else
    {
      const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
      for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
      {
        if( ! ( pcCoefMap[uiScanIndex] & SIGNIFICANT ) )
        {
          if( pcMbDataAccessEL->getMbTCoeffs().get( rcIdx )[pucScan[uiScanIndex]] )
          {
            rcMbFGSCoefMap.getRefCtx( rcIdx )[uiScanIndex] = 1;
            pcCoefMap[uiScanIndex] |= SIGNIFICANT | NEWSIG;
          }
          pcCoefMap[uiScanIndex] |= CODED;
          RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
          ui++;
        }
      }
      rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = uiScanIndex;
      while( uiScanIndex < 16 && ( pcCoefMap[uiScanIndex] & SIGNIFICANT ) )
        rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ++uiScanIndex;
    }
  }
  
  return Err::m_nOK;
}



ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaDC ( MbDataAccess* pcMbDataAccessBL,
                                              MbDataAccess* pcMbDataAccessEL,
                                              MbFGSCoefMap& rcMbFGSCoefMap,
                                              const CPlaneIdx &rcCPlaneIdx,
                                              Int&    riLastQP,
                                              UInt    uiChromaScanIndex )
{
  UInt    uiDCIdx    = 4;
  UInt    uiStartIdx = 4;
  UInt    uiIndex;
  for( uiIndex = 0; uiIndex < 4; uiIndex++ )
  {
    CoefMap cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiIndex )[0];
    if( ! (cCoefMap & SIGNIFICANT) || (cCoefMap & NEWSIG) )
    {
      uiStartIdx = uiIndex;
      break;
    }
  }
  uiDCIdx = rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx );
  ROTRS(uiDCIdx == 4, Err::m_nOK);
  ROTRS(uiDCIdx > uiChromaScanIndex, Err::m_nOK);

  Bool bNeedEob = ( uiDCIdx > uiStartIdx );

  if( !(rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) & CODED ) )
  {
    UInt  uiSymbol;
    RNOKS( m_pcSymbolReader->RQdecodeBCBP_ChromaDC( *pcMbDataAccessEL, *pcMbDataAccessBL, CIdx(rcCPlaneIdx), uiSymbol ) );
    Bool  bSigBCBP = uiSymbol != 0;
    rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) |= CODED;
    if(  bSigBCBP )
      rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) |= SIGNIFICANT;
    if( ! bSigBCBP )
    {
      rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = 4;
      for( CIdx cCIdx( rcCPlaneIdx ); cCIdx.isLegal( rcCPlaneIdx ); cCIdx++ )
      {
        CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
        if( !(rcCoefMap & SIGNIFICANT) )
        {
          rcCoefMap |= CODED;
          RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
        }
      }
      return Err::m_nOK;
    }
  }


  // Encode EOB marker?
  UInt uiNumCoefRead;
  RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
                                                     CHROMA_DC, CIdx(rcCPlaneIdx), uiDCIdx, bNeedEob, uiNumCoefRead ) );

  for ( UInt ui = 0; uiDCIdx < 4 && ( ui < uiNumCoefRead || bNeedEob ); uiDCIdx++ )
  {
    CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiDCIdx )[0];
    if( !(rcCoefMap & SIGNIFICANT) )
    {
      if( pcMbDataAccessEL->getMbTCoeffs().get( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] )
      {
        rcMbFGSCoefMap.getRefCtx( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] = 1;
        rcCoefMap |= SIGNIFICANT | NEWSIG;
      }
      rcCoefMap |= CODED;
      RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
      ui++;
    }
  }
  rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = uiDCIdx;
  while( (rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] & SIGNIFICANT ) && uiDCIdx < 4 )
    rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = ++uiDCIdx;
  
  return Err::m_nOK;
}






ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaAC ( MbDataAccess* pcMbDataAccessBL,
                                              MbDataAccess* pcMbDataAccessEL,
                                              MbFGSCoefMap& rcMbFGSCoefMap,
                                              const CIdx   &rcCIdx,
                                              Int&    riLastQP,
                                              UInt    uiChromaScanIndex,
                                              Bool    bFrame )
{
  UInt    uiScanIndex  = 16;
  UInt    uiStartIndex = 1;
  UInt    uiIndex;
  CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( rcCIdx );
  for( uiIndex = 1; uiIndex < 16; uiIndex++ )
  {
    if( !(pcCoefMap[uiIndex] & SIGNIFICANT) || (pcCoefMap[uiIndex] & NEWSIG) )
    {
      uiStartIndex = uiIndex;
      break;
    }
  }
  uiScanIndex = rcMbFGSCoefMap.getChromaACScanPos( rcCIdx );
  ROTRS(uiScanIndex == 16, Err::m_nOK);
  ROTRS(uiScanIndex > uiChromaScanIndex, Err::m_nOK);

  Bool bNeedEob = (uiScanIndex > uiStartIndex );

  if( !(rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) & CODED ) )
  {
    UInt  uiSymbol;
    RNOKS( m_pcSymbolReader->RQdecodeBCBP_ChromaAC( *pcMbDataAccessEL, *pcMbDataAccessBL, rcCIdx, uiSymbol ) );
    Bool  bSigBCBP = uiSymbol != 0;
    rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) |= CODED;
    if(  bSigBCBP )
    {
      rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) |= SIGNIFICANT;
    }
    if( ! bSigBCBP )
    {
      rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = 16;
      CoefMap *pcCoefMap2 = rcMbFGSCoefMap.getCoefMap( rcCIdx );
      for( UInt ui = 1; ui < 16; ui++ )
      {
        if( !(pcCoefMap2[ui] & SIGNIFICANT) )
        {
          pcCoefMap2[ui] |= CODED;
          RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
        }
      }
      return Err::m_nOK;
    }
  }


  UInt uiNumCoefRead;
  RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
                                                     CHROMA_AC, rcCIdx, uiScanIndex, bNeedEob, uiNumCoefRead ) );

  const UChar*  pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
  for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
  {
    if( !(pcCoefMap[uiScanIndex] & SIGNIFICANT) )
    {
      if( pcMbDataAccessEL->getMbTCoeffs().get( rcCIdx )[pucScan[uiScanIndex]] )
      {
        rcMbFGSCoefMap.getRefCtx( rcCIdx )[uiScanIndex] = 1;
        pcCoefMap[uiScanIndex] |= SIGNIFICANT | NEWSIG;
      }
      pcCoefMap[uiScanIndex] |= CODED;
      RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
      ui++;
    }
  }
  rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = uiScanIndex;
  while( (pcCoefMap[uiScanIndex] & SIGNIFICANT ) && uiScanIndex < 16 )
    rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = ++uiScanIndex;
  
  return Err::m_nOK;
}







ErrVal
RQFGSDecoder::xDecodeCoefficientLumaRef( MbDataAccess* pcMbDataAccessBL,
                                         MbDataAccess* pcMbDataAccessEL,
                                         MbFGSCoefMap  &rcMbFGSCoefMap,
                                         const S4x4Idx &rcIdx,
                                         UInt   uiScanIndex )
{
  B8x8Idx c8x8Idx( rcIdx.getContainingPar8x8() );
  CoefMap* pcCoefMap;
  RefCtx*  pcRefCtx;
  if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
  {
    uiScanIndex = 4*uiScanIndex + (rcIdx.s4x4() & 3); // convert scan index into 8x8 scan index
    pcCoefMap = &rcMbFGSCoefMap.getCoefMap( c8x8Idx )[uiScanIndex];
    pcRefCtx  = &rcMbFGSCoefMap.getRefCtx( c8x8Idx )[uiScanIndex];
  }
  else
  {
    pcCoefMap = &rcMbFGSCoefMap.getCoefMap( rcIdx )[uiScanIndex];
    pcRefCtx  = &rcMbFGSCoefMap.getRefCtx( rcIdx )[uiScanIndex];
  }

  //===== check if coefficient is not significant or was already coded =====
  ROFRS( *pcCoefMap & SIGNIFICANT, Err::m_nOK );
  ROTRS( *pcCoefMap & CODED,       Err::m_nOK );

  Int iCoeff;
  
  if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
  {
    RNOKS( m_pcSymbolReader->RQdecodeTCoeffRef_8x8( *pcMbDataAccessEL, *pcMbDataAccessBL, c8x8Idx, uiScanIndex, *pcRefCtx ) );

    iCoeff = pcMbDataAccessEL->getMbTCoeffs().get8x8( c8x8Idx )[g_aucFrameScan64[uiScanIndex]];
    if( pcMbDataAccessBL->getMbTCoeffs().get8x8( c8x8Idx )[g_aucFrameScan64[uiScanIndex]] < 0 )
      iCoeff = -iCoeff;
  }
  else
  {
    RNOKS( m_pcSymbolReader->RQdecodeTCoeffRef_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL, rcIdx, uiScanIndex, *pcRefCtx ) );

    iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( rcIdx )[g_aucFrameScan[uiScanIndex]];
    if( pcMbDataAccessBL->getMbTCoeffs().get( rcIdx )[g_aucFrameScan[uiScanIndex]] < 0 )
      iCoeff = - iCoeff;
  }
  (*pcRefCtx) <<= 2;
  if( iCoeff < 0 )
    (*pcRefCtx)+= 2;
  else if( iCoeff > 0 )
    (*pcRefCtx)++;


  *pcCoefMap |= CODED;

  RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );

  return Err::m_nOK;
}


ErrVal
RQFGSDecoder::xDecodeCoefficientChromaDCRef ( MbDataAccess    *pcMbDataAccessBL,
                                              MbDataAccess    *pcMbDataAccessEL,
                                              MbFGSCoefMap    &rcMbFGSCoefMap,
                                              const CPlaneIdx &rcCPlaneIdx,
                                              UInt  uiDCIdx )
{
  CIdx cCIdx = CIdx( rcCPlaneIdx ) + uiDCIdx;
  CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
  ROF( rcCoefMap & SIGNIFICANT );
  ROT( rcCoefMap & CODED       );

  RefCtx &rcRefCtx = rcMbFGSCoefMap.getRefCtx( cCIdx )[0];
  
  RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
    CHROMA_DC, CIdx(rcCPlaneIdx), uiDCIdx, rcRefCtx ) );
  Int iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( cCIdx )[0];
  if( pcMbDataAccessBL->getMbTCoeffs().get( cCIdx )[0] < 0 )
    iCoeff = -iCoeff;

  rcRefCtx <<= 2;
  if( iCoeff < 0 )
    rcRefCtx += 2;
  else if( iCoeff > 0 )
    rcRefCtx++;

  rcCoefMap |= CODED;
  RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
  return Err::m_nOK;
}
 

ErrVal
RQFGSDecoder::xDecodeCoefficientChromaACRef ( MbDataAccess  *pcMbDataAccessBL,
                                              MbDataAccess  *pcMbDataAccessEL,
                                              MbFGSCoefMap  &rcMbFGSCoefMap,
                                              const CIdx    &rcCIdx,
                                              UInt  uiScanIdx )
{
  CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( rcCIdx )[uiScanIdx];
  ROF( rcCoefMap & SIGNIFICANT );
  ROT( rcCoefMap & CODED       );
  
  RefCtx &rcRefCtx = rcMbFGSCoefMap.getRefCtx( rcCIdx )[uiScanIdx];
  
  RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
    CHROMA_AC, rcCIdx, uiScanIdx, rcRefCtx ) );
  Int iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( rcCIdx )[g_aucFrameScan[uiScanIdx]];
  if( pcMbDataAccessBL->getMbTCoeffs().get( rcCIdx )[g_aucFrameScan[uiScanIdx]] < 0 )
    iCoeff = -iCoeff;

  rcRefCtx <<= 2;
  if( iCoeff < 0 )
    rcRefCtx += 2;
  else if( iCoeff > 0 )
    rcRefCtx++;

  rcCoefMap |= CODED;
  RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );

  return Err::m_nOK;
}


H264AVC_NAMESPACE_END

⌨️ 快捷键说明

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