📄 h264avcencoder.cpp
字号:
// pcScalableSEI->setQlNumMinus1(i, 0);
// for (j=0; j <= pcScalableSEI->getQlNumMinus1(i); j++)
// {
// UInt uiQlId = j;//could be changed
// pcScalableSEI->setQlId(i,j,uiQlId);
// Int32 uilayerProfileLevelIdc = 0;
// {
// UInt uilayerProfileIdc = m_uiProfileIdc[uiQlDependencyId];
// UInt uiLayerLevelIdc = m_uiLevelIdc[uiQlDependencyId];
// Bool bLayerConstraintSet0Flag = m_bConstraint0Flag[uiQlDependencyId];
// Bool bLayerConstraintSet1Flag = m_bConstraint1Flag[uiQlDependencyId];
// Bool bLayerConstraintSet2Flag = m_bConstraint2Flag[uiQlDependencyId];
// Bool bLayerConstraintSet3Flag = m_bConstraint3Flag[uiQlDependencyId];
// uilayerProfileLevelIdc += uilayerProfileIdc;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
// uilayerProfileLevelIdc += bLayerConstraintSet0Flag;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
// uilayerProfileLevelIdc += bLayerConstraintSet1Flag;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
// uilayerProfileLevelIdc += bLayerConstraintSet2Flag;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
// uilayerProfileLevelIdc += bLayerConstraintSet3Flag;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 4;
// uilayerProfileLevelIdc = uilayerProfileLevelIdc << 8;
// uilayerProfileLevelIdc += uiLayerLevelIdc;
// }
// pcScalableSEI->setQlProfileLevelIdx(i,j,uilayerProfileLevelIdc);
// pcScalableSEI->setQlAvgBitrate(i,j,(UInt)(m_adAvgBitrate[uiQlDependencyId]+0.5));
// pcScalableSEI->setQlMaxBitrate(i,j,(UInt)(m_aadMaxBitrate[uiQlDependencyId][uiQlId]+0.5));
// }
// }
//}
//JVT-W051 }
pcScalableSEI->setPriorityLayerInfoPresentFlag(true);
if ( pcScalableSEI->getPriorityLayerInfoPresentFlag() )
{
UInt uiPrNumdIdMinus1 = m_pcCodingParameter->getNumberOfLayers ()-1;
pcScalableSEI->setPrNumdIdMinus1( uiPrNumdIdMinus1 );
for ( i=0; i <= pcScalableSEI->getPrNumdIdMinus1(); i++ )
{
UInt uiPrDependencyId = i;//could be changed
pcScalableSEI->setPrDependencyId(i, uiPrDependencyId);
pcScalableSEI->setPrNumMinus1(i, 0);
for (j=0; j <= pcScalableSEI->getPrNumMinus1(i); j++)
{
UInt uiPrId = j;//could be changed
pcScalableSEI->setPrId(i,j,uiPrId);
Int32 uilayerProfileLevelIdc = 0;
{
UInt uilayerProfileIdc = m_uiProfileIdc[uiPrDependencyId];
UInt uiLayerLevelIdc = m_uiLevelIdc[uiPrDependencyId];
Bool bLayerConstraintSet0Flag = m_bConstraint0Flag[uiPrDependencyId];
Bool bLayerConstraintSet1Flag = m_bConstraint1Flag[uiPrDependencyId];
Bool bLayerConstraintSet2Flag = m_bConstraint2Flag[uiPrDependencyId];
Bool bLayerConstraintSet3Flag = m_bConstraint3Flag[uiPrDependencyId];
uilayerProfileLevelIdc += uilayerProfileIdc;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
uilayerProfileLevelIdc += bLayerConstraintSet0Flag;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
uilayerProfileLevelIdc += bLayerConstraintSet1Flag;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
uilayerProfileLevelIdc += bLayerConstraintSet2Flag;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 1;
uilayerProfileLevelIdc += bLayerConstraintSet3Flag;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 4;
uilayerProfileLevelIdc = uilayerProfileLevelIdc << 8;
uilayerProfileLevelIdc += uiLayerLevelIdc;
}
pcScalableSEI->setPrProfileLevelIdx(i,j,uilayerProfileLevelIdc);
pcScalableSEI->setPrAvgBitrateBPS(i,j,m_adAvgBitrate[uiPrDependencyId]);
pcScalableSEI->setPrMaxBitrateBPS(i,j,m_aadMaxBitrate[uiPrDependencyId][uiPrId]);
}
}
}
//SEI changes update }
//JVT-W053
const char *ucTemp = "http://svc.com";
strcpy( pcScalableSEI->getPriorityIdSetUri(), ucTemp);
//JVT-W053
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_apcLayerEncoder[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_apcLayerEncoder[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->setDependencyId( 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_apcLayerEncoder[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->setDependencyId( 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->setDependencyId( 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;
}
ErrVal
H264AVCEncoder::writeParameterSets( ExtBinDataAccessor* pcExtBinDataAccessor,
SequenceParameterSet*& rpcAVCSPS,
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();
if( rcSPS.getMbAdaptiveFrameFieldFlag() )
{
rcSPS.setFrameMbsOnlyFlag( false );
}
RNOK( m_pcNalUnitEncoder->write( rcSPS ) );
RNOK( m_pcNalUnitEncoder->closeNalUnit( uiBits ) );
if( m_pcCodingParameter->getNumberOfLayers() )
{
UInt uiLayer = rcSPS.getDependencyId();
UInt uiSize = pcExtBinDataAccessor->size();
RNOK( m_apcLayerEncoder[uiLayer]->addParameterSetBits( 8*(uiSize+4) ) );
}
// JVT-V068 {
if ( (m_pcCodingParameter->getEnableNalHRD() || m_pcCodingParameter->getEnableVclHRD()) &&
rcSPS.getProfileIdc() != SCALABLE_BASELINE_PROFILE &&
rcSPS.getProfileIdc() != SCALABLE_HIGH_PROFILE )
{
rpcAVCSPS = &rcSPS;
}
// JVT-V068 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -