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; }
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 )
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; }
ErrVal MbTransformCoeffs::clearPrediction() { TCoeff *pcDst = get( B4x4Idx(0) ); for( UInt ui = 0; ui < 384; ui++ ) { (pcDst++)->setSPred( 0 ); } return Err::m_nOK; }
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; }
Bool MbTransformCoeffs::allCoeffsZero() const { const TCoeff* pcDst = get( B4x4Idx(0) ); for( UInt ui = 0; ui < 384; ui++ ) { ROTRS( pcDst[ui].getCoeff(), false ); } return true; }
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; }
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; }