📄 extractor.cpp
字号:
pcNewViewScalSei->setOpConstraintSet1Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet1Flag( OldOpId ) );
pcNewViewScalSei->setOpConstraintSet2Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet2Flag( OldOpId ) );
pcNewViewScalSei->setOpConstraintSet3Flag( uiNumNewOps, pcOldViewScalSei->getOpConstraintSet3Flag( OldOpId ) );
pcNewViewScalSei->setOpLevelIdc( uiNumNewOps, pcOldViewScalSei->getOpLevelIdc( OldOpId ) );
}
else
pcNewViewScalSei->setProfileLevelInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
}
else
pcNewViewScalSei->setProfileLevelInfoSrcOpIdDelta( uiNumNewOps, 0 );
if( pcOldViewScalSei->getBitRateInfoPresentFlag( i ) )
{
pcNewViewScalSei->setAvgBitrate( uiNumNewOps, pcOldViewScalSei->getAvgBitrate( i ) );
pcNewViewScalSei->setMaxBitrate( uiNumNewOps, pcOldViewScalSei->getMaxBitrate( i ) );
pcNewViewScalSei->setMaxBitrateCalcWindow( uiNumNewOps, pcOldViewScalSei->getMaxBitrateCalcWindow( i ) );
}
if( pcOldViewScalSei->getFrmRateInfoPresentFlag( i ) )
{
pcNewViewScalSei->setConstantFrmRateIdc( uiNumNewOps, pcOldViewScalSei->getConstantFrmRateIdc( i ) );
pcNewViewScalSei->setAvgFrmRate( uiNumNewOps, pcOldViewScalSei->getAvgFrmRate( i ) );
}
else if( pcOldViewScalSei->getFrmRateInfoSrcOpIdDela( i ) )
{
UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getFrmRateInfoSrcOpIdDela( i );
for( j = 0; j< uiNumOps; j++ )
if( OldOpId == uiOperationPointId[j] )
break;
if( j == uiNumOps )
{
pcNewViewScalSei->setFrmRateInfoPresentFlag( uiNumNewOps, true );
pcNewViewScalSei->setConstantFrmRateIdc( uiNumNewOps, pcOldViewScalSei->getConstantFrmRateIdc( OldOpId ) );
pcNewViewScalSei->setAvgFrmRate( uiNumNewOps, pcOldViewScalSei->getAvgFrmRate( OldOpId ) );
}
else
pcNewViewScalSei->setFrmRateInfoSrcOpIdDela( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
}
else
pcNewViewScalSei->setFrmRateInfoSrcOpIdDela( uiNumNewOps, 0 );
if( pcOldViewScalSei->getOpDependencyInfoPresentFlag( i ) )
{
pcNewViewScalSei->setNumDirectlyDependentOps( uiNumNewOps, pcOldViewScalSei->getNumDirectlyDependentOps( i ) );
for( UInt ui = 0; ui < pcOldViewScalSei->getNumDirectlyDependentOps( i ); ui++ )
{
UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getDirectlyDependentOpIdDeltaMinus1( i, ui ) - 1;
for( j = 0; j< uiNumOps; j++ )
if( OldOpId == uiOperationPointId[j] )
break;
pcNewViewScalSei->setDirectlyDependentOpIdDeltaMinus1( uiNumNewOps, ui, uiNumNewOps - uiOldOpToNewOp[OldOpId] - 1 );
}
}
else if( pcOldViewScalSei->getOpDependencyInfoSrcOpIdDelta( i ) )
{
UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getOpDependencyInfoSrcOpIdDelta( i );
for( j = 0; j< uiNumOps; j++ )
if( OldOpId == uiOperationPointId[j] )
break;
if( j == uiNumOps )
{
pcNewViewScalSei->setNumDirectlyDependentOps( uiNumNewOps, pcOldViewScalSei->getNumDirectlyDependentOps( OldOpId ) );
for( UInt ui = 0; ui < pcOldViewScalSei->getNumDirectlyDependentOps( i ); ui++ )
{
UInt OldOpId1 = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getDirectlyDependentOpIdDeltaMinus1( OldOpId, ui ) - 1;
for( j = 0; j< uiNumOps; j++ )
if( OldOpId1 == uiOperationPointId[j] )
break;
pcNewViewScalSei->setDirectlyDependentOpIdDeltaMinus1( uiNumNewOps, ui, uiNumNewOps - uiOldOpToNewOp[OldOpId1] - 1 );
}
}
else
pcNewViewScalSei->setOpDependencyInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
}
else
pcNewViewScalSei->setOpDependencyInfoSrcOpIdDelta( uiNumNewOps, 0 );
if( pcOldViewScalSei->getInitParameterSetsInfoPresentFlag( i ) )
{
pcNewViewScalSei->setNumInitSeqParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitSeqParameterSetMinus1( i ) );
for( j = 0; j <= pcOldViewScalSei->getNumInitSeqParameterSetMinus1(i); j++)
pcNewViewScalSei->setInitSeqParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitSeqParameterSetIdDelta( i, j ) );
pcNewViewScalSei->setNumInitPicParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitPicParameterSetMinus1( i ) );
for( j = 0; j <= pcOldViewScalSei->getNumInitPicParameterSetMinus1(i); j++)
pcNewViewScalSei->setInitPicParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitPicParameterSetIdDelta( i, j ) );
}
else if( pcOldViewScalSei->getInitParameterSetsInfoSrcOpIdDelta( i ) )
{
UInt OldOpId = pcOldViewScalSei->getOperationPointId( i ) - pcOldViewScalSei->getInitParameterSetsInfoSrcOpIdDelta( i );
for( j = 0; j< uiNumOps; j++ )
if( OldOpId == uiOperationPointId[j] )
break;
if( j == uiNumOps )
{
pcNewViewScalSei->setNumInitSeqParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitSeqParameterSetMinus1( OldOpId ) );
for( j = 0; j <= pcOldViewScalSei->getNumInitSeqParameterSetMinus1(OldOpId); j++)
pcNewViewScalSei->setInitSeqParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitSeqParameterSetIdDelta( OldOpId, j ) );
pcNewViewScalSei->setNumInitPicParameterSetMinus1( uiNumNewOps, pcOldViewScalSei->getNumInitPicParameterSetMinus1( OldOpId ) );
for( j = 0; j <= pcOldViewScalSei->getNumInitPicParameterSetMinus1(OldOpId); j++)
pcNewViewScalSei->setInitPicParameterSetIdDelta( uiNumNewOps, j, pcOldViewScalSei->getInitPicParameterSetIdDelta( OldOpId, j ) );
}
else
pcNewViewScalSei->setInitParameterSetsInfoSrcOpIdDelta( uiNumNewOps, uiNumNewOps - uiOldOpToNewOp[OldOpId] );
}
else
pcNewViewScalSei->setInitParameterSetsInfoSrcOpIdDelta( uiNumNewOps, 0 );
uiNumNewOps++;
}
RNOK( xWriteViewScalSEIToBuffer( pcNewViewScalSei, pcBinData ) );
}
return Err::m_nOK;
}
ErrVal
Extractor::xExtractOperationPoints()
{
UInt uiOpId = m_pcExtractorParameter->getOpId();
Bool bApplyToNext = false;
Bool bKeep = true;
Bool bEOS = false;
UInt uiNewNumViews = 0;
UInt uiViewId[MAX_VIEWS];
::memset( uiViewId, 0x00, MAX_VIEWS*sizeof(UInt) );
RNOK( m_pcH264AVCPacketAnalyzer->init() );
while( ! bEOS )
{
//========== get packet ==============
BinData * pcBinData;
Bool bWriteBinData = true;
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
if( bEOS )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
continue;
}
//===== get packet description ======
h264::SEI::SEIMessage* pcSEIMessage = 0;
h264::PacketDescription cPacketDescription;
RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcSEIMessage ) );
if( pcSEIMessage )
{
if( pcSEIMessage->getMessageType() != h264::SEI::VIEW_SCALABILITY_INFO_SEI )
bWriteBinData = false;
RNOK( xChangeViewScalSEIMessage( pcBinData, pcSEIMessage, uiOpId, uiViewId, &uiNewNumViews ) );
}
delete pcSEIMessage;
if( bWriteBinData )
{
//============ get packet size ===========
while( pcBinData->data()[ pcBinData->size() - 1 ] == 0x00 )
{
RNOK( pcBinData->decreaseEndPos( 1 ) ); // remove zero at end
}
//============ set parameters ===========
bApplyToNext = cPacketDescription.ApplyToNext;
if( !cPacketDescription.ParameterSet && cPacketDescription.NalUnitType != NAL_UNIT_SEI)
{
UInt uiView;
for( uiView = 0; uiView < uiNewNumViews; uiView++ )
if( uiViewId[uiView] == cPacketDescription.ViewId )
break;
if( uiView < uiNewNumViews )
bKeep = true;
else
bKeep = false;
}
//============ write and release packet ============
if( bKeep )
{
RNOK( m_pcWriteBitstream->writePacket( &m_cBinDataStartCode ) );
RNOK( m_pcWriteBitstream->writePacket( pcBinData ) );
}
}
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
}
RNOK( m_pcH264AVCPacketAnalyzer->uninit() );
return Err::m_nOK;
}
ErrVal
Extractor::xDisplayOperationPoints()
{
Bool bEOS = false;
h264::SEI::ViewScalabilityInfoSei* pcViewScalInfoSei = 0;
RNOK( m_pcH264AVCPacketAnalyzer->init() );
BinData * pcBinData;
RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
if( bEOS )
{
RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
pcBinData = NULL;
return Err::m_nERR;
}
//========== initialize (View Scal Info SEI message shall be the first packet of the stream) ===========
h264::SEI::SEIMessage* pcSEIMessage = 0;
h264::PacketDescription cPacketDescription;
RNOK( m_pcH264AVCPacketAnalyzer->process( pcBinData, cPacketDescription, pcSEIMessage ) );
if( pcSEIMessage->getMessageType() != h264::SEI::VIEW_SCALABILITY_INFO_SEI )
{
printf("No View Scalability Info SEI Message!\n\nExtractor exit.\n\n");
exit(0);
}
pcViewScalInfoSei = (h264::SEI::ViewScalabilityInfoSei* )pcSEIMessage;
UInt uiNumOperationPoints = pcViewScalInfoSei->getNumOperationPointsMinus1() + 1;
printf("\nTotal number of operation points: %d\n", uiNumOperationPoints);
for( UInt i = 0; i < uiNumOperationPoints; i++ )
{
printf("\nNO.%d of opertion points: \n", i);
UInt uiOperationPointId = pcViewScalInfoSei->getOperationPointId(i);
printf("Operation Point Id: %d\n", uiOperationPointId);
UInt uiPriorityId = pcViewScalInfoSei->getPriorityId(i);
printf("Priority Id: %d\n", uiPriorityId);
UInt uiTemporalId = pcViewScalInfoSei->getTemporalId(i);
printf("Temporal Id: %d\n", uiTemporalId);
UInt uiNumActiveViewsMinus1 = pcViewScalInfoSei->getNumActiveViewsMinus1(i);
printf("Number of active views: %d\n", uiNumActiveViewsMinus1+1);
for( UInt j = 0; j <= uiNumActiveViewsMinus1; j++ )
{
UInt viewid = pcViewScalInfoSei->getViewId( i, j );
printf("View_Id[%d]: %d\n", j, viewid);
}
if( pcViewScalInfoSei->getProfileLevelInfoPresentFlag(i) )
{
printf( "Op Profile Idc: %d\n", pcViewScalInfoSei->getOpProfileIdc(i) );
printf( "Op Constraint Set0 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet0Flag(i) );
printf( "Op Constraint Set1 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet1Flag(i) );
printf( "Op Constraint Set2 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet2Flag(i) );
printf( "Op Constraint Set3 Flag(0:false; 1:true): %d\n", (UInt)pcViewScalInfoSei->getOpConstraintSet3Flag(i) );
printf( "Op Level Idc: %d\n", pcViewScalInfoSei->getOpLevelIdc(i) );
}
else if( pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta(i) )
{
UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getProfileLevelInfoSrcOpIdDelta(i);
printf( "The profile and level information is the same as that of the operation point id %d\n", uiRefOpId );
}
else
printf("No profile and level information.\n");
if( pcViewScalInfoSei->getBitRateInfoPresentFlag(i) )
{
printf( "Avg Bitrate: %d\n", pcViewScalInfoSei->getAvgBitrate(i) );
printf( "Max Bitrate: %d\n", pcViewScalInfoSei->getMaxBitrate(i) );
printf( "Max Bitrate Calc Window: %d\n", pcViewScalInfoSei->getMaxBitrateCalcWindow(i) );
}
else
printf("No bitrate information.\n");
if( pcViewScalInfoSei->getFrmRateInfoPresentFlag(i) )
{
printf( "Constant Frame rate Idc: %d\n", pcViewScalInfoSei->getConstantFrmRateIdc(i) );
printf( "Avg Frame rate: %d\n", pcViewScalInfoSei->getAvgFrmRate(i) );
}
else if( pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela(i) )
{
UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getFrmRateInfoSrcOpIdDela(i);
printf( "The frame rate information is the same as that of the operation point id %d\n", uiRefOpId );
}
else
printf("No frame rate information.\n");
if( pcViewScalInfoSei->getOpDependencyInfoPresentFlag(i) )
{
UInt uiNumDirectlyDependentOps = pcViewScalInfoSei->getNumDirectlyDependentOps(i);
printf("Number of Directly Dependent Operation points: %d\n", uiNumDirectlyDependentOps);
for( UInt j = 0; j < uiNumDirectlyDependentOps; j++ )
{
UInt uiOpId = uiOperationPointId - pcViewScalInfoSei->getDirectlyDependentOpIdDeltaMinus1(i, j) - 1;
printf("NO%d of the dependent operation points(operation point id): %d\n", j+1, uiOpId);
}
}
else if( pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta(i) )
{
UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getOpDependencyInfoSrcOpIdDelta(i);
printf( "The OpDependency information is the same as that of the operation point id %d\n", uiRefOpId );
}
else
printf("No OpDependency information.\n");
if( pcViewScalInfoSei->getInitParameterSetsInfoPresentFlag(i) )
{
UInt uiNumInitSeqParameterSetMinus1 = pcViewScalInfoSei->getNumInitSeqParameterSetMinus1(i);
printf("Number of SPS required: %d\n", uiNumInitSeqParameterSetMinus1+1 );
for( UInt j = 0; j <= uiNumInitSeqParameterSetMinus1; j++ )
printf("NO%d of the SPS required: %d\n", j, pcViewScalInfoSei->getInitSeqParameterSetIdDelta(i,j));
UInt uiNumInitPicParameterSetMinus1 = pcViewScalInfoSei->getNumInitPicParameterSetMinus1(i);
printf("Number of PPS required: %d\n", uiNumInitPicParameterSetMinus1+1 );
for( UInt j = 0; j <= uiNumInitPicParameterSetMinus1; j++ )
printf("NO%d of the PPS required: %d\n", j, pcViewScalInfoSei->getInitPicParameterSetIdDelta(i,j));
}
else if( pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta(i) )
{
UInt uiRefOpId = uiOperationPointId - pcViewScalInfoSei->getInitParameterSetsInfoSrcOpIdDelta(i);
printf( "The SPS/PPS required information is the same as that of the operation point id %d\n", uiRefOpId );
}
else
printf("No SPS/PPS required information.\n\n");
}
delete pcSEIMessage;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -