Exemple #1
0
ErrVal
SliceEncoder::updateBaseLayerResidual( ControlData&     rcControlData,
                                         UInt          uiMbInRow )
{
  ROF( m_bInitDone );

  SliceHeader&  rcSliceHeader         = *rcControlData.getSliceHeader           ();
  MbDataCtrl*   pcMbDataCtrl          =  rcControlData.getMbDataCtrl            ();
  MbDataCtrl*   pcBaseLayerCtrl       =  rcControlData.getBaseLayerCtrl         ();
  Frame*     pcBaseLayerSbb        =  rcControlData.getBaseLayerSbb         ();
  UInt          uiMbAddress           =  0;
  UInt          uiLastMbAddress       =  rcSliceHeader.getMbInPic() - 1;

  //====== initialization ======
  RNOK( pcMbDataCtrl->initSlice( rcSliceHeader, DECODE_PROCESS, false, NULL ) );

  for( ; uiMbAddress <= uiLastMbAddress; )
  {
    UInt          uiMbY               = uiMbAddress / uiMbInRow;
    UInt          uiMbX               = uiMbAddress % uiMbInRow;
    MbDataAccess* pcMbDataAccess      = 0;
    MbDataAccess* pcMbDataAccessBase  = 0;

    RNOK( pcMbDataCtrl      ->initMb          ( pcMbDataAccess,     uiMbY, uiMbX ) );
    if( pcBaseLayerCtrl )
    {
      RNOK( pcBaseLayerCtrl ->initMb          ( pcMbDataAccessBase, uiMbY, uiMbX ) );
      //pcMbDataAccess->setMbDataAccessBase( pcMbDataAccessBase );
    }

    // Update the state of the baselayer residual data -- it may be reused in subsequent layers - [email protected]
    if( !pcMbDataAccess->getMbData().getResidualPredFlag() )
    {
      if( pcBaseLayerSbb && ( pcMbDataAccess->getMbData().isIntra() || ! pcMbDataAccess->getMbData().getResidualPredFlag() ) )
      {
        YuvPicBuffer* pcBaseResidual = pcBaseLayerSbb->getFullPelYuvBuffer();

        pcBaseResidual->getBufferCtrl().initMb( uiMbY, uiMbX, false);
        pcBaseResidual->clearCurrMb();
      }
    }

    uiMbAddress++;
  }

  return Err::m_nOK;
}
ErrVal MbDecoder::process( MbDataAccess& rcMbDataAccess,
                           Bool          bReconstructAll )
{
  ROF( m_bInitDone );

  RNOK( xScaleTCoeffs( rcMbDataAccess ) );

  YuvPicBuffer *pcRecYuvBuffer;
  RNOK( m_pcFrameMng->getRecYuvBuffer( pcRecYuvBuffer ) );

  IntYuvMbBuffer  cPredIntYuvMbBuffer;
  IntYuvMbBuffer  cResIntYuvMbBuffer;
  YuvMbBuffer     cYuvMbBuffer;
  

  if( rcMbDataAccess.getMbData().isPCM() )
  {
    RNOK( xDecodeMbPCM( rcMbDataAccess, cYuvMbBuffer ) );
    cResIntYuvMbBuffer .setAllSamplesToZero();
    cPredIntYuvMbBuffer.loadBuffer( &cYuvMbBuffer );
  }
  else
  {
    if( rcMbDataAccess.getMbData().isIntra() )
    {
      m_pcIntraPrediction->setAvailableMaskMb( rcMbDataAccess.getAvailableMask() );
      cResIntYuvMbBuffer.loadIntraPredictors( pcRecYuvBuffer );
  
      if( rcMbDataAccess.getMbData().isIntra4x4() )
      {
        if( rcMbDataAccess.getMbData().isTransformSize8x8() )
        {
          RNOK( xDecodeMbIntra8x8( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
        }
        else
        {
          RNOK( xDecodeMbIntra4x4( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
        }
      }
      else
      {
        RNOK( xDecodeMbIntra16x16( rcMbDataAccess, cResIntYuvMbBuffer, cPredIntYuvMbBuffer ) );
      }
      cYuvMbBuffer.loadBuffer( &cResIntYuvMbBuffer );
    }
    else
    {
      RNOK( xDecodeMbInter( rcMbDataAccess, cYuvMbBuffer, cPredIntYuvMbBuffer, cResIntYuvMbBuffer, bReconstructAll ) );
    }
  }
  pcRecYuvBuffer->loadBuffer( &cYuvMbBuffer );


  {
	  B4x4Idx cdx;
	  XPel* puc = cResIntYuvMbBuffer.getYBlk(cdx);
	  for (int i = 0; i < 16; ++i)
	  {
			for (int j = 0; j < 16; ++j)
			{
				printf("%4d", puc[i*24+j]);
			}
			printf("\n");
	  }
	  printf("\n");
  }

  return Err::m_nOK;
  
}
ErrVal
ReconstructionBypass::padRecFrame( Frame*             pcFrame,
                                   const MbDataCtrl*  pcMbDataCtrl,
                                   ResizeParameters*  pcResizeParameters,
                                   UInt               uiSliceId /* = MSYS_UINT_MAX */ )
{
  ROF( pcFrame );
  ROF( pcMbDataCtrl );
  ROF( pcResizeParameters );

  RNOK( pcFrame->addFrameFieldBuffer() );

  UInt    uiFrmWidth  =   pcResizeParameters->m_iRefLayerFrmWidth  >> 4;
  UInt    uiFrmHeight =   pcResizeParameters->m_iRefLayerFrmHeight >> ( pcResizeParameters->m_bRefLayerFieldPicFlag ? 5 : 4 );
  Bool    bMbAffFrame = ( ! pcResizeParameters->m_bRefLayerFrameMbsOnlyFlag && ! pcResizeParameters->m_bRefLayerFieldPicFlag );
  PicType ePicType    = ( pcResizeParameters->m_bRefLayerFieldPicFlag ? ( pcResizeParameters->m_bRefLayerBotFieldFlag ? BOT_FIELD : TOP_FIELD ) : FRAME );
  UInt    auiOutMask[9];

  for( UInt uiMbY = 0; uiMbY < uiFrmHeight; uiMbY++ )
  for( UInt uiMbX = 0; uiMbX < uiFrmWidth;  uiMbX++ )
  {
    UInt  uiMask  = 0;
    Bool  bIntra  = false;
    RNOK( pcFrame->getFullPelYuvBuffer()->getYuvBufferCtrl().initMb( uiMbY, uiMbX, bMbAffFrame ) );

    if( ! bMbAffFrame )
    {
      RNOK( pcMbDataCtrl->getBoundaryMask( uiMbY, uiMbX, bIntra, uiMask, uiSliceId ) );
      if  ( ! bIntra )
      {
        YuvMbBufferExtension  cBuffer;
        YuvPicBuffer*         pcPicBuffer = pcFrame->getPic( ePicType )->getFullPelYuvBuffer();
        cBuffer.setAllSamplesToZero ();
        if( uiMask )
        {
          cBuffer.loadSurrounding   ( pcPicBuffer );
          RNOK( xPadRecMb           ( &cBuffer, uiMask ) );
        }
        pcPicBuffer->loadBuffer     ( &cBuffer );
      }
    }
    else
    {
      RNOK( pcMbDataCtrl->getBoundaryMask_MbAff( uiMbY, uiMbX, bIntra, uiMask, uiSliceId ) );
      if  ( ! bIntra )
      {
        YuvMbBufferExtension  cBuffer;
        PicType               eMbPicType  = ( uiMbY % 2 ? BOT_FIELD : TOP_FIELD );
        YuvPicBuffer*         pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer();
        cBuffer.setAllSamplesToZero     ();
        if( uiMask )
        {
          cBuffer.loadSurrounding_MbAff ( pcPicBuffer,  uiMask );
          RNOK( xPadRecMb_MbAff         ( &cBuffer,     uiMask ) );
        }
        pcPicBuffer->loadBuffer_MbAff   ( &cBuffer,     uiMask );
      }
    }

    if( xRequiresOutsidePadding( uiMbX, uiMbY, uiFrmWidth, uiFrmHeight, bMbAffFrame, uiMask, auiOutMask ) )
    {
      for( UInt uiDir = 0; uiDir < 9; uiDir++ )
      {
        if( auiOutMask[uiDir] != MSYS_UINT_MAX )
        {
          ROT( uiDir == 4 );
          PicType               eMbPicType  = ( bMbAffFrame ? ( uiMbY % 2 ? BOT_FIELD : TOP_FIELD ) : ePicType );
          YuvPicBuffer*         pcPicBuffer = pcFrame->getPic( eMbPicType )->getFullPelYuvBuffer();
          YuvMbBufferExtension  cBuffer;
          cBuffer.setAllSamplesToZero();
          if( !bMbAffFrame )
          {
            if( auiOutMask[uiDir] )
            {
              cBuffer.loadSurrounding( pcPicBuffer,  g_D2XD[uiDir], g_D2YD[uiDir] );
              RNOK( xPadRecMb        ( &cBuffer, auiOutMask[uiDir]                ) );
            }
            pcPicBuffer->loadBuffer  ( &cBuffer,     g_D2XD[uiDir], g_D2YD[uiDir] );
          }
          else
          {
            if( auiOutMask[uiDir] )
            {
              cBuffer.loadSurrounding_MbAff( pcPicBuffer, auiOutMask[uiDir], g_D2XD[uiDir], g_D2YD[uiDir] );
              RNOK( xPadRecMb_MbAff        ( &cBuffer,    auiOutMask[uiDir]                               ) );
            }
            pcPicBuffer->loadBuffer        ( &cBuffer,                       g_D2XD[uiDir], g_D2YD[uiDir] );
          }
        }
      }
    }
  }

  return Err::m_nOK;
}