Exemplo n.º 1
0
ErrVal 
MbData::xInherit8x8MotionData( const UInt        aui4x4Idx  [4][4],
                               const UInt        auiMbIdx	  [4][4], 
                               const Int         aaiPartInfo[4][4])
 {
   UInt uiB8x8Idx=0;
   for(uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++)
   {
     //Compute  m_aBlkMode
     //-------------------
     Bool bR1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][1];
     Bool bR2 = aaiPartInfo[uiB8x8Idx][2]==aaiPartInfo[uiB8x8Idx][3];
     Bool bC1 = aaiPartInfo[uiB8x8Idx][0]==aaiPartInfo[uiB8x8Idx][2];
     Bool bC2 = aaiPartInfo[uiB8x8Idx][1]==aaiPartInfo[uiB8x8Idx][3];

     //We assume that m_aBlkMode[uiB8x8Idx]has been initialized with BLK_8x8
     if( ! bC1 || ! bC2 )
     {
       m_aBlkMode[uiB8x8Idx]= BLK_8x4 ;
     }
     if( ! bR1 || ! bR2 )
     {
       m_aBlkMode[uiB8x8Idx]= ( m_aBlkMode[uiB8x8Idx] == BLK_8x8 ) ? BLK_4x8  : BLK_4x4;
     }
   
    // Inherit from base mv and RefIdx
    //---------------------------------
     const UInt*  pucMbIdx =auiMbIdx[uiB8x8Idx];
     const UInt*  puc4x4Idx=aui4x4Idx[uiB8x8Idx];
     const UChar* pucBlockOrder=&(g_aucConvertBlockOrder[uiB8x8Idx<<2]);

     for(UInt uiBl4x4Idx=0;uiBl4x4Idx<4;uiBl4x4Idx++,puc4x4Idx++,pucMbIdx++,pucBlockOrder++)
     {
       MbMotionData* pcmbMd0=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[0];
       MbMotionData* pcmbMd1=m_apcMbData[*pucMbIdx]->m_apcMbMotionData[1];

       const UChar ucMapIdx=*puc4x4Idx;
       const UChar uc8x8Idx=g_aucConvertTo8x8Idx[ucMapIdx];
       m_acBl4x4Mv[0][*pucBlockOrder]     =pcmbMd0->getMv(B4x4Idx(ucMapIdx));
       m_ascBl4x4RefIdx[0][*pucBlockOrder]=pcmbMd0->getRefIdx(Par8x8(uc8x8Idx));	
       m_acBl4x4Mv[1][*pucBlockOrder]     =pcmbMd1->getMv(B4x4Idx(ucMapIdx));
       m_ascBl4x4RefIdx[1][*pucBlockOrder]=pcmbMd1->getRefIdx(Par8x8(uc8x8Idx));

       //fill cbp
       ///////////
       if((m_apcMbData[*pucMbIdx]->getMbExtCbp()>>ucMapIdx)&1)
         m_uiMbCbp|=(1<<(*pucBlockOrder));
     }
   }

   //Homogenization step
   ////////////////////////////////
   //--- Merge Ref Indexes and Mvs inside a given 8x8 block  
   for ( uiB8x8Idx=0 ; uiB8x8Idx<4 ; uiB8x8Idx++) 
     if(m_aBlkMode[uiB8x8Idx]!= BLK_8x8) xMergeBl8x8MvAndRef(uiB8x8Idx);

   return Err::m_nOK;
 }
