?? mbcoder.cpp
字號:
{
RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) && ( ! bPred || ! rcMot.getMotPredFlag( PART_8x16_1 ) ) )
{
RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
break;
}
case MODE_8x8:
case MODE_8x8ref0:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) &&
rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) && ( ! bPred || ! rcMot.getMotPredFlag( c8x8Idx.b8x8() ) ) )
{
RNOK( m_pcMbSymbolWriteIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal
MbCoder::xWriteMotionVectors( MbDataAccess& rcMbDataAccess,
MbMode eMbMode,
ListIdx eLstIdx )
{
AOT_DBG( rcMbDataAccess.getMbData().isIntra() );
switch( eMbMode )
{
case MODE_SKIP:
{
return Err::m_nOK;
}
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx ) );
}
return Err::m_nOK;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
return Err::m_nOK;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx) )
{
RNOK( m_pcMbSymbolWriteIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
return Err::m_nOK;
}
case MODE_8x8:
case MODE_8x8ref0:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
RNOK( xWriteBlockMv( rcMbDataAccess, c8x8Idx, eLstIdx ) );
}
}
return Err::m_nOK;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nERR;
}
#if JMVM_ONLY // JVT-U052
ErrVal
MbCoder::xWriteIcp( MbDataAccess& rcMbDataAccess,
MbMode eMbMode )
{
AOT_DBG( rcMbDataAccess.getMbData().isIntra() );
switch( eMbMode )
{
case MODE_SKIP:
{
#if JMVM_ONLY // JVT-U052
if( rcMbDataAccess.getSH().isInterB() )
RNOK( m_pcMbSymbolWriteIf->Icpd( rcMbDataAccess ) );
#endif
return Err::m_nOK;
}
case MODE_16x16:
{
RNOK( m_pcMbSymbolWriteIf->Icpd( rcMbDataAccess ) );
return Err::m_nOK;
}
case MODE_16x8:
case MODE_8x16:
case MODE_8x8:
case MODE_8x8ref0:
return Err::m_nOK;
default:
{
AOT(1);
return Err::m_nERR;
}
}
return Err::m_nERR;
}
#endif
ErrVal MbCoder::xWriteTextureInfo( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase, // JVT-R091
const MbTransformCoeffs& rcMbTCoeff,
Bool bTrafo8x8Flag
)
{
Bool bWriteDQp = true;
UInt uiCbp = rcMbDataAccess.getMbData().getMbCbp();
if( ! rcMbDataAccess.getMbData().isIntra16x16() )
{
RNOK( m_pcMbSymbolWriteIf->cbp( rcMbDataAccess ) );
bWriteDQp = ( 0 != uiCbp );
}
if( bTrafo8x8Flag && ( rcMbDataAccess.getMbData().getMbCbp() & 0x0F ) )
{
ROT( rcMbDataAccess.getMbData().isIntra16x16() );
ROT( rcMbDataAccess.getMbData().isIntra4x4 () );
RNOK( m_pcMbSymbolWriteIf->transformSize8x8Flag( rcMbDataAccess ) );
}
if( bWriteDQp )
{
RNOK( m_pcMbSymbolWriteIf->deltaQp( rcMbDataAccess ) );
}
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
!rcMbDataAccess.getMbData().isIntra() )
{
if( rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
if( ! rcMbDataAccess.getSH().isIntra() )
{
RNOK( m_pcMbSymbolWriteIf->resPredFlag( rcMbDataAccess ) );
if ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) &&
rcMbDataAccess.getMbData().getBLSkipFlag() )
{
RNOK( m_pcMbSymbolWriteIf->smoothedRefFlag( rcMbDataAccess ) );
}
}
}
}
if( rcMbDataAccess.getMbData().isIntra16x16() )
{
RNOK( xScanLumaIntra16x16( rcMbDataAccess, rcMbTCoeff, rcMbDataAccess.getMbData().isAcCoded() ) );
RNOK( xScanChromaBlocks ( rcMbDataAccess, rcMbTCoeff, rcMbDataAccess.getMbData().getCbpChroma16x16() ) );
return Err::m_nOK;
}
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( (uiCbp >> c8x8Idx.b8x8Index()) & 1 )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock8x8( rcMbDataAccess, c8x8Idx, LUMA_SCAN ) );
}
}
}
else
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( (uiCbp >> c8x8Idx.b8x8Index()) & 1 )
{
for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ )
{
RNOK( xScanLumaBlock( rcMbDataAccess, rcMbTCoeff, cIdx ) );
}
}
}
}
RNOK( xScanChromaBlocks( rcMbDataAccess, rcMbTCoeff, rcMbDataAccess.getMbData().getCbpChroma4x4() ) );
return Err::m_nOK;
}
ErrVal MbCoder::xScanLumaIntra16x16( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff, Bool bAC )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, B4x4Idx(0), LUMA_I16_DC ) );
ROFRS( bAC, Err::m_nOK );
for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++)
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, cIdx, LUMA_I16_AC ) );
}
return Err::m_nOK;
}
ErrVal MbCoder::xScanLumaBlock( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff, LumaIdx cIdx )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, cIdx, LUMA_SCAN ) );
return Err::m_nOK;
}
ErrVal MbCoder::xScanChromaDc( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_DC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_DC ) );
return Err::m_nOK;
}
ErrVal MbCoder::xScanChromaAcU( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(1), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(2), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(3), CHROMA_AC ) );
return Err::m_nOK;
}
ErrVal MbCoder::xScanChromaAcV( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff )
{
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(5), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(6), CHROMA_AC ) );
RNOK( m_pcMbSymbolWriteIf->residualBlock( rcMbDataAccess, CIdx(7), CHROMA_AC ) );
return Err::m_nOK;
}
ErrVal MbCoder::xScanChromaBlocks( MbDataAccess& rcMbDataAccess, const MbTransformCoeffs& rcTCoeff, UInt uiChromCbp )
{
ROTRS( 1 > uiChromCbp, Err::m_nOK );
RNOK( xScanChromaDc ( rcMbDataAccess, rcTCoeff ) );
ROTRS( 2 > uiChromCbp, Err::m_nOK );
RNOK( xScanChromaAcU( rcMbDataAccess, rcTCoeff ) );
RNOK( xScanChromaAcV( rcMbDataAccess, rcTCoeff ) );
return Err::m_nOK;
}
#if JMVM_ONLY //JVT-Z021
ErrVal
MbCoder::xWriteImsm(MbDataAccess& rcMbDataAccess)
{
Bool bIsViewL1;
if(rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding()) //SLD
{
bIsViewL1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsSldForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);
}
else
{
bIsViewL1 = rcMbDataAccess.getSH().getSPS().getSpsMVC()->getNumNonAnchorRefsForListX (rcMbDataAccess.getSH().getViewId(), LIST_1);
}
if(bIsViewL1 == 0)
{
RNOK ( MbCoder::m_pcMbSymbolWriteIf->MotionSkipOffset( rcMbDataAccess ) );
}
else
{
RNOK ( MbCoder::m_pcMbSymbolWriteIf->MotionSkipListXFlag( rcMbDataAccess ) );
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == LIST_0)
{
RNOK ( MbCoder::m_pcMbSymbolWriteIf->MotionSkipOffset( rcMbDataAccess ) );
}
else
{
RNOK ( MbCoder::m_pcMbSymbolWriteIf->MotionSkipOffset( rcMbDataAccess ) );
}
}
return Err::m_nOK;
}
#endif //JMVM_ONLY
H264AVC_NAMESPACE_END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -