h264avcencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,655 行 · 第 1/5 页
CPP
1,655 行
if( uiCurrFGSLevel ) // FGS layer, Q != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel, uiCurrFGSLevel-1 );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta );//JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 1 );
if( uiCurrTempLevel- uiMinTempLevel ) // T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers(uiNumScalableLayer, 2 );
}
}
else if( ( uiCurrTempLevel- uiMinTempLevel ) ) // Q = 0, T != 0
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiCurrLayer, uiCurrTempLevel-1, uiCurrFGSLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
if( uiCurrLayer ) // D != 0, T != 0, Q = 0
{
UInt uiBaseLayerId = rcLayer.getBaseLayerId();
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
if( uiBaseLayerId == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) // AVC-COMPATIBLE
{
UInt uiBaseTempLevel = max( 0, rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() - 1 );
if( uiCurrTempLevel-uiMinTempLevel >= uiBaseTempLevel )
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta );//JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
else
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel ) )
{ //this should always be true
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiBaseTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
}
else //non-AVC mode
{
if( MSYS_UINT_MAX != getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel ) )
{
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 1, uiDelta ); //JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 2 );
}
}
}
}
else if ( uiCurrLayer ) // D != 0,T = 0, Q = 0
{
UInt uiBaseLayerId = rcLayer.getBaseLayerId();
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
UInt uiBaseFGSLayers = (UInt)( rcBaseLayer.getNumFGSLayers() );
UInt uiBaseQualityLevel = rcLayer.getBaseQualityLevel();
uiBaseQualityLevel = min( uiBaseQualityLevel, uiBaseFGSLayers );
if( uiBaseLayerId == 0 && m_pcCodingParameter->getBaseLayerMode() == 1 ) //AVC-COMPATIBLE
{
Int iBaseTempLevel = max( 0, (Int)( rcBaseLayer.getDecompositionStages() - rcBaseLayer.getNotCodedMCTFStages() ) - 1 );
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, (UInt)iBaseTempLevel, (UInt)uiBaseQualityLevel );
}
else
uiDelta = uiNumScalableLayer - getScalableLayerId( uiBaseLayerId, uiCurrTempLevel, uiBaseQualityLevel );
pcScalableSEI->setDirectlyDependentLayerIdDeltaMinus1( uiNumScalableLayer, 0, uiDelta ); //JVT-S036 lsj
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 1 );
}
else // base layer, no dependency layers
{
pcScalableSEI->setNumDirectlyDependentLayers( uiNumScalableLayer, 0 );
}
}
// BUG_FIX liuhui}
}
else
{//JVT-S036 lsj
UInt uiLayerDependencyInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setLayerDependencyInfoSrcLayerIdDelta( uiNumScalableLayer, uiLayerDependencyInfoSrcLayerIdDelta);
}
if(pcScalableSEI->getInitParameterSetsInfoPresentFlag(uiNumScalableLayer))
{
UInt uiNumInitSPSMinus1 = 0; //should be changed
UInt uiNumInitPPSMinus1 = 0; //should be changed
pcScalableSEI->setNumInitSeqParameterSetMinus1(uiNumScalableLayer, uiNumInitSPSMinus1);
pcScalableSEI->setNumInitPicParameterSetMinus1(uiNumScalableLayer, uiNumInitPPSMinus1);
for( j = 0; j <= pcScalableSEI->getNumInitSPSMinus1(uiNumScalableLayer); j++)
{
UInt uiDelta = 0; //should be changed
pcScalableSEI->setInitSeqParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
}
for( j = 0; j <= pcScalableSEI->getNumInitPPSMinus1(uiNumScalableLayer); j++)
{
UInt uiDelta = 0; //should be changed
pcScalableSEI->setInitPicParameterSetIdDelta( uiNumScalableLayer, j, uiDelta );
}
}
else
{//JVT-S036 lsj
UInt bInitParameterSetsInfoSrcLayerIdDelta = 0; //may be changed
pcScalableSEI->setInitParameterSetsInfoSrcLayerIdDelta( uiNumScalableLayer, bInitParameterSetsInfoSrcLayerIdDelta );
}
uiNumScalableLayer++;
}
uiTotalScalableLayer++;
}
}
}
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcScalableSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
RNOK( m_apcMCTFEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );
return Err::m_nOK;
}
// JVT-S080 LMI {
ErrVal
H264AVCEncoder::xWriteScalableSEILayersNotPresent( ExtBinDataAccessor* pcExtBinDataAccessor, UInt uiNumLayers, UInt* uiLayerId)
{
UInt i, uiBits = 0;
SEI::MessageList cSEIMessageList;
SEI::ScalableSeiLayersNotPresent* pcScalableSeiLayersNotPresent;
RNOK(SEI::ScalableSeiLayersNotPresent::create(pcScalableSeiLayersNotPresent) );
pcScalableSeiLayersNotPresent->setNumLayers( uiNumLayers );
for (i=0; i < uiNumLayers; i++)
pcScalableSeiLayersNotPresent->setLayerId( i, uiLayerId[i] );
cSEIMessageList.push_back ( pcScalableSeiLayersNotPresent );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
RNOK( m_apcMCTFEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::xWriteScalableSEIDependencyChange( ExtBinDataAccessor* pcExtBinDataAccessor, UInt uiNumLayers, UInt* uiLayerId, Bool* pbLayerDependencyInfoPresentFlag,
UInt* uiNumDirectDependentLayers, UInt** puiDirectDependentLayerIdDeltaMinus1, UInt* puiLayerDependencyInfoSrcLayerIdDeltaMinus1)
{
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
SEI::ScalableSeiDependencyChange* pcScalableSeiDependencyChange;
RNOK(SEI::ScalableSeiDependencyChange::create(pcScalableSeiDependencyChange) );
pcScalableSeiDependencyChange->setNumLayersMinus1(uiNumLayers-1);
UInt uiLayer, uiDirectLayer;
for( uiLayer = 0; uiLayer < uiNumLayers; uiLayer++ )
{
pcScalableSeiDependencyChange->setLayerId( uiLayer, uiLayerId[uiLayer]);
pcScalableSeiDependencyChange->setLayerDependencyInfoPresentFlag( uiLayer, pbLayerDependencyInfoPresentFlag[uiLayer] );
if ( pcScalableSeiDependencyChange->getLayerDependencyInfoPresentFlag( uiLayer ) )
{
pcScalableSeiDependencyChange->setNumDirectDependentLayers( uiLayer, uiNumDirectDependentLayers[uiLayer] );
for ( uiDirectLayer = 0; uiDirectLayer < pcScalableSeiDependencyChange->getNumDirectDependentLayers( uiLayer ); uiDirectLayer++)
pcScalableSeiDependencyChange->setDirectDependentLayerIdDeltaMinus1( uiLayer, uiDirectLayer, puiDirectDependentLayerIdDeltaMinus1[uiLayer][uiDirectLayer] );
}
else
pcScalableSeiDependencyChange->setLayerDependencyInfoSrcLayerIdDeltaMinus1( uiLayer, puiLayerDependencyInfoSrcLayerIdDeltaMinus1[uiLayer] );
}
cSEIMessageList.push_back ( pcScalableSeiDependencyChange );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
RNOK( m_apcMCTFEncoder[0] ->addParameterSetBits ( uiBits+4*8 ) );
return Err::m_nOK;
}
// JVT-S080 LMI }
ErrVal
H264AVCEncoder::xWriteSubPicSEI ( ExtBinDataAccessor* pcExtBinDataAccessor )
{
SEI::SubPicSei* pcSubPicSEI;
RNOK( SEI::SubPicSei::create( pcSubPicSEI ) );
//===== set message =====
UInt uiScalableLayerId = 0; //should be changed
pcSubPicSEI->setLayerId( uiScalableLayerId );
//===== write message =====
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcSubPicSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::xWriteSubPicSEI ( ExtBinDataAccessor* pcExtBinDataAccessor, UInt layer_id )
{
SEI::SubPicSei* pcSubPicSEI;
RNOK( SEI::SubPicSei::create( pcSubPicSEI ) );
//===== set message =====
pcSubPicSEI->setLayerId( layer_id );
//===== write message =====
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcSubPicSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
return Err::m_nOK;
}
// Scalable SEI for ROI ICU/ETRI
ErrVal
H264AVCEncoder::xWriteMotionSEI( ExtBinDataAccessor* pcExtBinDataAccessor, UInt sg_id )
{
//===== create message =====
SEI::MotionSEI* pcMotionSEI;
RNOK( SEI::MotionSEI::create( pcMotionSEI) );
pcMotionSEI->setSliceGroupId(sg_id);
//===== write message =====
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcMotionSEI);
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
return Err::m_nOK;
}
Bool m_bWrteROISEI = true;
UInt m_loop_roi_sei=0;
ErrVal
H264AVCEncoder::writeParameterSets( ExtBinDataAccessor* pcExtBinDataAccessor, Bool &rbMoreSets )
{
if( m_bVeryFirstCall )
{
m_bVeryFirstCall = false;
RNOK( xInitParameterSets() );
if( m_bScalableSeiMessage )
RNOK( xWriteScalableSEI( pcExtBinDataAccessor ) );
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( 0 );
if (0 < rcLayer.getNumROI())
m_bWrteROISEI = true;
else
m_bWrteROISEI = false;
m_loop_roi_sei=0;
return Err::m_nOK;
}
else
m_bScalableSeiMessage = true;
UInt uiNumLayer = m_pcCodingParameter->getNumberOfLayers();
if(m_bWrteROISEI)
{
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( m_loop_roi_sei/2 );
{
if(((m_loop_roi_sei+1)/2) >= uiNumLayer )
{
m_bWrteROISEI = false;
}
if(m_loop_roi_sei%2)
{
RNOK( xWriteMotionSEI( pcExtBinDataAccessor,rcLayer.getSGID()[0] ) ); m_loop_roi_sei++; return Err::m_nOK;
}
else
{
RNOK( xWriteSubPicSEI( pcExtBinDataAccessor, rcLayer.getSLID()[0] ) ); m_loop_roi_sei++; return Err::m_nOK;
}
}
}
UInt uiBits;
if( ! m_cUnWrittenSPS.empty() )
{
RNOK( m_pcNalUnitEncoder->initNalUnit( pcExtBinDataAccessor ) );
SequenceParameterSet& rcSPS = *m_cUnWrittenSPS.front();
RNOK( m_pcNalUnitEncoder->write( rcSPS ) );
RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );
if( m_pcCodingParameter->getNumberOfLayers() )
{
UInt uiLayer = rcSPS.getLayerId();
UInt uiSize = pcExtBinDataAccessor->size();
RNOK( m_apcMCTFEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
}
m_cUnWrittenSPS.pop_front();
}
else
{
if( ! m_cUnWrittenPPS.empty() )
{
RNOK( m_pcNalUnitEncoder->initNalUnit( pcExtBinDataAccessor ) );
PictureParameterSet& rcPPS = *m_cUnWrittenPPS.front();
RNOK( m_pcNalUnitEncoder->write( rcPPS ) )
RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );
if( m_pcCodingParameter->getNumberOfLayers() )
{
UInt uiSPSId = rcPPS.getSeqParameterSetId();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?