📄 createrh264avcdecoder.cpp
字号:
RNOK( SampleWeighting ::create( m_pcSampleWeighting ) );
RNOK( QuarterPelFilter ::create( m_pcQuarterPelFilter ) );
RNOK( Transform ::create( m_pcTransform ) );
return Err::m_nOK;
}
ErrVal CreaterH264AVCDecoder::destroy()
{
RNOK( m_pcFrameMng ->destroy() );
RNOK( m_pcSliceDecoder ->destroy() );
RNOK( m_pcSliceReader ->destroy() );
RNOK( m_pcBitReadBuffer ->destroy() );
RNOK( m_pcUvlcReader ->destroy() );
RNOK( m_pcMbParser ->destroy() );
RNOK( m_pcLoopFilter ->destroy() );
RNOK( m_pcMbDecoder ->destroy() );
RNOK( m_pcTransform ->destroy() );
RNOK( m_pcIntraPrediction ->destroy() );
RNOK( m_pcMotionCompensation ->destroy() );
RNOK( m_pcQuarterPelFilter ->destroy() );
RNOK( m_pcCabacReader ->destroy() );
RNOK( m_pcNalUnitParser ->destroy() );
RNOK( m_pcParameterSetMng ->destroy() );
RNOK( m_pcSampleWeighting ->destroy() );
RNOK( m_pcH264AVCDecoder ->destroy() );
RNOK( m_pcRQFGSDecoder ->destroy() );
RNOK( m_pcControlMng ->destroy() );
RNOK( m_pcReconstructionBypass ->destroy() );
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
RNOK( m_apcDecodedPicBuffer [uiLayer]->destroy() );
RNOK( m_apcMCTFDecoder [uiLayer]->destroy() );
RNOK( m_apcPocCalculator [uiLayer]->destroy() );
RNOK( m_apcYuvFullPelBufferCtrl[uiLayer]->destroy() );
}
delete this;
return Err::m_nOK;
}
ErrVal CreaterH264AVCDecoder::init( Bool bOpenTrace )
{
if( bOpenTrace )
{
INIT_DTRACE;
OPEN_DTRACE;
}
RNOK( m_pcBitReadBuffer ->init() );
RNOK( m_pcNalUnitParser ->init( m_pcBitReadBuffer ));
RNOK( m_pcUvlcReader ->init( m_pcBitReadBuffer ) );
RNOK( m_pcCabacReader ->init( m_pcBitReadBuffer ) );
RNOK( m_pcQuarterPelFilter ->init() );
RNOK( m_pcParameterSetMng ->init() );
RNOK( m_pcSampleWeighting ->init() );
RNOK( m_pcFrameMng ->init( m_apcYuvFullPelBufferCtrl[0] ) );
RNOK( m_pcSliceDecoder ->init( m_pcMbDecoder,
m_pcControlMng,
m_pcTransform) );
RNOK( m_pcSliceReader ->init( m_pcUvlcReader,
m_pcParameterSetMng,
m_pcMbParser,
m_pcControlMng ) );
RNOK( m_pcMbParser ->init( m_pcTransform ) );
RNOK( m_pcLoopFilter ->init( m_pcControlMng , m_pcReconstructionBypass ) );
RNOK( m_pcIntraPrediction ->init() );
RNOK( m_pcMotionCompensation ->init( m_pcQuarterPelFilter,
m_pcTransform,
m_pcSampleWeighting ) );
RNOK( m_pcMbDecoder ->init( m_pcTransform,
m_pcIntraPrediction,
m_pcMotionCompensation,
m_pcFrameMng ) );
RNOK( m_pcH264AVCDecoder ->init( m_apcMCTFDecoder,
m_pcSliceReader,
m_pcSliceDecoder,
m_pcRQFGSDecoder,
m_pcFrameMng,
m_pcNalUnitParser,
m_pcControlMng,
m_pcLoopFilter,
m_pcUvlcReader,
m_pcParameterSetMng,
m_apcPocCalculator[0],
m_pcMotionCompensation) );
RNOK( m_pcRQFGSDecoder ->init( m_apcYuvFullPelBufferCtrl,
m_pcTransform,
m_pcMbParser,
m_pcMbDecoder,
m_pcUvlcReader,
m_pcCabacReader) );
RNOK( m_pcReconstructionBypass ->init() );
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
RNOK( m_apcDecodedPicBuffer[uiLayer]->init ( m_apcYuvFullPelBufferCtrl [uiLayer],
uiLayer ) );
RNOK( m_apcMCTFDecoder [uiLayer]->init ( m_pcH264AVCDecoder,
m_pcSliceReader,
m_pcSliceDecoder,
m_pcRQFGSDecoder,
m_pcNalUnitParser,
m_pcControlMng,
m_pcLoopFilter,
m_pcUvlcReader,
m_pcParameterSetMng,
m_apcPocCalculator [uiLayer],
m_apcYuvFullPelBufferCtrl [uiLayer],
m_apcDecodedPicBuffer [uiLayer],
m_pcMotionCompensation,
m_pcQuarterPelFilter
//JVT-U106 Behaviour at slice boundaries{
,m_pcReconstructionBypass
//JVT-U106 Behaviour at slice boundaries}
) );
}
RNOK( m_pcControlMng ->init( m_pcFrameMng,
m_pcParameterSetMng,
m_apcPocCalculator,
m_pcSliceReader,
m_pcNalUnitParser,
m_pcSliceDecoder,
m_pcBitReadBuffer,
m_pcUvlcReader,
m_pcMbParser,
m_pcLoopFilter,
m_pcMbDecoder,
m_pcTransform,
m_pcIntraPrediction,
m_pcMotionCompensation,
m_apcYuvFullPelBufferCtrl,
m_pcQuarterPelFilter,
m_pcCabacReader,
m_pcSampleWeighting,
m_apcMCTFDecoder,
m_pcH264AVCDecoder ) );
return Err::m_nOK;
}
ErrVal CreaterH264AVCDecoder::uninit( Bool bCloseTrace )
{
RNOK( m_pcSampleWeighting ->uninit() );
RNOK( m_pcQuarterPelFilter ->uninit() );
RNOK( m_pcFrameMng ->uninit() );
RNOK( m_pcParameterSetMng ->uninit() );
RNOK( m_pcSliceDecoder ->uninit() );
RNOK( m_pcSliceReader ->uninit() );
RNOK( m_pcBitReadBuffer ->uninit() );
RNOK( m_pcUvlcReader ->uninit() );
RNOK( m_pcMbParser ->uninit() );
RNOK( m_pcLoopFilter ->uninit() );
RNOK( m_pcMbDecoder ->uninit() );
RNOK( m_pcIntraPrediction ->uninit() );
RNOK( m_pcMotionCompensation ->uninit() );
RNOK( m_pcCabacReader ->uninit() );
RNOK( m_pcH264AVCDecoder ->uninit() );
RNOK( m_pcRQFGSDecoder ->uninit() );
RNOK( m_pcControlMng ->uninit() );
RNOK( m_pcReconstructionBypass ->uninit() );
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
RNOK( m_apcDecodedPicBuffer [uiLayer] ->uninit() );
RNOK( m_apcMCTFDecoder [uiLayer] ->uninit() );
RNOK( m_apcYuvFullPelBufferCtrl[uiLayer] ->uninit() );
}
if( bCloseTrace )
{
CLOSE_DTRACE;
}
return Err::m_nOK;
}
H264AVCPacketAnalyzer::H264AVCPacketAnalyzer()
: m_pcBitReadBuffer ( NULL )
, m_pcUvlcReader ( NULL )
, m_pcNalUnitParser ( NULL )
, m_uiStdAVCOffset ( 0 )
, m_pcNonRequiredSEI ( NULL )
//TMM_FIX {
, m_uiNonRequiredSeiFlag ( 0 )
, m_uiPrevPicLayer ( 0 )
, m_uiCurrPicLayer ( 0 )
//TMM_FIX }
, m_bAVCCompatible (false)//BUG FIX Kai Zhang
{
for(int iLayer=0;iLayer<MAX_SCALABLE_LAYERS;iLayer++)
{
m_silceIDOfSubPicLayer[iLayer] = -1;
}
}
H264AVCPacketAnalyzer::~H264AVCPacketAnalyzer()
{
}
ErrVal
H264AVCPacketAnalyzer::process( BinData* pcBinData,
PacketDescription& rcPacketDescription,
SEI::SEIMessage*& pcScalableSEIMessage )
{
pcScalableSEIMessage = 0;
UChar ucByte = (pcBinData->data())[0];
NalUnitType eNalUnitType = NalUnitType ( ucByte & 0x1F );
NalRefIdc eNalRefIdc = NalRefIdc ( ucByte >> 5 );
UInt uiLayer = 0;
UInt uiLevel = 0;
UInt uiFGSLayer = 0;
Bool bApplyToNext = false;
UInt uiSimplePriorityId = 0;
Bool bLayerBaseFlag=false;
Bool bUseBasePredFlag=false;
Bool bDiscardableFlag = false;
Bool bFragmentedFlag = false; //JVT-P031
UInt uiFragmentOrder = 0; //JVT-P031
Bool bLastFragmentFlag = false; //JVT-P031
Bool bTl0PicIdxPresentFlag = false; // JVT-U116 LMI
rcPacketDescription.uiNumLevelsQL = 0;
for(UInt ui = 0; ui < MAX_NUM_RD_LEVELS; ui++)
{
rcPacketDescription.auiDeltaBytesRateOfLevelQL[ui] = 0;
rcPacketDescription.auiQualityLevelQL[ui] = 0;
}
//}}Quality level estimation and modified truncation- JVTO044 and m12007
Bool bScalable = ( eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE );
UInt uiSPSid = 0;
UInt uiPPSid = 0;
Bool bParameterSet = ( eNalUnitType == NAL_UNIT_SPS ||
eNalUnitType == NAL_UNIT_PPS );
if( eNalUnitType == NAL_UNIT_CODED_SLICE_SCALABLE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR_SCALABLE ||
eNalUnitType == NAL_UNIT_PREFIX )//prefix unit
{
ucByte = (pcBinData->data())[1];
uiSimplePriorityId = ( ucByte & 63 ); // fix (Heiko Schwarz)
//uiSimplePriorityId = ( ucByte >> 2); // fix (Heiko Schwarz)
ucByte = (pcBinData->data())[2];
uiLevel = ( ucByte >> 5 );
uiLayer = ( ucByte >> 2 ) & 7;
uiFGSLayer = ( ucByte ) & 3;
ucByte = (pcBinData->data())[3];
// JVT-U116 LMI {
bLayerBaseFlag = ( ucByte >> 7) & 1; // layer_base_flag ( &10000000b)
bUseBasePredFlag = ( ucByte >> 6) & 1; // use_base_prediction_flag ( &01000000b)
bDiscardableFlag = ( ucByte >> 5) & 1; // discardable_flag ( &00100000b)
bFragmentedFlag = ( ucByte >> 4) & 1; // fgs_frag_flag ( &00010000b)
bLastFragmentFlag = ( ucByte >> 3) & 1; // fgs_last_frag_flag ( &00001000b)
uiFragmentOrder = ( ucByte >> 1) & 3; // fgs_frag_order ( &00000110b)
bTl0PicIdxPresentFlag = ( ucByte >> 0) & 1; // tl0_pic_idx_present_flag ( &00000001b)
// JVT-U116 LMI }
}
else if( eNalUnitType == NAL_UNIT_CODED_SLICE ||
eNalUnitType == NAL_UNIT_CODED_SLICE_IDR )
{
uiLevel = ( eNalRefIdc > 0 ? 0 : 1+m_uiStdAVCOffset);
m_bAVCCompatible=true;//BUG FIX Kai Zhang
}
else 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 );
UInt uiNumBytesRemoved; //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu{{
//RNOK( m_pcNalUnitParser->initNalUnit( &cBinDataAccessor, NULL, uiNumBytesRemoved ) ); //FIX_FRAG_CAVLC
RNOK( m_pcNalUnitParser->initNalUnit( &cBinDataAccessor, uiNumBytesRemoved ) ); //FIX_FRAG_CAVLC
//bug-fix suffix shenqiu}}
SEI::MessageList cMessageList;
RNOK( SEI::read( m_pcUvlcReader, cMessageList ) );
SEI::MessageList::iterator iter = cMessageList.begin();
while( ! cMessageList.empty() )
{
SEI::SEIMessage* pcSEIMessage = cMessageList.popBack();
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -