📄 extractor.cpp
字号:
printf("\n");
printf(" target rate = %8.2lf kbit/s\n", (Double) uiTGRate / dScale );
printf(" output rate = %8.2lf kbit/s\n", (Double)uiOutRate / dScale );
printf("\n");
#endif
return Err::m_nOK;
}
ErrVal
Extractor::xAnalyse( UInt uiTargetLayer,
Double& rdFrameRate,
Bool& rbQualityLayerPresent,
UInt auiQLRate[],
Bool bNoSpecialFirstFrame
)
{
Bool bEOS = false;
BinData* pcBinData = 0;
UInt uiDId = 0;
UInt uiTId = 0;
UInt uiQId = 0;
UInt uiPId = 0;
UInt uiPacketSize = 0;
UInt uiNumAVCPics = 0;
UInt& ruiBLRate = auiQLRate[MAX_QLAYERS+1];
UInt& ruiFGSAU0Rate = auiQLRate[MAX_QLAYERS ];
h264::SEI::SEIMessage* pcScalableSei = 0;
h264::PacketDescription cPacketDescription;
UInt aauiTLRate[MAX_TLAYERS][MAX_QUALITY_LEVELS];
//===== clear arrays =====
::memset( auiQLRate, 0x00, sizeof( UInt ) * ( MAX_QLAYERS + 2 ) );
::memset( aauiTLRate, 0x00, sizeof( UInt ) * ( MAX_TLAYERS * MAX_QUALITY_LEVELS ) );
//===== initialize and read scalable SEI message =====
{
//----- init -----
RNOK( m_pcH264AVCPacketAnalyzer ->init () );
//----- read first packet, which must contain the scalable SEI -----
RNOK( m_pcReadBitstream ->extractPacket ( pcBinData, bEOS ) );
ROT ( bEOS );
RNOK( m_pcH264AVCPacketAnalyzer ->process ( pcBinData, cPacketDescription, pcScalableSei ) );
ROF ( pcScalableSei );
//----- get SEI parameters and delete SEI -----
h264::SEI::ScalableSei* pcSSEI = static_cast<h264::SEI::ScalableSei*>( pcScalableSei );
rdFrameRate = (Double)pcSSEI->getAvgFrmRate( pcSSEI->getNumLayersMinus1() ) / 256.0;
delete pcScalableSei;
pcScalableSei = 0;
//----- get packet size -----
while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
{
RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
}
ruiBLRate = 4 + pcBinData ->size();
//----- release packet -----
RNOK( m_pcReadBitstream ->releasePacket ( pcBinData ) );
pcBinData = 0;
}
//===== MAIN LOOP OVER PACKETS =====
while( ! bEOS )
{
//===== get packet =====
RNOK ( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
if ( bEOS )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
continue;
}
//===== get packet description =====
RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcScalableSei ) );
ROT ( pcScalableSei );
ROT ( cPacketDescription.ApplyToNext );
//===== get packet size =====
while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
{
RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
}
//==== get parameters =====
{
uiPacketSize = 4 + pcBinData->size();
uiDId = cPacketDescription.Layer;
//prefix unit{{
if(cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE && cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE_IDR)
uiTId = cPacketDescription.Level;
//prefix unit}}
uiQId = cPacketDescription.FGSLayer;
uiPId = cPacketDescription.uiPId;
}
ROT( uiDId > uiTargetLayer );
ROF( uiPId < MAX_QLAYERS );
//===== store data =====
if( uiDId < uiTargetLayer || uiQId == 0 )
{
ruiBLRate += uiPacketSize;
}
else if( uiQId == 1 && uiNumAVCPics == 1 && ! bNoSpecialFirstFrame )
{
ruiFGSAU0Rate += uiPacketSize;
}
else
{
aauiTLRate[uiTId][uiQId] += uiPacketSize;
auiQLRate [uiPId] += uiPacketSize;
rbQualityLayerPresent = rbQualityLayerPresent || uiPId != 0;
}
//===== release packet =====
if( pcBinData )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
}
} // end of while( ! bEOS )
//===== get quality level automatically =====
if( ! rbQualityLayerPresent )
{
auiQLRate[0] = 0;
for( uiTId = 0; uiTId < MAX_TLAYERS; uiTId++ )
for( uiQId = 1; uiQId < MAX_QUALITY_LEVELS; uiQId++ )
{
auiQLRate[ MAX_QLAYERS - 1 - ( ( uiQId - 1 ) << 3 ) - uiTId ] = aauiTLRate[uiTId][uiQId];
}
}
//===== accumulate rate =====
for( uiQId = MAX_QLAYERS + 1; uiQId > 0; uiQId-- )
{
auiQLRate[uiQId-1] += auiQLRate[uiQId];
}
RNOK( m_pcH264AVCPacketAnalyzer->uninit() );
//===== reset input file =====
RNOKS( static_cast<ReadBitstreamFile*>( m_pcReadBitstream )->uninit() );
RNOKS( static_cast<ReadBitstreamFile*>( m_pcReadBitstream )->init ( m_pcExtractorParameter->getInFile() ) );
return Err::m_nOK;
}
ErrVal
Extractor::xExtract( UInt uiTargetLayer,
Bool bQualityLayerPresent,
Int iQualityLayer,
UInt& ruiInLayerRate,
Bool bNoSpecialFirstFrame )
{
Bool bEOS = false;
BinData* pcBinData = 0;
UInt uiDId = 0;
UInt uiTId = 0;
UInt uiQId = 0;
UInt uiPId = 0;
UInt uiPacketSize = 0;
UInt uiNumAVCPics = 0;
h264::SEI::SEIMessage* pcScalableSei = 0;
h264::PacketDescription cPacketDescription;
//===== initialize and read scalable SEI message =====
{
//----- init -----
RNOK( m_pcH264AVCPacketAnalyzer ->init () );
//----- read first packet, which must contain the scalable SEI -----
RNOK( m_pcReadBitstream ->extractPacket ( pcBinData, bEOS ) );
ROT ( bEOS );
RNOK( m_pcH264AVCPacketAnalyzer ->process ( pcBinData, cPacketDescription, pcScalableSei ) );
ROF ( pcScalableSei );
//----- delete SEI -----
delete pcScalableSei;
pcScalableSei = 0;
//----- get packet size -----
while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
{
RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
}
//----- write and release packet -----
RNOK( m_pcWriteBitstream ->writePacket ( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstream ->writePacket ( pcBinData ) );
RNOK( m_pcReadBitstream ->releasePacket ( pcBinData ) );
pcBinData = 0;
}
//===== MAIN LOOP OVER PACKETS =====
while( ! bEOS )
{
//===== get packet =====
RNOK ( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
if ( bEOS )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
continue;
}
//===== get packet description =====
RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcScalableSei ) );
ROT ( pcScalableSei );
ROT ( cPacketDescription.ApplyToNext );
//===== get packet size =====
while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
{
RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
}
//==== get parameters =====
{
uiPacketSize = 4 + pcBinData->size();
uiDId = cPacketDescription.Layer;
//prefix unit{{
if(cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE && cPacketDescription.NalUnitType != NAL_UNIT_CODED_SLICE_IDR)
uiTId = cPacketDescription.Level;
//prefix unit}}
uiQId = cPacketDescription.FGSLayer;
uiPId = cPacketDescription.uiPId;
}
ROT( uiDId > uiTargetLayer );
ROF( uiPId < MAX_QLAYERS );
//===== determine whether packet is kept =====
Bool bKeep = true;
if( uiDId == uiTargetLayer && uiQId > 0 )
{
//---- get quality layer when not present -----
if( ! bQualityLayerPresent )
{
uiPId = MAX_QLAYERS - 1 - ( ( uiQId - 1 ) << 3 ) - uiTId;
}
if( uiQId == 1 && uiNumAVCPics == 1 && ! bNoSpecialFirstFrame)
{
uiPId = MAX_QLAYERS;
}
//---- check whether packet is discarded ----
if( (Int)uiPId < iQualityLayer )
{
bKeep = false;
}
else if( (Int)uiPId == iQualityLayer )
{
if( ruiInLayerRate >= uiPacketSize )
{
ruiInLayerRate -= uiPacketSize;
}
else
{
bKeep = false;
}
}
}
//===== write packet ====
if( bKeep )
{
RNOK( m_pcWriteBitstream->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstream->writePacket( pcBinData ) );
}
//===== release packet =====
if( pcBinData )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
}
} // end of while( ! bEOS )
//===== uninit =====
RNOK( m_pcH264AVCPacketAnalyzer->uninit() );
return Err::m_nOK;
}
// Keep ROI NAL ICU/ETRI DS
Int Extractor::CurNalKeepingNeed(h264::PacketDescription cPacketDescription
, const ExtractorParameter::Point& rcExtPoint)
{
Bool bIsDataNal = false;
if (
(1 <= cPacketDescription.NalUnitType && cPacketDescription.NalUnitType <= 5)
|| (cPacketDescription.NalUnitType == 20 || cPacketDescription.NalUnitType == 21)
)
{
bIsDataNal = true;
}
Int iExtactionROINum = m_pcExtractorParameter->getExtractedNumROI();
Bool bROIFlag = m_pcExtractorParameter->getROIFlag();
int keepingNAL = -1;
if( bROIFlag == true && bIsDataNal == true )
{
for(int i=0; i<iExtactionROINum; i++)
{
Int SG_ID =-1;
for(int sg_id=0;sg_id<8;sg_id++)
{
if(cPacketDescription.uiFirstMb == m_pcH264AVCPacketAnalyzer->uiaAddrFirstMBofROIs[cPacketDescription.PPSid][sg_id])
{
SG_ID=sg_id;
break;
}
} // end for check sg (until 8)
Int iROI_ID = getROI_ID(cPacketDescription.Layer,SG_ID);
if(iROI_ID !=-1 &&rcExtPoint.uiROI[i] ==iROI_ID )
{
keepingNAL = 1;
}
if( keepingNAL == 1 )
break;
} // end for
} // end if (bROIFlag == true.. )
else
return true;
return (keepingNAL == 1);
}
ErrVal
Extractor::xExtractPoints()
{
UInt uiNumInput = 0;
UInt uiNumK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -