createrh264avcdecoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 969 行 · 第 1/3 页
CPP
969 行
RNOK( ControlMngH264AVCDecoder ::create( m_pcControlMng ) );
RNOK( ReconstructionBypass ::create(m_pcReconstructionBypass) );
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
RNOK( DecodedPicBuffer ::create( m_apcDecodedPicBuffer [uiLayer] ) );
RNOK( MCTFDecoder ::create( m_apcMCTFDecoder [uiLayer] ) );
RNOK( PocCalculator ::create( m_apcPocCalculator [uiLayer] ) );
RNOK( YuvBufferCtrl ::create( m_apcYuvFullPelBufferCtrl [uiLayer] ) );
}
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()
{
INIT_DTRACE;
OPEN_DTRACE;
UnitAVCFlag = false; //JVT-S036 lsj
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 ) );
}
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()
{
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() );
}
CLOSE_DTRACE;
return Err::m_nOK;
}
H264AVCPacketAnalyzer::H264AVCPacketAnalyzer()
: m_pcBitReadBuffer ( NULL )
, m_pcUvlcReader ( NULL )
, m_pcNalUnitParser ( NULL )
, m_pcNonRequiredSEI ( NULL )
, m_uiStdAVCOffset ( 0 )
, 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;
//{{Variable Lengh NAL unit header data with priority and dead substream flag
//France Telecom R&D- (nathalie.cammas@francetelecom.com)
UInt uiSimplePriorityId = 0;
Bool bDiscardableFlag = false;
Bool bReservedZeroBit = false; //JVT-S036 lsj
Bool bFragmentedFlag = false; //JVT-P031
UInt uiFragmentOrder = 0; //JVT-P031
Bool bLastFragmentFlag = false; //JVT-P031
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 )
{
//{{Variable Lengh NAL unit header data with priority and dead substream flag
//France Telecom R&D- (nathalie.cammas@francetelecom.com)
ucByte = (pcBinData->data())[1];
uiSimplePriorityId = ( ucByte >> 2);
bDiscardableFlag = ( ucByte >> 1) & 1;
//JVT-S036 lsj start
bReservedZeroBit = ( ucByte ) & 1;
ucByte = pcBinData->data()[2];
uiLevel = ( ucByte >> 5 );
uiLayer = ( ucByte >> 2 ) & 7;
uiFGSLayer = ( ucByte ) & 3;
/* }
else
{
// Look up simple priority ID in mapping table (J. Ridge, Y-K. Wang @ Nokia)
uiLevel = m_uiTemporalLevelList[uiSimplePriorityId];
uiLayer = m_uiDependencyIdList [uiSimplePriorityId];
uiFGSLayer = m_uiQualityLevelList [uiSimplePriorityId];
}*/
//JVT-S036 lsj end
//}}Variable Lengh NAL unit header data with priority and dead substream flag
}
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
RNOK( m_pcNalUnitParser->initNalUnit( &cBinDataAccessor, NULL, uiNumBytesRemoved ) ); //FIX_FRAG_CAVLC
SEI::MessageList cMessageList;
RNOK( SEI::read( m_pcUvlcReader, cMessageList ) );
SEI::MessageList::iterator iter = cMessageList.begin();
while( ! cMessageList.empty() )
{
SEI::SEIMessage* pcSEIMessage = cMessageList.popBack();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?