📄 h264avcencoder.cpp
字号:
LayerParameters& rcBaseLayer = m_pcCodingParameter->getLayerParameters ( uiBaseLayerId );
UInt uiFgsMotionMode = rcBaseLayer.getFGSMotionMode();
Double dNumFGSLayers = rcBaseLayer.getNumFGSLayers();
// ICU/ETRI FGS_MOT Bug Fix
if (0 == uiFgsMotionMode || 0 == dNumFGSLayers)
{
pcMbDataCtrlEL = pcMbDataCtrl;
}
return Err::m_nOK;
}
ErrVal
H264AVCEncoder::getBaseLayerSH( SliceHeader*& rpcSliceHeader,
UInt uiBaseLayerId,
Int iPoc,
PicType ePicType )
{
ROF( uiBaseLayerId < MAX_LAYERS );
RNOK( m_apcMCTFEncoder[uiBaseLayerId]->getBaseLayerSH( rpcSliceHeader, iPoc, ePicType ) );
return Err::m_nOK;
}
UInt
H264AVCEncoder::getNewBits( UInt uiBaseLayerId )
{
ROFRS( uiBaseLayerId < MAX_LAYERS, 0 );
return m_apcMCTFEncoder[uiBaseLayerId]->getNewBits();
}
ErrVal
H264AVCEncoder::init( MCTFEncoder* apcMCTFEncoder[MAX_LAYERS],
ParameterSetMng* pcParameterSetMng,
PocCalculator* pcPocCalculator,
NalUnitEncoder* pcNalUnitEncoder,
ControlMngIf* pcControlMng,
CodingParameter* pcCodingParameter,
FrameMng* pcFrameMng)
{
ROT( NULL == apcMCTFEncoder );
ROT( NULL == pcFrameMng );
ROT( NULL == pcParameterSetMng );
ROT( NULL == pcPocCalculator );
ROT( NULL == pcNalUnitEncoder );
ROT( NULL == pcControlMng );
ROT( NULL == pcCodingParameter );
m_pcFrameMng = pcFrameMng;
m_pcParameterSetMng = pcParameterSetMng;
m_pcPocCalculator = pcPocCalculator;
m_pcNalUnitEncoder = pcNalUnitEncoder;
m_pcControlMng = pcControlMng;
m_pcCodingParameter = pcCodingParameter;
UInt uiLayer;
for( uiLayer = 0; uiLayer < m_pcCodingParameter->getNumberOfLayers(); uiLayer++ )
{
ROT( NULL == apcMCTFEncoder[uiLayer] );
m_apcMCTFEncoder[uiLayer] = apcMCTFEncoder[uiLayer];
}
for( ; uiLayer < MAX_LAYERS; uiLayer++ )
{
m_apcMCTFEncoder[uiLayer] = 0;
}
m_cAccessUnitList.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_pcFrameMng = NULL;
m_bInitDone = false;
m_bVeryFirstCall = true;
m_bScalableSeiMessage = true;
m_bTraceEnable = false;
for( UInt uiLayer = 0; uiLayer < MAX_LAYERS; uiLayer++ )
{
m_apcMCTFEncoder [uiLayer] = NULL;
m_acOrgPicBufferList[uiLayer] .clear();
m_acRecPicBufferList[uiLayer] .clear();
}
m_cAccessUnitList.clear();
return Err::m_nOK;
}
//{{Quality level estimation and modified truncation- JVTO044 and m12007
//France Telecom R&D-(nathalie.cammas@francetelecom.com)
ErrVal H264AVCEncoder::writeQualityLevelInfosSEI(ExtBinDataAccessor* pcExtBinDataAccessor, UInt* uiaQualityLevel, UInt *uiaDelta, UInt uiNumLevels, UInt uiLayer )
{
//===== create message =====
SEI::QualityLevelSEI* pcQualityLevelSEI;
RNOK( SEI::QualityLevelSEI::create( pcQualityLevelSEI ) );
//===== set message =====
pcQualityLevelSEI->setNumLevel(uiNumLevels);
pcQualityLevelSEI->setDependencyId(uiLayer);
UInt ui;
for(ui= 0; ui < uiNumLevels; ui++)
{
pcQualityLevelSEI->setQualityLevel(ui,uiaQualityLevel[ui]);
pcQualityLevelSEI->setDeltaBytesRateOfLevel(ui,uiaDelta[ui]);
}
//===== write message =====
UInt uiBits = 0;
SEI::MessageList cSEIMessageList;
cSEIMessageList.push_back ( pcQualityLevelSEI );
RNOK( m_pcNalUnitEncoder ->initNalUnit ( pcExtBinDataAccessor ) );
RNOK( m_pcNalUnitEncoder ->write ( cSEIMessageList ) );
RNOK( m_pcNalUnitEncoder ->closeNalUnit ( uiBits ) );
return Err::m_nOK;
}
//}}Quality level estimation and modified truncation- JVTO044 and m12007
// 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];
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] );
}
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_apcMCTFEncoder[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; //JVT-S036 lsj
UInt uiInputLayers = m_pcCodingParameter->getNumberOfLayers ();
UInt uiLayerNum = 0; //total scalable layer numbers
for ( UInt 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.getNotCodedMCTFStages();
// *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;
UInt uiTotalFGSLevel = (UInt)rcLayer.getNumFGSLayers () + 1;
uiLayerNum += uiActTempLevel * uiTotalFGSLevel;
pcScalableSEI->setROINum ( i, rcLayer.getNumROI() );
pcScalableSEI->setROIID ( i, rcLayer.getROIID() );
pcScalableSEI->setSGID ( i, rcLayer.getSGID() );
pcScalableSEI->setSLID ( i, rcLayer.getSLID() );
}
UInt uiTotalScalableLayer = 0;
//===== get framerate information ===
Double *dFramerate = dGetFramerate();
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.getNotCodedMCTFStages() + 1;
UInt uiTotalFGSLevel = (m_pcCodingParameter->getCGSSNRRefinement() == 1 ? 1 : (UInt)rcLayer.getNumFGSLayers () + 1);
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
if( uiNumScalableLayer == 0 )
{//JVT-S036 lsj
bSubRegionLayerFlag = true;
bProfileLevelInfoPresentFlag = true;
bInitParameterSetsInfoPresentFlag = true;
}
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);
m_aaauiScalableLayerId[uiDependencyID][uiCurrTempLevel][uiQualityLevel] = uiNumScalableLayer;
UInt uiSimplePriorityId = 0;
Bool bDiscardableFlag = false;
if( uiCurrFGSLevel > rcLayer.getNumFGSLayers() || rcLayer.isDiscardable() ) // bugfix replace
bDiscardableFlag = true;
pcScalableSEI->setSimplePriorityId(uiNumScalableLayer, uiSimplePriorityId);
pcScalableSEI->setDiscardableFlag(uiNumScalableLayer, bDiscardableFlag);
pcScalableSEI->setTemporalLevel(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);
pcScalableSEI->setExactInterlayerPredFlag(uiNumScalableLayer, bExactInterayerPredFlag);//JVT-S036 lsj
if(pcScalableSEI->getProfileLevelInfoPresentFlag(uiNumScalableLayer))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -