createrh264avcdecoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 969 行 · 第 1/3 页
CPP
969 行
switch( pcSEIMessage->getMessageType() )
{
case SEI::SUB_SEQ_INFO:
{
SEI::SubSeqInfo* pcSubSeqInfo = (SEI::SubSeqInfo*) pcSEIMessage;
uiLevel = pcSubSeqInfo->getSubSeqLayerNum();
uiLayer = 0;
bApplyToNext = true;
delete pcSEIMessage;
break;
}
case SEI::SCALABLE_SEI:
{
uiLevel = 0;
uiLayer = 0;
pcScalableSEIMessage = pcSEIMessage;
{
//====set parameters used for further parsing =====
SEI::ScalableSei* pcSEI = (SEI::ScalableSei*)pcSEIMessage;
UInt uiNumScalableLayers = pcSEI->getNumLayersMinus1() + 1;
for(UInt uiIndex = 0; uiIndex < uiNumScalableLayers; uiIndex++ )
{
if( pcSEI->getDependencyId( uiIndex ) == 0 )
{
// BUG_FIX liuhui{
m_uiStdAVCOffset = pcSEI->getTemporalLevel( uiIndex );
pcSEI->setStdAVCOffset( m_uiStdAVCOffset );
break;
// BUG_FIX liuhui}
}
else
break;
}
}
SEI::ScalableSei* pcSEI = (SEI::ScalableSei*)pcSEIMessage;
m_uiNum_layers = pcSEI->getNumLayersMinus1() + 1;
for(int i=0; i< m_uiNum_layers; i++)
{
m_ID_ROI[i] = pcSEI->getRoiId(i);
m_ID_Dependency[i] = pcSEI->getDependencyId(i);
}
break;
}
case SEI::MOTION_SEI:
{
SEI::MotionSEI* pcSEI = (SEI::MotionSEI*)pcSEIMessage;
m_silceIDOfSubPicLayer[m_layer_id] = pcSEI->m_slice_group_id[0];
break;
}
// JVT-S080 LMI {
case SEI::SCALABLE_SEI_LAYERS_NOT_PRESENT:
case SEI::SCALABLE_SEI_DEPENDENCY_CHANGE:
{
pcScalableSEIMessage = pcSEIMessage;
break;
}
// JVT-S080 LMI }
case SEI::SUB_PIC_SEI:
{
SEI::SubPicSei* pcSEI = (SEI::SubPicSei*)pcSEIMessage;
m_layer_id = pcSEI->getLayerId();
bApplyToNext = true;
break;
}
//{{Quality level estimation and modified truncation- JVTO044 and m12007
//France Telecom R&D-(nathalie.cammas@francetelecom.com)
case SEI::QUALITYLEVEL_SEI:
{
UInt uiNum = 0;
UInt uiDeltaBytesRateOfLevel = 0;
UInt uiQualityLevel = 0;
SEI::QualityLevelSEI* pcSEI = (SEI::QualityLevelSEI*)pcSEIMessage;
uiNum = pcSEI->getNumLevel();
rcPacketDescription.uiNumLevelsQL = uiNum;
for(UInt ui = 0; ui < uiNum; ui++)
{
uiQualityLevel = pcSEI->getQualityLevel(ui);
uiDeltaBytesRateOfLevel = pcSEI->getDeltaBytesRateOfLevel(ui);
rcPacketDescription.auiQualityLevelQL[ui] = uiQualityLevel;
rcPacketDescription.auiDeltaBytesRateOfLevelQL[ui] = uiDeltaBytesRateOfLevel;
}
uiLayer = pcSEI->getDependencyId();
bApplyToNext = true;
break;
}
//}}Quality level estimation and modified truncation- JVTO044 and m12007
case SEI::NON_REQUIRED_SEI:
{
m_pcNonRequiredSEI = (SEI::NonRequiredSei*) pcSEIMessage;
m_uiNonRequiredSeiFlag = 1;
break;
}
default:
{
delete pcSEIMessage;
}
}
}
m_pcNalUnitParser->closeNalUnit();
}
if( eNalUnitType != NAL_UNIT_SEI )
{
ULong* pulData = (ULong*)( pcBinData->data() + 1 );
UInt uiSize = 8 * ( pcBinData->size() - 1 ) - 1;
RNOK( m_pcBitReadBuffer->initPacket( pulData, uiSize ) );
uiSize = pcBinData->byteSize();
BinData cBinData( new UChar[uiSize], uiSize );
memcpy( cBinData.data(), pcBinData->data(), uiSize );
BinDataAccessor cBinDataAccessor;
cBinData.setMemAccessor( cBinDataAccessor );
m_pcNalUnitParser->setCheckAllNALUs(true); //JVT-P031
UInt uiNumBytesRemoved; //FIX_FRAG_CAVLC
RNOK( m_pcNalUnitParser->initNalUnit( &cBinDataAccessor, NULL, uiNumBytesRemoved ) ); //FIX_FRAG_CAVLC
m_pcNalUnitParser->setCheckAllNALUs(false);//JVT-P031
// get the SPSid
if(eNalUnitType == NAL_UNIT_SPS )
{
SequenceParameterSet* pcSPS = NULL;
RNOK( SequenceParameterSet::create ( pcSPS ) );
RNOK( pcSPS->read( m_pcUvlcReader, eNalUnitType ) );
// Copy simple priority ID mapping from SPS
/* if ( !pcSPS->getNalUnitExtFlag() && (pcSPS->getProfileIdc() == SCALABLE_PROFILE) ) // bugfix mwi 050727
{
for ( UInt uiPriId = 0; uiPriId < pcSPS->getNumSimplePriIdVals(); uiPriId++)
{
UInt uiDependencyId, uiTempLevel, uiQualLevel;
pcSPS->getSimplePriorityMap( uiPriId, uiTempLevel, uiDependencyId, uiQualLevel );
m_uiTemporalLevelList[uiPriId] = uiTempLevel;
m_uiDependencyIdList [uiPriId] = uiDependencyId;
m_uiQualityLevelList [uiPriId] = uiQualLevel;
}
}
JVT-S036 lsj */
uiSPSid = pcSPS->getSeqParameterSetId();
pcSPS->destroy();
}
// get the PPSid and the referenced SPSid
else if( eNalUnitType == NAL_UNIT_PPS )
{
PictureParameterSet* pcPPS = NULL;
RNOK( PictureParameterSet::create ( pcPPS ) );
RNOK( pcPPS->read( m_pcUvlcReader, eNalUnitType ) );
uiPPSid = pcPPS->getPicParameterSetId();
uiSPSid = pcPPS->getSeqParameterSetId();
// FMO ROI ICU/ETRI
m_uiNumSliceGroupsMinus1 = pcPPS->getNumSliceGroupsMinus1();
for(UInt i=0; i<=m_uiNumSliceGroupsMinus1; i++)
{
uiaAddrFirstMBofROIs[uiPPSid ][i] = pcPPS->getTopLeft (i);
uiaAddrLastMBofROIs[uiPPSid ][i] = pcPPS->getBottomRight (i);
}
pcPPS->destroy();
rcPacketDescription.SPSidRefByPPS[uiPPSid] = uiSPSid;
}
// get the PPSid and SPSid referenced by the slice header
else if( eNalUnitType == NAL_UNIT_CODED_SLICE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR ||
eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE )
{
//BUG FIX Kai Zhang{
if(!(uiLayer == 0 && uiFGSLayer == 0 && m_bAVCCompatible&&
(eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE||eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE))){
UInt uiTemp;
Bool bTemp;
//JVT-P031
RNOK( m_pcUvlcReader->getUvlc( uiTemp, "SH: first_mb_in_slice" ) );
// FMO ROI ICU/ETRI
rcPacketDescription.uiFirstMb = uiTemp;
RNOK( m_pcUvlcReader->getUvlc( uiTemp, "SH: slice_type" ) );
if(uiTemp == F_SLICE)
{
RNOK( m_pcUvlcReader->getFlag( bFragmentedFlag, "SH: fragmented_flag" ) );
if(bFragmentedFlag)
{
RNOK( m_pcUvlcReader->getUvlc(uiFragmentOrder, "SH: fragment_order" ) );
if(uiFragmentOrder!=0)
{
RNOK( m_pcUvlcReader->getFlag( bLastFragmentFlag, "SH: last_fragment_flag" ) );
}
}
if(uiFragmentOrder == 0 )
{
RNOK( m_pcUvlcReader ->getUvlc( uiTemp, "SH: num_mbs_in_slice" ) );
RNOK( m_pcUvlcReader ->getFlag( bTemp, "SH: fgs_comp_sep" ) );
}
}
if(uiFragmentOrder == 0)
{
RNOK( m_pcUvlcReader->getUvlc( uiPPSid, "SH: pic_parameter_set_id" ) );
uiSPSid = rcPacketDescription.SPSidRefByPPS[uiPPSid];
}
//~JVT-P031
m_uiCurrPicLayer = (uiLayer << 4) + uiFGSLayer;
if(m_uiCurrPicLayer <= m_uiPrevPicLayer && m_uiNonRequiredSeiFlag != 1)
{
m_pcNonRequiredSEI->destroy();
m_pcNonRequiredSEI = NULL;
}
m_uiNonRequiredSeiFlag = 0;
m_uiPrevPicLayer = m_uiCurrPicLayer;
}
//BUG_FIX Kai Zhang}
}
m_pcNalUnitParser->closeNalUnit();
}
rcPacketDescription.NalUnitType = eNalUnitType;
rcPacketDescription.SPSid = uiSPSid;
rcPacketDescription.PPSid = uiPPSid;
rcPacketDescription.Scalable = bScalable;
rcPacketDescription.ParameterSet = bParameterSet;
rcPacketDescription.Layer = uiLayer;
rcPacketDescription.FGSLayer = uiFGSLayer;
rcPacketDescription.Level = uiLevel;
rcPacketDescription.ApplyToNext = bApplyToNext;
rcPacketDescription.uiPId = uiSimplePriorityId;
rcPacketDescription.bDiscardable = bDiscardableFlag;//JVT-P031
rcPacketDescription.bFragmentedFlag = bFragmentedFlag;//JVT-P031
rcPacketDescription.NalRefIdc = eNalRefIdc;
return Err::m_nOK;
}
ErrVal
H264AVCPacketAnalyzer::create( H264AVCPacketAnalyzer*& rpcH264AVCPacketAnalyzer )
{
rpcH264AVCPacketAnalyzer = new H264AVCPacketAnalyzer;
ROT( NULL == rpcH264AVCPacketAnalyzer );
RNOK( rpcH264AVCPacketAnalyzer->xCreate() )
return Err::m_nOK;
}
ErrVal
H264AVCPacketAnalyzer::xCreate()
{
RNOK( BitReadBuffer::create( m_pcBitReadBuffer ) );
RNOK( UvlcReader ::create( m_pcUvlcReader ) );
RNOK( NalUnitParser::create( m_pcNalUnitParser ) );
return Err::m_nOK;
}
ErrVal
H264AVCPacketAnalyzer::destroy()
{
RNOK( m_pcBitReadBuffer ->destroy() );
RNOK( m_pcUvlcReader ->destroy() );
RNOK( m_pcNalUnitParser ->destroy() );
delete this;
return Err::m_nOK;
}
ErrVal
H264AVCPacketAnalyzer::init()
{
RNOK( m_pcBitReadBuffer ->init() );
RNOK( m_pcUvlcReader ->init( m_pcBitReadBuffer ) );
RNOK( m_pcNalUnitParser ->init( m_pcBitReadBuffer ) );
::memset( m_auiDecompositionStages, 0x00, MAX_LAYERS*sizeof(UInt) );
return Err::m_nOK;
}
ErrVal
H264AVCPacketAnalyzer::uninit()
{
RNOK( m_pcBitReadBuffer ->uninit() );
RNOK( m_pcUvlcReader ->uninit() );
return Err::m_nOK;
}
// JVT-Q054 Red. Picture {
Bool
CreaterH264AVCDecoder::isRedundantPic()
{
return m_pcH264AVCDecoder->isRedundantPic();
}
ErrVal
CreaterH264AVCDecoder::checkRedundantPic()
{
return m_pcH264AVCDecoder->checkRedundantPic();
}
// JVT-Q054 Red. Picture }
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?