📄 h264avcdecoder.cpp
字号:
UInt uiPoc = ( m_uiNextPoc - 1 ) & -(1<<m_uiMaxDecompositionStages);
if ( ui == 0 || m_uiFrameIdx[ui] % (1<<m_uiDecompositionStages[ui]) != 0)
uiFrameNum -= ( 1 << ( m_uiDecompositionStages[ui] - 1 ) );
UInt uiDecompositionStagesSub = m_uiMaxDecompositionStages - m_uiDecompositionStages[ui];
for( UInt uiTemporalLevel = 0; uiTemporalLevel <= m_uiDecompositionStages[ui]; uiTemporalLevel++ )
{
UInt uiStep = ( 1 << ( m_uiDecompositionStages[ui] - uiTemporalLevel ) );
for( UInt uiFrameId = uiStep; uiFrameId <= m_uiGopSize[ui]; uiFrameId += ( uiStep << 1 ) )
{
m_pauiPocInGOP[ui][uiFrameIdx] = (uiFrameId << uiDecompositionStagesSub ) + uiPoc;
m_pauiFrameNumInGOP[ui][uiFrameIdx] = uiFrameNum;
m_pauiTempLevelInGOP[ui][uiFrameIdx] = uiTemporalLevel;
uiFrameIdx++;
if ( uiFrameId % 2 == 0)
uiFrameNum++;
}
}
for ( uiFrameIdx=0; uiFrameIdx<m_uiFrameIdx[ui] % (1<<m_uiDecompositionStages[ui]); uiFrameIdx++)
{
m_pauiPocInGOP[ui][uiFrameIdx] += m_uiMaxGopSize;
m_pauiFrameNumInGOP[ui][uiFrameIdx] += (1<<(m_uiDecompositionStages[ui]-1));
}
}
do
{
if (m_uiFrameIdx[m_uiNextLayerId] % m_uiMaxGopSize < m_uiGopSize[m_uiNextLayerId])
break;
m_uiNextLayerId = (m_uiNextLayerId + 1) % m_uiNumLayers;
}
while( true);
if (m_uiFrameIdx[m_uiNextLayerId] % m_uiMaxGopSize < m_uiGopSize[m_uiNextLayerId])
{
uiMaxFrameNum = 1 << pcSliceHeader->getSPS().getLog2MaxFrameNum();
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];
m_pauiFrameNumInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] += 1 << ( m_uiDecompositionStages[m_uiNextLayerId] - 1);
m_pauiPocInGOP[m_uiNextLayerId][m_uiFrameIdx[m_uiNextLayerId] % uiGopSize] += m_uiMaxGopSize;
m_uiFrameIdx[m_uiNextLayerId]++;
}
if ( frame_num != m_uiNextFrameNum || uiLayerId != m_uiNextLayerId || uiPocLsb != (m_uiNextPoc % uiMaxPocLsb))
{
if ( m_uiNextLayerId == 0)
{
BinData *pcBinData = new BinData;
pcBinData->set( new UChar[11], 11);
// *(pcBinData->data()+0) = NAL_UNIT_VIRTUAL_BASELAYER;
*(pcBinData->data()+0) = NAL_UNIT_CODED_SLICE;
*(Int*)(pcBinData->data()+1) = 0xdeadface;
*(Short*)(pcBinData->data()+5) = (Short)m_uiNextFrameNum;
*(Short*)(pcBinData->data()+7) = (Short)m_uiNextPoc;
*(pcBinData->data()+9) = (UChar)m_uiNextTempLevel;
*(pcBinData->data()+pcBinData->size()-1) = 0;
cVirtualSliceList.pushFront( pcBinData);
}
else
{
BinData *pcBinData = new BinData;
pcBinData->set( new UChar[11], 11);
// *(pcBinData->data()+0) = NAL_UNIT_VIRTUAL_ENHANCELAYER;
*(pcBinData->data()+0) = NAL_UNIT_CODED_SLICE_SCALABLE;
*(Int*)(pcBinData->data()+1) = 0xdeadface;
*(Short*)(pcBinData->data()+5) = (Short)m_uiNextFrameNum;
*(Short*)(pcBinData->data()+7) = (Short)m_uiNextPoc;
*(pcBinData->data()+9) = (UChar)m_uiNextTempLevel;
*(pcBinData->data()+pcBinData->size()-1) = 0;
cVirtualSliceList.pushFront( pcBinData);
}
}
}
}
}
if( pcSliceHeader != NULL )
delete pcSliceHeader;
return Err::m_nOK;
}
//TMM_EC }}
ErrVal
H264AVCDecoder::initPacket( BinDataAccessor* pcBinDataAccessor,
UInt& ruiNalUnitType,
UInt& ruiMbX,
UInt& ruiMbY,
UInt& ruiSize
//,UInt& ruiNonRequiredPic //NonRequired JVT-Q066
//JVT-P031
, Bool bPreParseHeader //FRAG_FIX
, Bool bConcatenated //FRAG_FIX_3
, Bool& rbStartDecoding,
UInt& ruiStartPos,
UInt& ruiEndPos,
Bool& bFragmented,
Bool& bDiscardable
//~JVT-P031
,Bool& UnitAVCFlag //JVT-S036
)
{
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
return Err::m_nOK;
}
Bool KeyPicFlag = false;
static Bool bSuffixUnit = false; //JVT-S036
//JVT-P031
Bool bLastFragment;
UInt uiHeaderBits;
getDecodedResolution(m_uiDecodedLayer);
m_pcNalUnitParser->setDecodedLayer(m_uiDecodedLayer);
ruiStartPos = m_pcNalUnitParser->getNalHeaderSize(pcBinDataAccessor);
ruiStartPos = 0; //FRAG_FIX
//~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
UInt uiBitsLeft = m_pcNalUnitParser->getBitsLeft(); //JVT-P031
ruiNalUnitType = m_pcNalUnitParser->getNalUnitType();
//TMM_EC {{
if(!bPreParseHeader && ruiNalUnitType==NAL_UNIT_END_OF_STREAM)
{
SliceHeader* pTmp = m_pcSliceHeader;
m_pcSliceHeader = m_pcPrevSliceHeader;
m_pcPrevSliceHeader = pTmp;
for ( UInt i=0; i< m_uiNumLayers; i++)
{
if (m_pauiPocInGOP[i]) delete [] m_pauiPocInGOP[i];
if (m_pauiFrameNumInGOP[i]) delete [] m_pauiFrameNumInGOP[i];
if (m_pauiTempLevelInGOP[i]) delete [] m_pauiTempLevelInGOP[i];
}
m_bLastFrame = true;
delete m_pcSliceHeader;
m_pcSliceHeader = 0;
return Err::m_nOK;
}
//TMM_EC }}
switch ( m_pcNalUnitParser->getNalUnitType() )
{
case NAL_UNIT_CODED_SLICE:
case NAL_UNIT_CODED_SLICE_IDR:
{
UnitAVCFlag = true; //JVT-S036
//JVT-P031
RNOK( xStartSlice(bPreParseHeader,bLastFragment, bDiscardable, UnitAVCFlag) ); //FRAG_FIX //TMM_EC //JVT-S036
ruiEndPos = pcBinDataAccessor->size();
bDiscardable = false;
uiHeaderBits = uiBitsLeft - m_pcNalUnitParser->getBitsLeft();
ruiStartPos += (uiHeaderBits+7)>>3;
ruiStartPos = 0; //FRAG_FIX
//~JVT-P031
RNOK( m_pcControlMng ->initSlice0(m_pcSliceHeader) );
m_pcSliceHeader->setKeyPictureFlag (KeyPicFlag);
m_bActive = true;
rbStartDecoding = true; //JVT-P031
bSuffixUnit = true; //JVT-S036
//TMM_EC {{
if (!m_bNotSupport && !bPreParseHeader)
{
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);
if ( m_pcNalUnitParser->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDR || m_uiNextLayerId == 0)
{
UInt uiMaxFrameNum = 1 << m_pcSliceHeader->getSPS().getLog2MaxFrameNum();
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];
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 }}
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] );
}
}
break;
case NAL_UNIT_SPS:
{
SequenceParameterSet* pcSPS = NULL;
RNOK( SequenceParameterSet::create ( pcSPS ) );
pcSPS->SpsMVC = new SpsMvcExtension;
RNOK( pcSPS ->read ( m_pcHeaderSymbolReadIf,
m_pcNalUnitParser->getNalUnitType() ) );
// It is assumed that layer 0 and layer 1 use the first two SPSs, respectively.
if( NULL == m_pcVeryFirstSPS )
{
setVeryFirstSPS( pcSPS );
}
// SPS fix
else if( m_pcVeryFirstSPS->getProfileIdc() != MULTI_VIEW_PROFILE )
{
m_pcVeryFirstSPS->SpsMVC = new SpsMvcExtension; // Nov. 30
m_pcVeryFirstSPS->SpsMVC->setNumViewsMinus1 ( pcSPS->getSpsMVC()->getNumViewMinus1() );
m_puiViewOrder = pcSPS->getSpsMVC()->getViewCodingOrder(); // Dec. 1
}
//TMM_EC {{
for ( UInt i=0; i<m_uiNumLayers; i++)
{
UInt uiDecompositionStagesSub = m_uiMaxDecompositionStages - m_uiDecompositionStages[i];
UInt uiGopSize = m_uiGopSize[i];
m_pauiPocInGOP[i] = new UInt[uiGopSize];
m_pauiFrameNumInGOP[i] = new UInt[uiGopSize];
m_pauiTempLevelInGOP[i] = new UInt[uiGopSize];
UInt uiFrameIdx = 0;
UInt uiFrameNum = 1;
for( UInt uiTemporalLevel = 0; uiTemporalLevel <= m_uiDecompositionStages[i]; uiTemporalLevel++ )
{
UInt uiStep = ( 1 << ( m_uiDecompositionStages[i] - uiTemporalLevel ) );
for( UInt uiFrameId = uiStep; uiFrameId <= uiGopSize; uiFrameId += ( uiStep << 1 ) )
{
m_pauiPocInGOP[i][uiFrameIdx] = uiFrameId << uiDecompositionStagesSub;
m_pauiFrameNumInGOP[i][uiFrameIdx] = uiFrameNum;
m_pauiTempLevelInGOP[i][uiFrameIdx] = uiTemporalLevel;
uiFrameIdx++;
if ( uiFrameId % 2 == 0)
uiFrameNum++;
}
}
}
//TMM_EC }}
if ( pcSPS->getProfileIdc()==SCALABLE_PROFILE )
{
//TMM_EC {{
if ( pcSPS->getSeqParameterSetId() == 0)
{
m_bNotSupport = true;
}
//TMM_EC }}
m_bEnhancementLayer = true;
}
m_bNewSPS = true;
RNOK( m_pcParameterSetMng ->store ( pcSPS ) );
// Copy simple priority ID mapping from SPS to NAL unit parser
ruiMbX = pcSPS->getFrameWidthInMbs ();
ruiMbY = pcSPS->getFrameHeightInMbs();
ruiSize = max( ruiSize, ( (ruiMbX << 3 ) + YUV_X_MARGIN ) * ( ( ruiMbY << 3 ) + YUV_Y_MARGIN ) * 6 );
m_pcControlMng->initSPS( *pcSPS, m_uiRecLayerId );
ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
m_bFGSCodingMode = pcSPS->getFGSCodingMode();
m_uiGroupingSize = pcSPS->getGroupingSize ();
UInt ui;
for(ui = 0; ui < 16; ui++)
{
m_uiPosVect[ui] = pcSPS->getPosVect(ui);
}
}
break;
case NAL_UNIT_PPS:
{
PictureParameterSet* pcPPS = NULL;
RNOK( PictureParameterSet::create( pcPPS ) );
RNOK( pcPPS->read( m_pcHeaderSymbolReadIf,
m_pcNalUnitParser->getNalUnitType() ) );
RNOK( m_pcParameterSetMng->store( pcPPS ) );
ruiEndPos = pcBinDataAccessor->size();//JVT-P031
bDiscardable = false;//JVT-P031
rbStartDecoding = true;//JVT-P031
}
break;
case NAL_UNIT_CODED_SLICE_PREFIX: // JVT-W035
{
rbStartDecoding = true;
initPacketPrefix( pcBinDataAccessor,
ruiNalUnitType,
bPreParseHeader, //FRAG_FIX
bConcatenated,//FRAG_FIX_3
rbStartDecoding,
m_pcSliceHeader
,m_pcNalUnitParser
);
ruiEndPos = pcBinDataAccessor->size();
}
break;
case NAL_UNIT_CODED_SLICE_SCALABLE:
case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
{
if(m_pcNalUnitParser->getSvcMvcFlag())
{
//for now MVC silce data are AVC compatible only high level syntax is different
UnitAVCFlag = true;
RNOK( xStartSlice(bPreParseHeader,bLastFragment, bDiscardable, UnitAVCFlag) ); //FRAG_FIX //TMM_EC //JVT-S036
ruiEndPos = pcBinDataAccessor->size();
bDiscardable = false;
uiHeaderBits = uiBitsLeft - m_pcNalUnitParser->getBitsLeft();
ruiStartPos += (uiHeaderBits+7)>>3;
ruiStartPos = 0; //FRAG_FIX
//~JVT-P031
RNOK( m_pcControlMng->initSlice0(m_pcSliceHeader) );
// m_pcSliceHeader->setKeyPictureFlag (KeyPicFlag);
m_bActive = true;
rbStartDecoding = true; //JVT-P031
//TMM_EC {{
if (!m_bNotSupport && !bPreParseHeader)
{
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -