h264avcdecoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,899 行 · 第 1/5 页
CPP
1,899 行
}
return Err::m_nOK;
}
//JVT-P031
ErrVal
H264AVCDecoder::initPacket( BinDataAccessor* pcBinDataAccessor)
{
return m_pcNalUnitParser->initSODBNalUnit(pcBinDataAccessor);
}
//~JVT-P031
//JVT-S036 lsj start
ErrVal
H264AVCDecoder::initPacketSuffix( BinDataAccessor* pcBinDataAccessor,
UInt& ruiNalUnitType
, Bool bPreParseHeader
, Bool bConcatenated
, Bool& rbStartDecoding
,SliceHeader *pcSliceHeader
,Bool& SuffixEnable
)
{
ROF( m_bInitDone );
// UInt uiLayerId;
ROT( NULL == pcBinDataAccessor );
if ( NULL == pcBinDataAccessor->data() || 0 == pcBinDataAccessor->size() )
{
// switch
SliceHeader* pTmp = m_pcSliceHeader;
m_pcSliceHeader = m_pcPrevSliceHeader;
m_pcPrevSliceHeader = pTmp;
m_bLastFrame = true;
delete m_pcSliceHeader;
m_pcSliceHeader = 0;
rbStartDecoding = true; //JVT-P031
if((m_pcNalUnitParser->getNalUnitType() == NAL_UNIT_CODED_SLICE_SCALABLE || m_pcNalUnitParser->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_SCALABLE)
&& m_pcNalUnitParser->getLayerId() == 0 && m_pcNalUnitParser->getQualityLevel() == 0)
{
SuffixEnable = true;
}
else
{
SuffixEnable = false;
}
return Err::m_nOK;
}
//JVT-P031
Bool KeyPicFlag = false;
getDecodedResolution(m_uiDecodedLayer);
m_pcNalUnitParser->setDecodedLayer(m_uiDecodedLayer);
//~JVT-P031
UInt uiNumBytesRemoved; //FIX_FRAG_CAVLC
RNOK( m_pcNalUnitParser->initNalUnit( pcBinDataAccessor, &KeyPicFlag,uiNumBytesRemoved, bPreParseHeader , bConcatenated) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC
ruiNalUnitType = m_pcNalUnitParser->getNalUnitType();
//TMM_EC }}
switch ( m_pcNalUnitParser->getNalUnitType() )
{
case NAL_UNIT_CODED_SLICE_SCALABLE:
case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
{
if( m_pcNalUnitParser->getLayerId() == 0 && m_pcNalUnitParser->getQualityLevel() == 0)
{
RNOK( m_pcSliceReader->readSliceHeaderSuffix( m_pcNalUnitParser->getNalUnitType (),
m_pcNalUnitParser->getNalRefIdc (),
m_pcNalUnitParser->getLayerId (),
m_pcNalUnitParser->getQualityLevel (),
pcSliceHeader
)
);
SuffixEnable = true;
return Err::m_nOK;
}
else
{
SuffixEnable = false;
return Err::m_nOK;
}
}
break;
default:
{
SuffixEnable = false;
return Err::m_nOK;
}
break;
}
return Err::m_nOK;
}
//JVT-S036 lsj end
ErrVal
H264AVCDecoder::getBaseLayerPWTable( SliceHeader::PredWeightTable*& rpcPredWeightTable,
UInt uiBaseLayerId,
ListIdx eListIdx,
Int iPoc )
{
if( uiBaseLayerId || m_apcMCTFDecoder[uiBaseLayerId]->isActive() )
{
RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerPWTable( rpcPredWeightTable, eListIdx, iPoc ) );
return Err::m_nOK;
}
rpcPredWeightTable = &m_acLastPredWeightTable[eListIdx];
return Err::m_nOK;
}
ErrVal
H264AVCDecoder::getBaseLayerData( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
Bool& rbConstrainedIPred,
Bool& rbSpatialScalability,
UInt uiLayerId,
UInt uiBaseLayerId,
Int iPoc )
{
if( uiBaseLayerId || m_apcMCTFDecoder[uiBaseLayerId]->isActive() )
{
//===== base layer is scalable extension =====
//--- get spatial resolution ratio ---
// TMM_ESS {
if( m_apcMCTFDecoder[uiLayerId]->getFrameHeight() != m_apcMCTFDecoder[uiBaseLayerId]->getFrameHeight() &&
m_apcMCTFDecoder[uiLayerId]->getFrameWidth () != m_apcMCTFDecoder[uiBaseLayerId]->getFrameWidth () )
{
rbSpatialScalability = true;
}
else
{
rbSpatialScalability = false;
}
// TMM_ESS }
//--- get data ---
RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerData( pcFrame, pcResidual, pcMbDataCtrl, rbConstrainedIPred, rbSpatialScalability, iPoc ) );
}
else
{
//===== base layer is standard H.264/AVC =====
//--- get spatial resolution ratio ---
// TMM_ESS {
if( m_apcMCTFDecoder[uiLayerId]->getFrameHeight() == 16 * m_pcVeryFirstSliceHeader->getSPS().getFrameHeightInMbs () &&
m_apcMCTFDecoder[uiLayerId]->getFrameWidth () == 16 * m_pcVeryFirstSliceHeader->getSPS().getFrameWidthInMbs () )
{
rbSpatialScalability = false;
}
else
{
rbSpatialScalability = true;
}
// TMM_ESS }
FrameUnit* pcFrameUnit = m_pcFrameMng->getReconstructedFrameUnit( iPoc );
ROF( pcFrameUnit );
//TMM_EC {{
if ( m_apcMCTFDecoder[uiLayerId]->m_eErrorConcealTemp != EC_RECONSTRUCTION_UPSAMPLE)
pcFrame = rbSpatialScalability ? m_pcFrameMng->getRefinementIntFrame2() : m_pcFrameMng->getRefinementIntFrame();
else
pcFrame = pcFrameUnit->getFGSIntFrame();
//TMM_EC }}
pcResidual = pcFrameUnit ->getResidual();
pcMbDataCtrl = pcFrameUnit ->getMbDataCtrl();
rbConstrainedIPred = pcFrameUnit ->getContrainedIntraPred();
}
return Err::m_nOK;
}
ErrVal
H264AVCDecoder::process( PicBuffer* pcPicBuffer,
PicBufferList& rcPicBufferOutputList,
PicBufferList& rcPicBufferUnusedList,
PicBufferList& rcPicBufferReleaseList )
{
ROF( m_bInitDone );
RNOK( xInitSlice( m_pcSliceHeader ) );
if( m_bLastFrame )
{
if( m_uiRecLayerId > 0 || !m_bBaseLayerIsAVCCompatible ) // we have an MCTF reconstruction layer
{
PicBufferList cDummyList;
Int iMaxPoc;
for( UInt uiLayer = 0; uiLayer < m_uiRecLayerId; uiLayer++ )
{
if( uiLayer == 0 && m_bBaseLayerIsAVCCompatible )
{
RNOK( m_pcFrameMng->outputAll() );
RNOK( m_pcFrameMng->setPicBufferLists( cDummyList, rcPicBufferReleaseList ) );
}
RNOK( m_apcMCTFDecoder[uiLayer] ->finishProcess( cDummyList,
rcPicBufferUnusedList,
iMaxPoc ) );
}
RNOK ( m_apcMCTFDecoder[m_uiRecLayerId]->finishProcess( rcPicBufferOutputList,
rcPicBufferUnusedList,
iMaxPoc = MSYS_INT_MIN ) );
}
else
{
//===== output all remaining frames in decoded picture buffer =====
RNOK( m_pcFrameMng->outputAll() );
RNOK( m_pcFrameMng->setPicBufferLists( rcPicBufferOutputList, rcPicBufferReleaseList ) );
}
rcPicBufferUnusedList.pushBack( pcPicBuffer );
return Err::m_nOK;
}
const NalUnitType eNalUnitType = m_pcNalUnitParser->getNalUnitType();
//====== check for AVC baselayer FGS refinement =====
if( ( eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE || eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ) &&
m_bActive &&
m_pcSliceHeader->getLayerId() == 0 &&
m_pcSliceHeader->getSliceType() == F_SLICE )
{
//TMM_EC {{
if ( m_pcSliceHeader->getTrueSlice())
{
// RNOK( xDecodeFGSRefinement( m_pcSliceHeader, pcPicBuffer ) );
if ( Err::m_nOK != xDecodeFGSRefinement( m_pcSliceHeader, pcPicBuffer ) )
{
//===== switch slice headers and update =====
SliceHeader* pcTemp = m_pcSliceHeader;
m_pcSliceHeader = m_pcPrevSliceHeader;
m_pcPrevSliceHeader = pcTemp;
}
}
else
{
//===== switch slice headers and update =====
SliceHeader* pcTemp = m_pcSliceHeader;
m_pcSliceHeader = m_pcPrevSliceHeader;
m_pcPrevSliceHeader = pcTemp;
}
//TMM_EC }}
rcPicBufferUnusedList.pushBack( pcPicBuffer );
RNOK( m_pcNalUnitParser->closeNalUnit() );
return Err::m_nOK;
}
//===== decode NAL unit =====
switch( eNalUnitType )
{
case NAL_UNIT_CODED_SLICE_SCALABLE:
case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
{
ROT( m_pcSliceHeader == NULL );
m_uiLastLayerId = m_pcSliceHeader->getLayerId();
// JVT-Q054 Red. Picture {
if ( NULL != m_pcSliceHeader_backup )
{
RNOK( m_pcSliceHeader->sliceHeaderBackup( m_pcSliceHeader_backup ) );
}
// JVT-Q054 Red. Picture }
PicBufferList cDummyList;
PicBufferList& rcOutputList = ( m_uiLastLayerId == m_uiRecLayerId ? rcPicBufferOutputList : cDummyList );
Bool bHighestLayer = ( m_uiLastLayerId == m_uiRecLayerId );
// TMM EC {{
if ( m_pcNalUnitParser->getQualityLevel() == 0)
{
m_apcMCTFDecoder[m_uiLastLayerId]->m_uiDecompositionStages = m_uiDecompositionStages[m_uiLastLayerId];
m_apcMCTFDecoder[m_uiLastLayerId]->m_uiDecompositionStagesBase = m_uiDecompositionStages[0];
}
//TMM_EC }}
RNOK( m_apcMCTFDecoder[m_uiLastLayerId] ->process ( m_pcSliceHeader,
pcPicBuffer,
rcOutputList,
rcPicBufferUnusedList,
bHighestLayer ) );
RNOK( m_pcNalUnitParser ->closeNalUnit() );
return Err::m_nOK;
}
break;
case NAL_UNIT_CODED_SLICE:
case NAL_UNIT_CODED_SLICE_IDR:
{
ROF( m_pcSliceHeader );
ROF( m_pcSliceHeader->getLayerId() == 0 );
m_uiLastLayerId = m_pcSliceHeader->getLayerId();
// JVT-Q054 Red. Picture {
if ( NULL != m_pcSliceHeader_backup )
{
RNOK( m_pcSliceHeader->sliceHeaderBackup( m_pcSliceHeader_backup ) );
}
// JVT-Q054 Red. Picture }
// TMM EC {{
m_apcMCTFDecoder[m_uiLastLayerId+1]->m_bBaseLayerLost = !m_pcSliceHeader->getTrueSlice();
// if(eNalUnitType==NAL_UNIT_VIRTUAL_BASELAYER)
if ( !m_pcSliceHeader->getTrueSlice())
{
RNOK( xProcessSliceVirtual( *m_pcSliceHeader, m_pcPrevSliceHeader, pcPicBuffer ) );
}
else
{
RNOK( xProcessSlice( *m_pcSliceHeader, m_pcPrevSliceHeader, pcPicBuffer ) );
}
//TMM_EC }}
PicBufferList cDummyList;
PicBufferList& rcOutputList = ( m_uiRecLayerId == 0 ? rcPicBufferOutputList : cDummyList );
RNOK( m_pcFrameMng->setPicBufferLists( rcOutputList, rcPicBufferReleaseList ) );
}
break;
case NAL_UNIT_SPS:
{
break;
}
case NAL_UNIT_PPS:
case NAL_UNIT_SEI:
case NAL_UNIT_ACCESS_UNIT_DELIMITER:
case NAL_UNIT_END_OF_SEQUENCE:
case NAL_UNIT_END_OF_STREAM:
{
}
break;
default:
{
AF();
return Err::m_nERR;
}
break;
}
rcPicBufferUnusedList.pushBack( pcPicBuffer );
RNOK( m_pcNalUnitParser->closeNalUnit() );
return Err::m_nOK;
}
ErrVal H264AVCDecoder::xStartSlice(Bool& bPreParseHeader, Bool& bLastFragment, Bool& bDiscardable, Bool UnitAVCFlag) //FRAG_FIX //TMM_EC //JVT-S036 lsj
{
//JVT-P031
SliceHeader * pSliceHeader = NULL;
bLastFragment = false;
if(m_pcNalUnitParser->getDiscardableFlag() == false || m_pcNalUnitParser->getLayerId() == m_uiDecodedLayer)
{
UInt uiPPSId = (m_pcSliceHeader != NULL) ? m_pcSliceHeader->getPicParameterSetId() : 0;
UInt uiNumMbsInSlice = (m_pcSliceHeader != NULL) ? m_pcSliceHeader->getNumMbsInSlice() : 0;
Bool bFGSCompSep = (m_pcSliceHeader != NULL) ? m_pcSliceHeader->getFgsComponentSep() : 0;
if ( m_pcNalUnitParser->getNalUnitType()==NAL_UNIT_CODED_SLICE_SCALABLE && !m_pcNalUnitParser->isTrueNalUnit())
{
RNOK( m_pcSliceReader->readSliceHeaderVirtual(m_pcNalUnitParser->getNalUnitType(),
m_apcMCTFDecoder[1]->m_pcVeryFirstSliceHeader,
m_uiDecompositionStag
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?