ErrVal MbDecoder::xDecodeChroma( MbDataAccess& rcMbDataAccess, YuvMbBuffer& rcRecYuvBuffer, UInt uiChromaCbp, Bool bPredChroma ) { MbTransformCoeffs& rcCoeffs = m_cTCoeffs; Pel* pucCb = rcRecYuvBuffer.getMbCbAddr(); Pel* pucCr = rcRecYuvBuffer.getMbCrAddr(); Int iStride = rcRecYuvBuffer.getCStride(); if( bPredChroma ) { RNOK( m_pcIntraPrediction->predictChromaBlock( pucCb, pucCr, iStride, rcMbDataAccess.getMbData().getChromaPredMode() ) ); } ROTRS( 0 == uiChromaCbp, Err::m_nOK ); Int iScale; Bool bIntra = rcMbDataAccess.getMbData().isIntra(); UInt uiUScalId = ( bIntra ? 1 : 4 ); UInt uiVScalId = ( bIntra ? 2 : 5 ); const UChar* pucScaleU = rcMbDataAccess.getSH().getScalingMatrix( uiUScalId ); const UChar* pucScaleV = rcMbDataAccess.getSH().getScalingMatrix( uiVScalId ); // scaling has already been performed on DC coefficients iScale = ( pucScaleU ? pucScaleU[0] : 16 ); m_pcTransform->invTransformChromaDc( rcCoeffs.get( CIdx(0) ), iScale ); iScale = ( pucScaleV ? pucScaleV[0] : 16 ); m_pcTransform->invTransformChromaDc( rcCoeffs.get( CIdx(4) ), iScale ); RNOK( m_pcTransform->invTransformChromaBlocks( pucCb, iStride, rcCoeffs.get( CIdx(0) ) ) ); RNOK( m_pcTransform->invTransformChromaBlocks( pucCr, iStride, rcCoeffs.get( CIdx(4) ) ) ); return Err::m_nOK; }
Void IntMbTempData::loadChromaData( IntMbTempData& rcMbTempData ) { ::memcpy( get(CIdx(0)), rcMbTempData.get(CIdx(0)), sizeof(TCoeff)*128); setChromaPredMode( rcMbTempData.getChromaPredMode() ); IntYuvMbBuffer::loadChroma( rcMbTempData ); distU() = rcMbTempData.distU(); distV() = rcMbTempData.distV(); getTempYuvMbBuffer().loadChroma( rcMbTempData.getTempYuvMbBuffer() ); }
ErrVal MbParser::xScanChromaBlocks( MbDataAccess& rcMbDataAccess, UInt uiChromCbp, UInt uiStart, UInt uiStop ) { ROTRS( 1 > uiChromCbp, Err::m_nOK ); if( uiStart == 0 ) { DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_DC, uiStart, uiStop ) ); DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_DC, uiStart, uiStop ) ); } ROTRS( 2 > uiChromCbp, Err::m_nOK ); for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ ) { if( uiStop > 1 ) { DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cCIdx, CHROMA_AC, uiStart, uiStop ) ); } } return Err::m_nOK; }
const TCoeff *piCoeff = getMbTCoeffs().get( B4x4Idx(uiPos) ); for( UInt ui = uiStart; ui < uiStop; ui++ ) { if( piCoeff[pucScan[ui]] ) { return true; } } } else if( uiPos < 24 ) { // Chroma AC 4x4 block AOF( uiStop > 1 ); uiStart = gMax( 1, uiStart ); const UChar *pucScan = getFieldFlag() ? g_aucFieldScan : g_aucFrameScan; const TCoeff *piCoeff = getMbTCoeffs().get( CIdx(uiPos - 16) ); for( UInt ui = uiStart; ui < uiStop; ui++ ) { if( piCoeff[pucScan[ui]] ) { return true; } } } else if( uiPos < 26 ) { // Chroma DC 4x4 block AOF( uiStart == 0 ); CPlaneIdx cCPlane( uiPos - 24 ); for( CIdx cCIdx( cCPlane ) ; cCIdx.isLegal( cCPlane ); cCIdx++ ) {
ErrVal SliceEncoder::xAddTCoeffs2( MbDataAccess& rcMbDataAccess, MbDataAccess& rcMbDataAccessBase ) { if( rcMbDataAccess.getMbData().isPCM() ) { TCoeff* pSrc = rcMbDataAccessBase.getMbTCoeffs().getTCoeffBuffer(); TCoeff* pDes = rcMbDataAccess .getMbTCoeffs().getTCoeffBuffer(); for( UInt ui = 0; ui < 384; ui++, pSrc++, pDes++ ) { ROT( pDes->getLevel() ); pDes->setLevel( pSrc->getLevel() ); } ROT( rcMbDataAccess.getMbData().getMbExtCbp() ); return Err::m_nOK; } UInt uiBCBP = 0; UInt uiCoded = 0; Bool bCoded = false; Bool bChromaAC = false; Bool bChromaDC = false; // Add the luma coefficients and track the new BCBP if( rcMbDataAccess.getMbData().isTransformSize8x8() ) { for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ ) { bCoded = false; m_pcTransform->addPrediction8x8Blk( rcMbDataAccess.getMbTCoeffs().get8x8( c8x8Idx ), rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx ), rcMbDataAccess.getMbData().getQp(), rcMbDataAccessBase.getMbData().getQp(), bCoded ); if( rcMbDataAccess.getMbData().isIntra16x16() ) AOT(1); if( bCoded ) uiBCBP |= (0x33 << c8x8Idx.b4x4()); } } else { for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ ) { uiCoded = 0; m_pcTransform->addPrediction4x4Blk( rcMbDataAccess.getMbTCoeffs().get( cIdx ), rcMbDataAccessBase.getMbTCoeffs().get( cIdx ), rcMbDataAccess.getMbData().getQp(), rcMbDataAccessBase.getMbData().getQp(), uiCoded ); if( rcMbDataAccess.getMbData().isIntra16x16() ) { if( *(rcMbDataAccess.getMbTCoeffs().get( cIdx )) ) uiCoded--; } if( uiCoded ) uiBCBP |= 1<<cIdx; } if( rcMbDataAccess.getMbData().isIntra16x16() ) { uiBCBP = uiBCBP?((1<<16)-1):0; } } // Add the chroma coefficients and update the BCBP m_pcTransform->addPredictionChromaBlocks( rcMbDataAccess.getMbTCoeffs().get( CIdx(0) ), rcMbDataAccessBase.getMbTCoeffs().get( CIdx(0) ), rcMbDataAccess.getSH().getCbQp( rcMbDataAccess.getMbData().getQp() ), rcMbDataAccess.getSH().getBaseSliceHeader()->getCbQp( rcMbDataAccessBase.getMbData().getQp() ), bChromaDC, bChromaAC ); m_pcTransform->addPredictionChromaBlocks( rcMbDataAccess.getMbTCoeffs().get( CIdx(4) ), rcMbDataAccessBase.getMbTCoeffs().get( CIdx(4) ), rcMbDataAccess.getSH().getCrQp( rcMbDataAccess.getMbData().getQp() ), rcMbDataAccess.getSH().getBaseSliceHeader()->getCrQp( rcMbDataAccessBase.getMbData().getQp() ), bChromaDC, bChromaAC ); uiBCBP |= (bChromaAC?2:(bChromaDC?1:0))<<16; // Update the CBP rcMbDataAccess.getMbData().setAndConvertMbExtCbp( uiBCBP ); // Update the Intra16x16 mode if( rcMbDataAccess.getMbData().isIntra16x16() ) { UInt uiMbType = INTRA_4X4 + 1; UInt uiPredMode = rcMbDataAccess.getMbData().intraPredMode(); UInt uiChromaCbp = uiBCBP>>16; Bool bACcoded = (uiBCBP && ((1<<16)-1)); uiMbType += uiPredMode; uiMbType += ( bACcoded ) ? 12 : 0; uiMbType += uiChromaCbp << 2; rcMbDataAccess.getMbData().setMbMode( MbMode(uiMbType) ); // Sanity checks if( rcMbDataAccess.getMbData().intraPredMode() != uiPredMode ) AOT(1); if( rcMbDataAccess.getMbData().getCbpChroma16x16() != uiChromaCbp ) AOT(1); if( rcMbDataAccess.getMbData().isAcCoded() != bACcoded ) AOT(1); }
Void MbTransformCoeffs::clearChromaLevels() { ::memset( get( CIdx(0) ), 0, sizeof(TCoeff)*128 ); }