📄 h264avcdecoder.cpp
字号:
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);
m_uiNumOfNALInAU++; //TMM_EC
}
}
}
}
}
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* pbFgsParallelDecoding
, UInt* puiNumFragments
, UChar** ppucFragBuffers
)
{
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; //bug-fix suffix shenqiu
static Bool bSuffixUnit = false; //JVT-S036 lsj
Bool bFirstFragment;
//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
//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, false, puiNumFragments, ppucFragBuffers) ); //BUG_FIX_FT_01_2006_2 //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu}}
UInt uiBitsLeft = m_pcNalUnitParser->getBitsLeft(); //JVT-P031
ruiNalUnitType = m_pcNalUnitParser->getNalUnitType();
//prefix unit{{
if(m_pcPrefixSliceHeader && (ruiNalUnitType != NAL_UNIT_CODED_SLICE && ruiNalUnitType != NAL_UNIT_CODED_SLICE_IDR))
{
delete m_pcPrefixSliceHeader;
m_pcPrefixSliceHeader = NULL;
bDiscardable = true;//JVT-P031
rbStartDecoding = true;//JVT-P031
ruiEndPos = pcBinDataAccessor->size(); //JVT-P031
return Err::m_nOK;
}
//prefix unit}}
//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 = NULL;
return Err::m_nOK;
}
//TMM_EC }}
switch ( m_pcNalUnitParser->getNalUnitType() )
{
case NAL_UNIT_CODED_SLICE:
case NAL_UNIT_CODED_SLICE_IDR:
{
//JVT-P031
RNOK( xStartSlice(bPreParseHeader,bFirstFragment, bLastFragment, pbFgsParallelDecoding, bDiscardable) ); //FRAG_FIX //TMM_EC //JVT-S036 lsj
//prefix unit{{
if(m_pcPrefixSliceHeader)
{
m_pcSliceHeader->copyPrefix(*m_pcPrefixSliceHeader);
delete m_pcPrefixSliceHeader;
m_pcPrefixSliceHeader = NULL;
}
//prefix unit}}
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_bActive = true;
rbStartDecoding = true; //JVT-P031
bSuffixUnit = true; //JVT-S036 lsj
//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();
//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 }}
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_SPS:
{
SequenceParameterSet* pcSPS = NULL;
RNOK( SequenceParameterSet::create ( pcSPS ) );
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 );
}
//TMM_EC {{
for ( UInt i=0; i<m_uiNumLayers; i++)
{
UInt uiDecompositionStagesSub = m_uiMaxDecompositionStages - m_uiDecompositionStages[i];
UInt uiGopSize = m_uiGopSize[i];
//NS leak fix begin
if (m_pauiPocInGOP[i]) delete [] m_pauiPocInGOP[i];
if (m_pauiFrameNumInGOP[i]) delete [] m_pauiFrameNumInGOP[i];
if (m_pauiTempLevelInGOP[i]) delete [] m_pauiTempLevelInGOP[i];
//NS leak fix end
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;
m_baseMode = 0;
}
//TMM_EC }}
m_bEnhancementLayer = true;
m_bSpatialScalability = pcSPS->getFrameHeightInMbs() != m_pcVeryFirstSPS->getFrameHeightInMbs();
}
m_bNewSPS = true;
RNOK( m_pcParameterSetMng ->store ( pcSPS ) );
// Copy simple priority ID mapping from SPS to NAL unit parser
/* if ( !pcSPS->getNalUnitExtFlag() )
{
for ( UInt uiPriId = 0; uiPriId < pcSPS->getNumSimplePriIdVals(); uiPriId++)
{
UInt uiLayer, uiTempLevel, uiQualLevel;
pcSPS->getSimplePriorityMap( uiPriId, uiTempLevel, uiLayer, uiQualLevel );
m_pcNalUnitParser->setSimplePriorityMap( uiPriId, uiTempLevel, uiLayer, uiQualLevel );
}
}
JVT-S036 lsj */
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
if( pcSPS->getNumFGSVectModes() == 1)
{
m_bFGSCodingMode = pcSPS->getFGSCodingMode( 0 );
m_uiGroupingSize = pcSPS->getGroupingSize ( 0 );
UInt ui;
for(ui = 0; ui < 16; ui++)
{
m_uiPosVect[ui] = pcSPS->getPosVect( 0, ui );
}
}
else if( m_pcSliceHeader )
{
m_bFGSCodingMode = m_pcSliceHeader->getFGSCodingMode();
m_uiGroupingSize = m_pcSliceHeader->getGroupingSize ();
UInt ui;
for(ui = 0; ui < 16; ui++)
{
m_uiPosVect[ui] = m_pcSliceHeader->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_SCALABLE:
case NAL_UNIT_CODED_SLICE_IDR_SCALABLE:
{
bFragmented = m_pcNalUnitParser->getFragmentedFlag() && (m_pcNalUnitParser->getFragmentOrder()!=0 || !m_pcNalUnitParser->getLastFragmentFlag());
//JVT-P031
getDecodedResolution(m_uiDecodedLayer);
if(m_pcNalUnitParser->getLayerId() < m_uiDecodedLayer && m_pcNalUnitParser->getDiscardableFlag())
bDiscardable = true;
else
bDiscardable = false;
RNOK( xStartSlice(bPreParseHeader, bFirstFragment, bLastFragment, pbFgsParallelDecoding, bDiscardable) );
if(bDiscardable)
ruiEndPos = 0;
else
ruiEndPos = pcBinDataAccessor->size();
uiHeaderBits = uiBitsLeft - m_pcNalUnitParser->getBitsLeft();
// JVT-U116 LMI {
UChar ucByte = pcBinDataAccessor->data()[3];
if ( ucByte & 1 )
uiHeaderBits += 8;
// JVT-U116 LMI }
if( (bDiscardable) || (!bFragmented) || (bFragmented && m_pcNalUnitParser->getFragmentOrder()==0) )
{
ruiStartPos = 0;
}
else
{
ruiStartPos += (uiHeaderBits+(1+NAL_UNIT_HEADER_SVC_EXTENSION_BYTES)*8+7)>>3;//BUG_FIX_FT_01_2006_2
//(1+NAL_UNIT_HEADER_SVC_EXTENSION_BYTES)*8 is used to take into account the nal header which has already been read
}
if(m_pcNalUnitParser->getFragmentedFlag() && ! m_pcNalUnitParser->getLastFragmentFlag())
{ //FIX_FRAG_CAVLC
if(bPreParseHeader)
{
ruiEndPos -= uiNumBytesRemoved;
}//~FIX_FRAG_CAVLC
while( pcBinDataAccessor->data()[ruiEndPos - 1] == 0 )
ruiEndPos --;
if( pbFgsParallelDecoding != 0 && (! (*pbFgsParallelDecoding) ) )
{
ruiEndPos --;
}
}//FIX_FRAG_CAVLC
if(!bDiscardable)//~JVT-P031
RNOK( m_pcControlMng ->initSlice0(m_pcSliceHeader) );
//bug-fix suffix shenqiu{{
// if(m_pcSliceHeader) //JVT-P031
//bug-fix suffix shenqiu
//JVT-P031
// the variable m_pcSliceHeader->m_uiLastFragOrder is not updated
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -