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

📄 mbdecoder.cpp

📁 JVT-Z203_jsvm.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  RNOK( rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPicIdcs( rcMbDataAccess.getSH().getRefFrameList( rcMbDataAccess.getMbPicType(), LIST_1 ) ) );

  return Err::m_nOK;
}


ErrVal
MbDecoder::calcMv( MbDataAccess& rcMbDataAccess,
                   MbDataAccess* pcMbDataAccessBaseMotion )
{
  if( rcMbDataAccess.getMbData().getBLSkipFlag() )
  {
    return Err::m_nOK;
  }

  if( rcMbDataAccess.getMbData().getMbMode() == INTRA_4X4 )
  {
    //----- intra prediction -----
    rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( BLOCK_NOT_PREDICTED );
    rcMbDataAccess.getMbMotionData( LIST_0 ).setAllMv ( Mv::ZeroMv() );
    rcMbDataAccess.getMbMotionData( LIST_1 ).setRefIdx( BLOCK_NOT_PREDICTED );
    rcMbDataAccess.getMbMotionData( LIST_1 ).setAllMv ( Mv::ZeroMv() );
  }
  else
  {
    if( rcMbDataAccess.getMbData().getMbMode() == MODE_8x8 || rcMbDataAccess.getMbData().getMbMode() == MODE_8x8ref0 )
    {
      for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
      {
        //----- motion compensated prediction -----
        RNOK( m_pcMotionCompensation->calcMvSubMb( c8x8Idx, rcMbDataAccess, pcMbDataAccessBaseMotion ) );
      }
    }
    else
    {
      //----- motion compensated prediction -----
      RNOK( m_pcMotionCompensation->calcMvMb( rcMbDataAccess, pcMbDataAccessBaseMotion ) );
    }
  }

  return Err::m_nOK;
}



ErrVal
MbDecoder::xDecodeMbPCM( MbDataAccess& rcMbDataAccess, YuvPicBuffer *pcRecYuvBuffer )
{
  Pel*  pucSrc  = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
  XPel* pucDest = pcRecYuvBuffer->getMbLumAddr();
  Int   iStride = pcRecYuvBuffer->getLStride();
  Int   iDelta = 1;
  Int   n, m, n1, m1, dest;

  for( n = 0; n < 16; n+=iDelta )
  {
    for( m = 0; m < 16; m+=iDelta )
    {
      dest = *pucSrc++;

      for( n1=0; n1< +iDelta; n1++ )
      for( m1=m; m1<m+iDelta; m1++ )
      {
        pucDest[m1+n1*iStride] = dest;
      }
    }
    pucDest += iDelta*iStride;
  }

  pucDest = pcRecYuvBuffer->getMbCbAddr();
  iStride = pcRecYuvBuffer->getCStride();

  for( n = 0; n < 8; n+=iDelta )
  {
    for( m = 0; m < 8; m+=iDelta )
    {
      dest = *pucSrc++;

      for( n1=0; n1< +iDelta; n1++ )
      for( m1=m; m1<m+iDelta; m1++ )
      {
        pucDest[m1+n1*iStride] = dest;
      }
    }
    pucDest += iDelta*iStride;
  }

  pucDest = pcRecYuvBuffer->getMbCrAddr();

  for( n = 0; n < 8; n+=iDelta )
  {
    for( m = 0; m < 8; m+=iDelta )
    {
      dest = *pucSrc++;

      for( n1=0; n1< +iDelta; n1++ )
      for( m1=m; m1<m+iDelta; m1++ )
      {
        pucDest[m1+n1*iStride] = dest;
      }
    }
    pucDest += iDelta*iStride;
  }


  return Err::m_nOK;
}


ErrVal
MbDecoder::xDecodeMbInter( MbDataAccess&  rcMbDataAccess,
                           MbDataAccess*  pcMbDataAccessBase,
                           YuvMbBuffer&   rcPredBuffer,
                           YuvPicBuffer*  pcRecYuvBuffer,
                           Frame*         pcResidual,
                           Frame*         pcBaseResidual,
                           RefFrameList&  rcRefFrameList0,
                           RefFrameList&  rcRefFrameList1,
                           Bool           bReconstruct,
                           Frame*         pcBaseLayerRec )
{
  YuvMbBuffer      cYuvMbBuffer;         cYuvMbBuffer        .setAllSamplesToZero();
  YuvMbBuffer      cYuvMbBufferResidual; cYuvMbBufferResidual.setAllSamplesToZero();
  MbTransformCoeffs&  rcCoeffs        = m_cTCoeffs;
  Bool                bCalcMv         = false;
  Bool                bFaultTolerant  = true;

  //===== derive motion vectors =====
  calcMv( rcMbDataAccess, pcMbDataAccessBase );

#ifdef SHARP_AVC_REWRITE_OUTPUT
  return Err::m_nOK;
#endif

  //===== get prediction signal when full reconstruction is requested =====
  if( bReconstruct )
  {
    if( rcMbDataAccess.getMbData().getMbMode() == MODE_8x8 || rcMbDataAccess.getMbData().getMbMode() == MODE_8x8ref0 )
    {
      for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
      {
        //----- motion compensated prediction -----
        RNOK( m_pcMotionCompensation->compensateSubMb ( c8x8Idx,
                                                        rcMbDataAccess, rcRefFrameList0, rcRefFrameList1,
                                                        &cYuvMbBuffer, bCalcMv, bFaultTolerant ) );
      }
    }
    else
    {
      //----- motion compensated prediction -----
      RNOK(   m_pcMotionCompensation->compensateMb    ( rcMbDataAccess,
                                                        rcRefFrameList0,
                                                        rcRefFrameList1,
                                                        &cYuvMbBuffer,
                                                        bCalcMv ) );
    }
    if(pcBaseLayerRec)
    {
      RNOK(m_pcMotionCompensation->compensateMbBLSkipIntra(rcMbDataAccess, &cYuvMbBuffer, pcBaseLayerRec));
    }
    rcPredBuffer.loadLuma   ( cYuvMbBuffer );
    rcPredBuffer.loadChroma ( cYuvMbBuffer );
  }

  //===== add base layer residual =====
  if( rcMbDataAccess.isSCoeffPred() )
  {
    rcCoeffs.add( &pcMbDataAccessBase->getMbData().getMbTCoeffs() );            
    rcMbDataAccess.getMbTCoeffs().copyFrom(rcCoeffs);     // store the sum of the coefficients and base layer coefficients      
  }
  else if( rcMbDataAccess.isTCoeffPred() )
  {
    pcMbDataAccessBase->getMbData().getMbTCoeffs().clearLumaLevels();
  }

  //===== reconstruct residual signal by using transform coefficients ======
  m_pcTransform->setClipMode( false );
  if( rcMbDataAccess.getMbData().isTransformSize8x8() )
  {
    for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
    {
      RNOK( m_pcTransform->invTransform8x8Blk( cYuvMbBufferResidual.getYBlk( cIdx ),
                                               cYuvMbBufferResidual.getLStride(),
                                               rcCoeffs.get8x8(cIdx) ) );
    }
  }
  else
  {
    for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
    {
      RNOK( m_pcTransform->invTransform4x4Blk( cYuvMbBufferResidual.getYBlk( cIdx ),
                                               cYuvMbBufferResidual.getLStride(),
                                               rcCoeffs.get(cIdx) ) );
    }
  }

  UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
  RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBufferResidual, rcPredBuffer, uiChromaCbp, false ) );
  m_pcTransform->setClipMode( true );


  //===== add base layer residual =====
  YuvMbBuffer cBaseLayerResidual;
  if( rcMbDataAccess.getMbData().getResidualPredFlag() )
  {
    if( rcMbDataAccess.isSCoeffPred() )
    {
      rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs().copyPredictionTo( cBaseLayerResidual );
    }
    else
    {
      cBaseLayerResidual.loadBuffer( pcBaseResidual->getFullPelYuvBuffer() );
    }
  }
  else
  {
    cBaseLayerResidual.setAllSamplesToZero();
  }
  cYuvMbBufferResidual.add( cBaseLayerResidual );

  //===== store spatially predicted residual =====
  rcMbDataAccess.getMbTCoeffs().copyPredictionFrom( cBaseLayerResidual );

  //===== reconstruct signal =====
  if( bReconstruct )
  {
    cYuvMbBuffer.add( cYuvMbBufferResidual );
    cYuvMbBuffer.clip();
  }

  //===== store reconstructed residual =====
  if( pcResidual )
  {
    RNOK( pcResidual->getFullPelYuvBuffer()->loadBuffer( &cYuvMbBufferResidual ) );
  }

  //===== store reconstructed signal =====
  if( pcRecYuvBuffer )
  {
    RNOK( pcRecYuvBuffer->loadBuffer( &cYuvMbBuffer ) );
  }

  return Err::m_nOK;
}



ErrVal
MbDecoder::xDecodeMbIntra4x4( MbDataAccess&  rcMbDataAccess,
                              YuvMbBuffer&   cYuvMbBuffer,
                              YuvMbBuffer&   rcPredBuffer )
{
#ifndef SHARP_AVC_REWRITE_OUTPUT //JV: not clean at all -> to remove compilation warnings
	Int  iStride = cYuvMbBuffer.getLStride();
  MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
#endif //JV: not clean at all -> to remove compilation warnings

  for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
  {
    if( !rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag() )
      rcMbDataAccess.getMbData().intraPredMode( cIdx ) = rcMbDataAccess.decodeIntraPredMode( cIdx );
#ifndef SHARP_AVC_REWRITE_OUTPUT
	XPel* puc = cYuvMbBuffer.getYBlk( cIdx );

    UInt uiPredMode = rcMbDataAccess.getMbData().intraPredMode( cIdx );
    RNOK( m_pcIntraPrediction->predictLumaBlock( puc, iStride, uiPredMode, cIdx ) );

    rcPredBuffer.loadLuma( cYuvMbBuffer, cIdx );

    if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
    {
      RNOK( m_pcTransform->invTransform4x4Blk( puc, iStride, rcCoeffs.get( cIdx ) ) );
    }
#endif
  }

  UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
  RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBuffer, rcPredBuffer, uiChromaCbp, true ) );

  return Err::m_nOK;
}


ErrVal
MbDecoder::xDecodeMbIntra8x8( MbDataAccess& rcMbDataAccess,
                              YuvMbBuffer&  cYuvMbBuffer,
                              YuvMbBuffer&  rcPredBuffer )
{
#ifndef SHARP_AVC_REWRITE_OUTPUT //JV : Not clean at all -> to remove compilation warnings
	Int  iStride = cYuvMbBuffer.getLStride();
    MbTransformCoeffs& rcCoeffs = m_cTCoeffs;
#endif //JV : Not clean at all

  for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
  {
    if( !rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getSH().getTCoeffLevelPredictionFlag() )
    {
      Int iPredMode = rcMbDataAccess.decodeIntraPredMode( cIdx );
      for( S4x4Idx cIdx4x4( cIdx ); cIdx4x4.isLegal( cIdx ); cIdx4x4++ )
      {
        rcMbDataAccess.getMbData().intraPredMode( cIdx4x4 ) = iPredMode;
      }
    }
#ifndef SHARP_AVC_REWRITE_OUTPUT
    XPel* puc = cYuvMbBuffer.getYBlk( cIdx );

    const UInt uiPredMode = rcMbDataAccess.getMbData().intraPredMode( cIdx );

    RNOK( m_pcIntraPrediction->predictLuma8x8Block( puc, iStride, uiPredMode, cIdx ) );

    rcPredBuffer.loadLuma( cYuvMbBuffer, cIdx );

    if( rcMbDataAccess.getMbData().is4x4BlkCoded( cIdx ) )
    {
      RNOK( m_pcTransform->invTransform8x8Blk( puc, iStride, rcCoeffs.get8x8( cIdx ) ) );
    }
#endif
  }

  UInt uiChromaCbp = rcMbDataAccess.getMbData().getCbpChroma4x4();
  RNOK( xDecodeChroma( rcMbDataAccess, cYuvMbBuffer, rcPredBuffer, uiChromaCbp, true ) );

  return Err::m_nOK;
}



ErrVal
MbDecoder::xDecodeMbIntraBL( MbDataAccess&  rcMbDataAccess,
                             YuvPicBuffer*  pcRecYuvBuffer,
                             YuvMbBuffer&   rcPredBuffer,
                             YuvPicBuffer*  pcBaseYuvBuffer )
{
#ifdef SHARP_AVC_REWRITE_OUTPUT
  return Err::m_nOK;
#endif
  YuvMbBuffer      cYuvMbBuffer;
  MbTransformCoeffs&  rcCoeffs = m_cTCoeffs;

  Bool bAddBaseCoeffs = false;
  if( rcMbDataAccess.getSH().getSCoeffResidualPredFlag() )
  {
    rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs().copyPredictionTo( cYuvMbBuffer );
    bAddBaseCoeffs = rcMbDataAccess.getMbDataAccessBase()->getMbData().isIntraBL();
    if( bAddBaseCoeffs )
    {
      rcCoeffs.add( &rcMbDataAccess.getMbDataAccessBase()->getMbTCoeffs(), true, false );
    }
  }
  else
  {
    cYuvMbBuffer.loadBuffer ( pcBaseYuvBuffer );
  }
  rcPredBuffer.loadLuma   ( cYuvMbBuffer );
  rcPredBuffer.loadChroma ( cYuvMbBuffer );

  if( rcMbDataAccess.getMbData().isTransformSize8x8() )
  {
    for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
    {
      RNOK( m_pcTransform->invTransform8x8Blk( cYuvMbBuffer.getYBlk( cIdx ),
                                               cYuvMbBuffer.getLStride(),
                                               rcCoeffs.get8x8(cIdx) ) );
    }
  }
  else
  {
    for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
    {

⌨️ 快捷键说明

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