Exemplo n.º 2
0
Bool MbData::calcBCBP( UInt uiStart, UInt uiStop, UInt uiPos ) const
{
  AOF( uiStart != uiStop );
  if( uiPos < 16 )
  {
    if( isTransformSize8x8() )
    {
      UInt uiTab[] = { 0, 1, 0, 1, 2, 3, 2, 3 };
      return ( ( calcMbCbp( uiStart, uiStop ) >> uiTab[uiPos>>1] ) & 1 ) != 0;
    }
    // Luma 4x4 block
    if( uiStart == 0 && isIntra16x16() )
      uiStart = 1;

    const UChar  *pucScan = getFieldFlag() ? g_aucFieldScan : g_aucFrameScan;
    const TCoeff *piCoeff = getMbTCoeffs().get( B4x4Idx(uiPos) );
    for( UInt ui = uiStart; ui < uiStop; ui++ )
    {
      if( piCoeff[pucScan[ui]] )
      {
        return true;
      }
    }
  }
  else if( uiPos < 24 )
Exemplo n.º 3
0
ErrVal MbDecoder::xDecodeMbIntra16x16( MbDataAccess&    rcMbDataAccess,
                                       IntYuvMbBuffer&  cYuvMbBuffer,
                                       IntYuvMbBuffer& rcPredBuffer )
{
  Int  iStride = cYuvMbBuffer.getLStride();

  RNOK( m_pcIntraPrediction->predictLumaMb( cYuvMbBuffer.getMbLumAddr(), iStride, rcMbDataAccess.getMbData().intraPredMode() ) );

  rcPredBuffer.loadLuma( cYuvMbBuffer );

  MbTransformCoeffs& rcCoeffs = m_cTCoeffs;

  Quantizer           cQuantizer;   cQuantizer.setQp    ( rcMbDataAccess, false );
  const QpParameter   rcLQp       = cQuantizer.getLumaQp();
  Int                 iScaleY     = g_aaiDequantCoef[rcLQp.rem()][0] << rcLQp.per();
  const UChar*        pucScaleY   = rcMbDataAccess.getSH().getScalingMatrix( 0 );

  if( pucScaleY )
  {
    iScaleY  *= pucScaleY[0];
    iScaleY >>= 4;
  }

  RNOK( m_pcTransform->invTransformDcCoeff( rcCoeffs.get( B4x4Idx(0) ), iScaleY ) );

  for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
  {
    RNOK( m_pcTransform->invTransform4x4Blk( cYuvMbBuffer.getYBlk( cIdx ), iStride, rcCoeffs.get( cIdx ) ) );
  }

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

  return Err::m_nOK;
}
Exemplo n.º 4
0
ErrVal MbTransformCoeffs::clearPrediction()
{
  TCoeff *pcDst     = get( B4x4Idx(0) );
  for( UInt ui = 0; ui < 384; ui++ )
  {
    (pcDst++)->setSPred( 0 );
  }
  return Err::m_nOK;
}
Exemplo n.º 5
0
Bool  
MbTransformCoeffs::allLevelsAndPredictionsZero() const
{
  const TCoeff* pcDst = get( B4x4Idx(0) );
  for( UInt ui = 0; ui < 384; ui++ )
  {
    ROTRS( pcDst[ui].getLevel() || pcDst[ui].getSPred(), false );
  }
  return true;  
}
Exemplo n.º 6
0
Bool
MbTransformCoeffs::allCoeffsZero() const
{
  const TCoeff* pcDst = get( B4x4Idx(0) );
  for( UInt ui = 0; ui < 384; ui++ )
  {
    ROTRS( pcDst[ui].getCoeff(), false );
  }
  return true;  
}
Exemplo n.º 7
0
ErrVal MbTransformCoeffs::copyPredictionFrom( YuvMbBuffer &rcPred )
{
  TCoeff *pcDst     = get( B4x4Idx(0) );
  XPel   *pSrc      = rcPred.getMbLumAddr();
  Int   iSrcStride  = rcPred.getLStride();
  UInt uiY, uiX;
  for( uiY = 0; uiY < 16; uiY++ )
  {
    for( uiX = 0; uiX < 16; uiX++ )
    {
      (pcDst++)->setSPred( pSrc[uiX] );
    }
    pSrc += iSrcStride;
  }
  iSrcStride = rcPred.getCStride();
  pSrc       = rcPred.getMbCbAddr();

  for( uiY = 0; uiY < 8; uiY++ )
  {
    for( uiX = 0; uiX < 8; uiX++ )
    {
      (pcDst++)->setSPred( pSrc[uiX] );
    }
    pSrc += iSrcStride;
  }

  pSrc       = rcPred.getMbCrAddr();

  for( uiY = 0; uiY < 8; uiY++ )
  {
    for( uiX = 0; uiX < 8; uiX++ )
    {
      (pcDst++)->setSPred( pSrc[uiX] );
    }
    pSrc += iSrcStride;
  }
  return Err::m_nOK;
}
Exemplo n.º 8
0
ErrVal
MbParser::xReadTextureInfo( MbDataAccess&   rcMbDataAccess,
                            Bool            bTrafo8x8Flag,
                            Bool            bBaseLayerAvailable,
                            UInt            uiStart,
                            UInt            uiStop )
{
  Bool bReadDQp = ( uiStart < uiStop );

  if( !rcMbDataAccess.getSH().isIntraSlice() && 
      rcMbDataAccess.getMbData().getInCropWindowFlag() && 
      ( rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getMbData().isIntra() ) )
  {
    if( rcMbDataAccess.getSH().getAdaptiveResidualPredictionFlag() )
    {
      DECRNOK( m_pcMbSymbolReadIf->resPredFlag( rcMbDataAccess ) );
    }
    else
    {
      rcMbDataAccess.getMbData().setResidualPredFlag( rcMbDataAccess.getSH().getDefaultResidualPredictionFlag() );
    }
  }
  else
  {
    rcMbDataAccess.getMbData().setResidualPredFlag( false );
  }

  if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
     !rcMbDataAccess.getMbData().isIntra16x16() )
  {
    if( uiStart >= uiStop )
    {
      rcMbDataAccess.getMbData().setMbCbp( 0 );
    }
    else
    {
      DECRNOK( m_pcMbSymbolReadIf->cbp( rcMbDataAccess, uiStart, uiStop ) );
    }
    bReadDQp = rcMbDataAccess.getMbData().getMbCbp() != 0;
  }

  if( bTrafo8x8Flag && ( rcMbDataAccess.getMbData().getMbCbp() & 0x0F ) )
  {
    DECRNOK( m_pcMbSymbolReadIf->transformSize8x8Flag( rcMbDataAccess ) );
  }

  if( bReadDQp )
  {
    DECRNOK( m_pcMbSymbolReadIf->deltaQp( rcMbDataAccess ) );
  }
  else
  {
    rcMbDataAccess.resetQp();
  }

  Bool bIntra16x16 = ( !rcMbDataAccess.getMbData().getBLSkipFlag() &&
                        rcMbDataAccess.getMbData().isIntra16x16 ()   );
  if( bIntra16x16 )
  {
    UInt uiDummy = 0;
    if( uiStart == 0 && uiStop != 0 )
    {
      DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, B4x4Idx(0), LUMA_I16_DC, uiDummy, uiStart, uiStop ) );
    }
    if( rcMbDataAccess.getMbData().isAcCoded() && uiStop > 1 )
    {
      for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
      {
        DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cIdx, LUMA_I16_AC, uiDummy, uiStart, uiStop ) );
      }
      rcMbDataAccess.getMbData().setMbCbp( 0xf + ( rcMbDataAccess.getMbData().getCbpChroma16x16() << 4) );
    }
    else
    {
      rcMbDataAccess.getMbData().setMbCbp( 0x0 + ( rcMbDataAccess.getMbData().getCbpChroma16x16() << 4) );
    }

    DECRNOK( xScanChromaBlocks( rcMbDataAccess,  rcMbDataAccess.getMbData().getCbpChroma16x16(), uiStart, uiStop ) );
    return Err::m_nOK;
  }


  UInt uiMbExtCbp = rcMbDataAccess.getMbData().getMbExtCbp();

  if( rcMbDataAccess.getMbData().isTransformSize8x8() )
  {
    for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
    {
      if( uiMbExtCbp & ( 1 << c8x8Idx.b4x4() ) )
      {
        DECRNOK( m_pcMbSymbolReadIf->residualBlock8x8( rcMbDataAccess, c8x8Idx, uiStart, uiStop ) );
      }
    }
  }
  else
  {
    for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
    {
      if( uiMbExtCbp & ( 1 << c8x8Idx.b4x4() ) )
      {
        for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
        {
          DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cIdx , LUMA_SCAN, uiMbExtCbp, uiStart, uiStop ) );
        }
      }
    }

  }
  rcMbDataAccess.getMbData().setMbExtCbp( uiMbExtCbp );

  DECRNOK( xScanChromaBlocks  ( rcMbDataAccess,  rcMbDataAccess.getMbData().getCbpChroma4x4(), uiStart, uiStop ) );
  return Err::m_nOK;
}