📄 h264avcdecoder.cpp
字号:
if( (bLastFragment) || (!bFragmented) ||
( bFragmented && m_uiLastFragOrder+1 == m_uiNumberOfFragment[m_pcSliceHeader->getLayerId()][m_pcSliceHeader->getQualityLevel()]))
rbStartDecoding = true;
//~JVT-P031
//TMM_EC {{
if ( !m_bNotSupport && !bPreParseHeader && m_pcNalUnitParser->getQualityLevel() == 0)
{
UInt uiMaxGopSize = m_uiMaxGopSize;
UInt uiGopSize;
m_uiNextLayerId = m_pcSliceHeader->getLayerId();
do
{
m_uiNextLayerId = (m_uiNextLayerId + 1) % m_uiNumLayers;
uiGopSize = 1 << m_uiDecompositionStages[m_uiNextLayerId];
if (m_uiFrameIdx[m_uiNextLayerId] % uiMaxGopSize < m_uiGopSize[m_uiNextLayerId])
break;
m_uiFrameIdx[m_uiNextLayerId]++;
}
while( true);
//EC bug fix
if ( m_pcNalUnitParser->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR_SCALABLE || m_uiNextLayerId == 0)
{
UInt uiMaxFrameNum = 1 << m_pcSliceHeader->getSPS().getLog2MaxFrameNum();
//UInt uiMaxPocLsb = 1 << m_pcSliceHeader->getSPS().getLog2MaxPicOrderCntLsb();
m_uiNextFrameNum = m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] % uiMaxFrameNum;
m_uiNextPoc = m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize];
m_uiNextTempLevel = m_pauiTempLevelInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize];
if ( uiGopSize == 1)
m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] += 1;
else
m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] += uiGopSize >> 1;
m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] += uiMaxGopSize;
m_uiFrameIdx[m_uiNextLayerId]++;
}
else
{
m_uiNextFrameNum = 0;
m_uiNextPoc = 0;
}
}
//TMM_EC }}
if(m_pcSliceHeader)
{
m_pcSliceHeader->setFGSCodingMode( m_bFGSCodingMode );
m_pcSliceHeader->setGroupingSize ( m_uiGroupingSize );
UInt ui;
for(ui = 0; ui < 16; ui++)
{
m_pcSliceHeader->setPosVect( ui, m_uiPosVect[ui] );
}
RNOK( m_pcSliceHeader->checkPosVectors() );
}
}
break;
case NAL_UNIT_SEI:
{
//===== just for trace file =====
SEI::MessageList cMessageList;
UInt i;
RNOK( SEI::read( m_pcHeaderSymbolReadIf, cMessageList ) );
while( ! cMessageList.empty() )
{
SEI::SEIMessage* pcSEIMessage = cMessageList.popBack();
if(pcSEIMessage->getMessageType() == SEI::NON_REQUIRED_SEI)
{
m_pcNonRequiredSei = (SEI::NonRequiredSei*) pcSEIMessage;
m_uiNonRequiredSeiReadFlag = 1;
}
else
{
if ( pcSEIMessage->getMessageType() == SEI::SCALABLE_SEI)
{
// trick
m_uiNumLayers = ((SEI::ScalableSei*)pcSEIMessage)->getDependencyId( ((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1()) + 1;
for ( uiLayerId=0; uiLayerId<((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1()+1; uiLayerId++)
{
if ( ((SEI::ScalableSei*)pcSEIMessage)->getDependencyId( uiLayerId) != 0)
break;
}
uiLayerId--;
m_uiDecompositionStages[0] = ((SEI::ScalableSei*)pcSEIMessage)->getTemporalLevel( uiLayerId);
m_uiDecompositionStages[m_uiNumLayers-1] = ((SEI::ScalableSei*)pcSEIMessage)->getTemporalLevel( ((SEI::ScalableSei*)pcSEIMessage)->getNumLayersMinus1());
m_uiMaxDecompositionStages = m_uiDecompositionStages[m_uiNumLayers-1];
m_uiMaxGopSize = 1 << m_uiMaxDecompositionStages;
for ( i=0; i< m_uiNumLayers; i++)
m_uiGopSize[i] = 1 << m_uiDecompositionStages[i];
}
// JVT-T073 {
else if( pcSEIMessage->getMessageType() == SEI::SCALABLE_NESTING_SEI )
{
//do nothing, or add your code here
}
// JVT-T073 }
delete pcSEIMessage;
pcSEIMessage = NULL;
}
}
ruiEndPos = (uiBitsLeft+7)/8; //FRAG_FIX
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
break;
case NAL_UNIT_ACCESS_UNIT_DELIMITER:
{
RNOK ( m_pcNalUnitParser->readAUDelimiter());
ruiEndPos = pcBinDataAccessor->size();//JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
break;
case NAL_UNIT_END_OF_SEQUENCE:
{
RNOK ( m_pcNalUnitParser->readEndOfSeqence());
ruiEndPos = pcBinDataAccessor->size();//JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
case NAL_UNIT_END_OF_STREAM:
{
RNOK ( m_pcNalUnitParser->readEndOfStream());
ruiEndPos = pcBinDataAccessor->size();//JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
break;
//prefix unit{{
case NAL_UNIT_PREFIX:
{
SequenceParameterSet* pcSPS;
PictureParameterSet* pcPPS;
RNOK( m_pcParameterSetMng ->get ( pcPPS, 0) );
RNOK( m_pcParameterSetMng ->get ( pcSPS, 0) );
if(m_pcPrefixSliceHeader)
{
delete m_pcPrefixSliceHeader;
m_pcPrefixSliceHeader = NULL;
}
m_pcPrefixSliceHeader = new SliceHeader(*pcSPS, *pcPPS);
RNOK( m_pcSliceReader->readSliceHeaderPrefix( m_pcNalUnitParser->getNalUnitType (),
m_pcNalUnitParser->getNalRefIdc (),
m_pcNalUnitParser->getLayerId (),
m_pcNalUnitParser->getQualityLevel (),
m_pcNalUnitParser->getUseBasePredFlag(),
m_pcPrefixSliceHeader
)
);
ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
break;
//prefix unit}}
default:
return Err::m_nERR;
break;
}
m_uiNonRequiredPic = 0; //NonRequired JVT-Q066
//ruiNonRequiredPic = 0;
if(m_pcSliceHeader)
{
m_uiCurrPicLayer = (m_pcSliceHeader->getLayerId() << 4) + m_pcSliceHeader->getQualityLevel();
if(m_uiCurrPicLayer == 0 || m_uiCurrPicLayer <= m_uiPrevPicLayer)
{
if(m_uiNonRequiredSeiReadFlag == 0 && m_pcNonRequiredSei)
{
m_pcNonRequiredSei->destroy();
m_pcNonRequiredSei = NULL;
}
m_uiNonRequiredSeiRead = m_uiNonRequiredSeiReadFlag;
m_uiNonRequiredSeiReadFlag = 0;
}
m_uiPrevPicLayer = m_uiCurrPicLayer;
if(m_uiNonRequiredSeiRead == 1)
{
for(UInt i = 0; i <= m_pcNonRequiredSei->getNumInfoEntriesMinus1(); i++)
{
if(m_pcNonRequiredSei->getEntryDependencyId(i)) // it should be changed to if(DenpendencyId == LayerId of the shown picture)
{
for(UInt j = 0; j <= m_pcNonRequiredSei->getNumNonRequiredPicsMinus1(i); j++)
{
if(m_pcSliceHeader->getLayerId() == m_pcNonRequiredSei->getNonRequiredPicDependencyId(i,j) &&
m_pcSliceHeader->getQualityLevel() == m_pcNonRequiredSei->getNonRequiredPicQulityLevel(i,j)) // it should be add something about FragmentFlag
{
m_uiNonRequiredPic = 1; //NonRequired JVT-Q066
// ruiNonRequiredPic = 1;
ROTRS( m_apcMCTFDecoder[m_pcSliceHeader->getLayerId()]->getWaitForIdr() && !m_pcSliceHeader->isIdrNalUnit(), Err::m_nOK );
m_apcMCTFDecoder[m_pcSliceHeader->getLayerId()]->setWaitForIdr(false);
return Err::m_nOK;
}
}
}
}
}
#ifdef SHARP_AVC_REWRITE_OUTPUT
if ((m_pcSliceHeader->getAVCRewriteFlag()))
{
m_avcRewriteFlag = true;
}
#endif
}
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 = NULL;
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; //bug-fix suffix shenqiu
getDecodedResolution(m_uiDecodedLayer);
m_pcNalUnitParser->setDecodedLayer(m_uiDecodedLayer);
//~JVT-P031
UInt uiNumBytesRemoved; //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu{{
//RNOK( m_pcNalUnitParser->initNalUnit( pcBinDataAccessor, &KeyPicFlag,uiNumBytesRemoved, bPreParseHeader , bConcatenated) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC
RNOK( m_pcNalUnitParser->initNalUnit( pcBinDataAccessor, uiNumBytesRemoved, bPreParseHeader , bConcatenated) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu}}
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 (),
m_pcNalUnitParser->getUseBasePredFlag(),
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::getBaseLayerUnit(UInt uiBaseLayerId,
Int iPoc,
DPBUnit* &pcBaseDPBUnit)
{
RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerUnit( iPoc , pcBaseDPBUnit) );
return Err::m_nOK;
}
ErrVal
H264AVCDecoder::getBaseLayerData( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
MbDataCtrl*& pcMbDataCtrlEL,
Bool& rbConstrainedIPred,
Bool& rbSpatialScalability,
UInt uiLayerId,
UInt uiBaseLayerId,
Int iPoc,
UInt uiBaseQualityLevel) //JVT-T054
{
if(uiBaseLayerId != 0 || !m_apcMCTFDecoder[uiBaseLayerId]->getAVCBased() ||
(uiBaseQualityLevel != 0 && m_bCGSSNRInAU))
{
//===== base layer is scalable extension =====
//--- get data ---
RNOK( m_apcMCTFDecoder[uiBaseLayerId]->getBaseLayerData( pcFrame,
pcResidual,
pcMbDataCtrl,
pcMbDataCtrlEL,
rbConstrainedIPred,
rbSpatialScalability,
iPoc ) );
}
else
{
//===== base layer is standard H.264/AVC =====
FrameUnit* pcFrameUnit = m_pcFrameMng->getReconstructedFrameUnit( iPoc );
ROF( pcFrameUnit );
pcFrame = rbSpatialScalability ? m_pcFrameMng->getRefinementIntFrame2():
m_pcFrameMng->getRefinementIntFrame();
pcResidual = pcFrameUnit ->getResidual();
pcMbDataCtrl = pcFrameUnit ->getMbDataCtrl();
pcMbDataCtrlEL = m_pcBaseLayerCtrlEL;
rbConstrainedIPred = pcFrameUnit ->getContrainedIntraPred();
}
return Err::m_nOK;
}
ErrVal
H264AVCDecoder::getBaseLayerDataAvailability( IntFrame*& pcFrame,
IntFrame*& pcResidual,
MbDataCtrl*& pcMbDataCtrl,
Boo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -