📄 h264avcencoder.cpp
字号:
PicType ePicType,
UInt uiTemporalId )
{
ROF ( uiBaseLayerId < MAX_LAYERS );
RNOK( m_apcLayerEncoder[uiBaseLayerId]->getBaseLayerData( rcELSH,
pcFrame,
pcResidual,
pcMbDataCtrl,
pcMbDataCtrlEL,
bSpatialScalability,
bMotion,
ePicType,
uiTemporalId ) );
pcMbDataCtrlEL = pcMbDataCtrl;
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::getBaseLayerResidual( Frame*& pcResidual,
UInt uiBaseLayerId)
{
pcResidual = m_apcLayerEncoder[uiBaseLayerId]->getBaseLayerResidual();
return Err::m_nOK;
}
UInt
H264AVCEncoder::getNewBits( UInt uiBaseLayerId )
{
ROFRS( uiBaseLayerId < MAX_LAYERS, 0 );
return m_apcLayerEncoder[uiBaseLayerId]->getNewBits();
}
ErrVal
H264AVCEncoder::init( LayerEncoder* apcLayerEncoder[MAX_LAYERS],
ParameterSetMng* pcParameterSetMng,
PocCalculator* pcPocCalculator,
NalUnitEncoder* pcNalUnitEncoder,
ControlMngIf* pcControlMng,
CodingParameter* pcCodingParameter,
// JVT-V068 {
StatBuf<Scheduler*, MAX_SCALABLE_LAYERS>* apcScheduler
// JVT-V068 }
)
{
ROT( NULL == apcLayerEncoder );
ROT( NULL == pcParameterSetMng );
ROT( NULL == pcPocCalculator );
ROT( NULL == pcNalUnitEncoder );
ROT( NULL == pcControlMng );
ROT( NULL == pcCodingParameter );
m_pcParameterSetMng = pcParameterSetMng;
m_pcPocCalculator = pcPocCalculator;
m_pcNalUnitEncoder = pcNalUnitEncoder;
m_pcControlMng = pcControlMng;
m_pcCodingParameter = pcCodingParameter;
// JVT-V068 {
m_apcScheduler = apcScheduler;
m_apcScheduler->setAll( 0 );
// JVT-V068 }
UInt uiLayer;
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
ROT( NULL == apcLayerEncoder[uiLayer] );
m_apcLayerEncoder[uiLayer] = apcLayerEncoder[uiLayer];
}
for( ; uiLayer < MAX_LAYERS; uiLayer++ )
{
m_apcLayerEncoder[uiLayer] = 0;
}
m_cAccessUnitDataList.clear();
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::uninit()
{
m_cUnWrittenSPS.clear();
m_cUnWrittenPPS.clear();
m_pcParameterSetMng = NULL;
m_pcPocCalculator = NULL;
m_pcNalUnitEncoder = NULL;
m_pcControlMng = NULL;
m_pcCodingParameter = NULL;
m_bInitDone = false;
m_bVeryFirstCall = true;
m_bScalableSeiMessage = true;
m_bTraceEnable = false;
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
m_apcLayerEncoder [uiLayer] = NULL;
m_acOrgPicBufferList[uiLayer] .clear();
m_acRecPicBufferList[uiLayer] .clear();
}
m_cAccessUnitDataList.clear();
return Err::m_nOK;
}
// JVT-T073 {
ErrVal H264AVCEncoder::writeNestingSEIMessage( ExtBinDataAccessor* pcExtBinDataAccessor )
{
SEI::ScalableNestingSei* pcScalableNestingSei;
RNOK( SEI::ScalableNestingSei::create(pcScalableNestingSei) );
//===== set message =====
//may be changed here
Bool bAllPicturesInAuFlag = 0;
pcScalableNestingSei->setAllPicturesInAuFlag( bAllPicturesInAuFlag );
if( bAllPicturesInAuFlag == 0 )
{
UInt uiNumPictures;
// assign value, may be changed here
uiNumPictures = 1;
ROT( uiNumPictures == 0 );
UInt *uiDependencyId = new UInt[uiNumPictures];
UInt *uiQualityLevel = new UInt[uiNumPictures];
UInt uiTemporalId = 0;
uiDependencyId[0] = 0;
uiQualityLevel[0] = 0;
pcScalableNestingSei->setNumPictures( uiNumPictures );
for( UInt uiIndex = 0; uiIndex < uiNumPictures; uiIndex++ )
{
pcScalableNestingSei->setDependencyId( uiIndex, uiDependencyId[uiIndex] );
pcScalableNestingSei->setQualityLevel( uiIndex, uiQualityLevel[uiIndex] );
}
pcScalableNestingSei->setTemporalId( uiTemporalId );
delete uiDependencyId;
delete uiQualityLevel;
}
//deal with the following SEI message in nesting SEI message
//may be changed here, here take scene_info_sei as an example
SEI::SceneInfoSei *pcSceneInfoSEI;
RNOK( SEI::SceneInfoSei::create( pcSceneInfoSEI ) );
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcScalableNestingSei );
cSEIMessageList.push_back ( pcSceneInfoSEI );
RNOK ( m_pcNalUnitEncoder->initNalUnit ( pcExtBinDataAccessor ) );
RNOK ( m_pcNalUnitEncoder->writeNesting ( cSEIMessageList ) );
RNOK ( m_pcNalUnitEncoder->closeNalUnit ( uiBits ) );
RNOK( m_apcLayerEncoder[0]->addParameterSetBits ( uiBits+4*8 ) );
RNOK( pcSceneInfoSEI->destroy() );
RNOK( pcScalableNestingSei->destroy() );
return Err::m_nOK;
}
// JVT-T073 }
ErrVal
H264AVCEncoder::xWriteScalableSEI( ExtBinDataAccessor* pcExtBinDataAccessor )
{
//===== create message =====
SEI::ScalableSei* pcScalableSEI;
RNOK(SEI::ScalableSei::create(pcScalableSEI) );
//===== set message =====
UInt j = 0; //JVT-S036 lsj
UInt i = 0;
UInt uiInputLayers = m_pcCodingParameter->getNumberOfLayers ();
UInt uiLayerNum = 0; //total scalable layer numbers
for ( i = 0; i < uiInputLayers; i++ ) //calculate total scalable layer numbers
{
//bug-fix suffix{{
//Bool bH264AVCCompatible = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 0 );
//Bool bH264AVCCompatible = ( i == 0 );
//bug-fix suffix}}
//Bool bSubSeq = ( i == 0 && m_pcCodingParameter->getBaseLayerMode() > 1 );
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( i );
UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedStages ();
// *LMH(20060203): Fix Bug due to underflow (Replace)
//UInt uiMinTempLevel = ( !bH264AVCCompatible ||bSubSeq ) ? 0: max( 0, uiTotalTempLevel - 1 );
UInt uiMinTempLevel = 0; //bugfix replace
UInt uiActTempLevel = uiTotalTempLevel - uiMinTempLevel + 1;
uiLayerNum += uiActTempLevel * rcLayer.getNumberOfQualityLevelsCGSSNR();
pcScalableSEI->setROINum ( i, rcLayer.getNumROI() );
pcScalableSEI->setROIID ( i, rcLayer.getROIID() );
pcScalableSEI->setSGID ( i, rcLayer.getSGID() );
pcScalableSEI->setSLID ( i, rcLayer.getSLID() );
}
UInt uiNumLayersMinus1 = uiLayerNum - 1;
pcScalableSEI->setNumLayersMinus1 ( uiNumLayersMinus1 );
UInt uiNumScalableLayer = 0;
for ( UInt uiCurrLayer = 0; uiCurrLayer < uiInputLayers; uiCurrLayer++)
{
LayerParameters& rcLayer = m_pcCodingParameter->getLayerParameters ( uiCurrLayer );
UInt uiTotalTempLevel = rcLayer.getDecompositionStages () - rcLayer.getNotCodedStages () + 1;
UInt uiTotalFGSLevel = rcLayer.getNumberOfQualityLevelsCGSSNR();
UInt uiMinTempLevel = 0; //bugfix replace
for ( UInt uiCurrTempLevel = 0; uiCurrTempLevel < uiTotalTempLevel; uiCurrTempLevel++ )
{
for ( UInt uiCurrFGSLevel = 0; uiCurrFGSLevel < uiTotalFGSLevel; uiCurrFGSLevel++ )
{
if( uiCurrTempLevel >= uiMinTempLevel )
{
//Bool bSubPicLayerFlag = false;
Bool bSubRegionLayerFlag = false;
Bool bProfileLevelInfoPresentFlag = false;
//Bool bInitParameterSetsInfoPresentFlag = false; //may be changed //JVT-S036 lsj//SEI changes update
Bool bParameterSetsInfoPresentFlag = false; //may be changed //JVT-S036 lsj//SEI changes update
if( uiNumScalableLayer == 0 )
{//JVT-S036 lsj
bSubRegionLayerFlag = true;
bProfileLevelInfoPresentFlag = true;
//bInitParameterSetsInfoPresentFlag = true; //SEI changes update
bParameterSetsInfoPresentFlag = true; //SEI changes update
}
Bool bBitrateInfoPresentFlag = true;
Bool bFrmRateInfoPresentFlag = true;//rcLayer.getInputFrameRate () > 0;
Bool bFrmSizeInfoPresentFlag = true;
// BUG_FIX liuhui{
Bool bLayerDependencyInfoPresentFlag = true; //may be changed
// BUG_FIX liuhui}
Bool bExactInterayerPredFlag = true; //JVT-S036 lsj may be changed
pcScalableSEI->setLayerId(uiNumScalableLayer, uiNumScalableLayer);
UInt uiTempLevel = uiCurrTempLevel; //BUG_FIX_FT_01_2006
UInt uiDependencyID = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? rcLayer.getLayerCGSSNR() : uiCurrLayer);
UInt uiQualityLevel = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? rcLayer.getQualityLevelCGSSNR() + uiCurrFGSLevel : uiCurrFGSLevel);
m_aaauiScalableLayerId[uiDependencyID][uiCurrTempLevel][uiQualityLevel] = uiNumScalableLayer;
//UInt uiSimplePriorityId = 0;//SEI changes update
UInt uiPriorityId = 0;//SEI changes update
Bool bDiscardableFlag = false;
if( uiCurrFGSLevel > 0 || rcLayer.isDiscardable() ) // bugfix replace
bDiscardableFlag = true;
//pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);//SEI update
pcScalableSEI->setPriorityId(uiNumScalableLayer, uiPriorityId);//SEI update
pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, bDiscardableFlag);
pcScalableSEI->setTemporalId(uiNumScalableLayer, uiTempLevel);
pcScalableSEI->setDependencyId(uiNumScalableLayer, uiDependencyID);
pcScalableSEI->setQualityLevel(uiNumScalableLayer, uiQualityLevel);
//JVT-S036 lsj end
pcScalableSEI->setSubRegionLayerFlag(uiNumScalableLayer, bSubRegionLayerFlag);
// JVT-S054 (REPLACE)
//pcScalableSEI->setIroiSliceDivisionInfoPresentFlag(uiNumScalableLayer, bIroiSliceDivisionFlag); //JVT-S036 lsj
pcScalableSEI->setIroiSliceDivisionInfoPresentFlag(uiNumScalableLayer, rcLayer.m_bSliceDivisionFlag);
pcScalableSEI->setProfileLevelInfoPresentFlag(uiNumScalableLayer, bProfileLevelInfoPresentFlag);
pcScalableSEI->setBitrateInfoPresentFlag(uiNumScalableLayer, bBitrateInfoPresentFlag);
pcScalableSEI->setFrmRateInfoPresentFlag(uiNumScalableLayer, bFrmRateInfoPresentFlag);
pcScalableSEI->setFrmSizeInfoPresentFlag(uiNumScalableLayer, bFrmSizeInfoPresentFlag);
pcScalableSEI->setLayerDependencyInfoPresentFlag(uiNumScalableLayer, bLayerDependencyInfoPresentFlag);
//pcScalableSEI->setInitParameterSetsInfoPresentFlag(uiNumScalableLayer, bInitParameterSetsInfoPresentFlag);//SEI changes update
pcScalableSEI->setParameterSetsInfoPresentFlag(uiNumScalableLayer, bParameterSetsInfoPresentFlag);//SEI changes update
pcScalableSEI->setExactInterlayerPredFlag(uiNumScalableLayer, bExactInterayerPredFlag);//JVT-S036 lsj
//JVT-W046 {
//pcScalableSEI->setAvcLayerConversionFlag(uiNumScalableLayer, 0); //default: 0, could be changed
pcScalableSEI->setLayerConversionFlag(uiNumScalableLayer, 0); //default: 0, could be changed SEI changes update
//JVT-W046 }
//JVT-W047
if(m_apcLayerEncoder[0]->m_bOutputFlag)
pcScalableSEI->setLayerOutputFlag(uiNumScalableLayer,true);
else
pcScalableSEI->setLayerOutputFlag(uiNumScalableLayer,false);
//JVT-W047
if(pcScalableSEI->getProfileLevelInfoPresentFlag(uiNumScalableLayer))
{
UInt uilayerProfileIdc = 0; //may be changed
Bool bLayerConstraintSet0Flag = false; //may be changed
//bug-fix suffix{{
// Bool bH264AVCCompatibleTmp = m_pcCodingParameter->getBaseLayerMode() > 0 && uiCurrLayer == 0;
Bool bH264AVCCompatibleTmp = ( uiCurrLayer == 0 );
//bug-fix suffix}}
Bool bLayerConstraintSet1Flag = ( bH264AVCCompatibleTmp ? 1 : 0 ); //may be changed
Bool bLayerConstraintSet2Flag = false; //may be changed
Bool bLayerConstraintSet3Flag = false; //may be changed
UInt uiLayerLevelIdc = 0; //may be changed
//JVT-W051 {
uilayerProfileIdc = m_uiProfileIdc[uiCurrLayer];
uiLayerLevelIdc = m_uiLevelIdc[uiCurrLayer];
bLayerConstraintSet0Flag = m_bConstraint0Flag[uiCurrLayer];
bLayerConstraintSet1Flag = m_bConstraint1Flag[uiCurrLayer];
bLayerConstraintSet2Flag = m_bConstraint2Flag[uiCurrLayer];
bLayerConstraintSet3Flag = m_bConstraint3Flag[uiCurrLayer];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -