📄 gopencoder.cpp
字号:
ROF( pcYuvHalfPelBufferCtrl );
ROF( pcQuarterPelFilter );
ROF( pcMotionEstimation );
//JVT-U106 Behaviour at slice boundaries{
ROF( pcReconstructionBypass );
//JVT-U106 Behaviour at slice boundaries}
//----- references -----
m_pcSPS = 0;
m_pcPPSLP = 0;
m_pcPPSHP = 0;
m_pcYuvFullPelBufferCtrl = pcYuvFullPelBufferCtrl;
m_pcYuvHalfPelBufferCtrl = pcYuvHalfPelBufferCtrl;
m_pcPocCalculator = pcPocCalculator;
m_pcH264AVCEncoder = pcH264AVCEncoder;
m_pcSliceEncoder = pcSliceEncoder;
m_pcNalUnitEncoder = pcNalUnitEncoder;
m_pcLoopFilter = pcLoopFilter;
m_pcQuarterPelFilter = pcQuarterPelFilter;
m_pcMotionEstimation = pcMotionEstimation;
//JVT-U106 Behaviour at slice boundaries{
m_pcReconstructionBypass = pcReconstructionBypass;
//JVT-U106 Behaviour at slice boundaries}
m_pcLayerParameters = pcLayerParameters;
//----- fixed control parameters -----
m_bInterlaced = pcLayerParameters->isInterlaced();
// JVT-V068 {
m_bEnableHrd = pcCodingParameter->getEnableNalHRD() || pcCodingParameter->getEnableVclHRD();
m_apcScheduler = apcScheduler;
// JVT-V068 }
// JVT-W049 {
m_uiNumberLayersCnt = pcCodingParameter->getNumberOfLayers();
// JVT-W049 }
m_uiDependencyId = pcLayerParameters->getDependencyId ();
m_uiBaseLayerId = pcLayerParameters->getBaseLayerId ();
m_uiBaseQualityLevel = pcLayerParameters->getBaseQualityLevel ();
// JVT-Q065 EIDR{
m_iIDRPeriod = pcLayerParameters->getIDRPeriod ();
m_bBLSkipEnable = pcLayerParameters->getBLSkipEnable ();
// JVT-Q065 EIDR}
// JVT-U085 LMI
m_bTlevelNestingFlag = pcCodingParameter->getTlevelNestingFlag();
// JVT-U116 W062 LMI
m_bTl0DepRepIdxEnable = pcCodingParameter->getTl0DepRepIdxSeiEnable();
m_bDiscardable = pcLayerParameters->isDiscardable(); //DS_FIX_FT_09_2007
m_uiQLDiscardable = pcLayerParameters->getQLDiscardable(); //DS_FIX_FT_09_2007
m_uiEssRPChkEnable = pcCodingParameter->getEssRPChkEnable();
m_uiMVThres = pcCodingParameter->getMVThres();
m_uiQualityLevelForPrediction = 15;
if( pcCodingParameter->getNumberOfLayers() > pcLayerParameters->getDependencyId() + 1 )
{
m_uiQualityLevelForPrediction = (pcLayerParameters + 1)->getBaseQualityLevel();
if( m_uiQualityLevelForPrediction > 15 )
{
ROT( 1 );
m_uiQualityLevelForPrediction = 15;
}
}
m_uiDecompositionStages = pcLayerParameters->getDecompositionStages ();
m_uiTemporalResolution = pcLayerParameters->getTemporalResolution ();
m_uiNotCodedStages = pcLayerParameters->getNotCodedStages ();
m_uiFrameDelay = pcLayerParameters->getFrameDelay ();
m_uiMaxNumRefFrames = pcCodingParameter->getNumRefFrames ();
m_uiLowPassIntraPeriod = pcCodingParameter->getIntraPeriodLowPass ();
m_uiNumMaxIter = pcCodingParameter->getMotionVectorSearchParams().getNumMaxIter ();
m_uiIterSearchRange = pcCodingParameter->getMotionVectorSearchParams().getIterSearchRange ();
m_iMaxDeltaQp = pcLayerParameters->getMaxAbsDeltaQP ();
// m_bH264AVCCompatible = pcCodingParameter->getBaseLayerMode () > 0 && m_uiDependencyId == 0;
m_bH264AVCCompatible = m_uiDependencyId == 0; //bug-fix suffix
m_bInterLayerPrediction = pcLayerParameters->getInterLayerPredictionMode() > 0;
m_bAdaptivePrediction = pcLayerParameters->getInterLayerPredictionMode() > 1;
m_bHaarFiltering = false;
m_bBiPredOnly = false;
m_bForceReOrderingCommands= pcLayerParameters->getForceReorderingCommands () > 0;
m_bWriteSubSequenceSei = pcCodingParameter->getBaseLayerMode () > 1 && m_uiDependencyId == 0;
m_bSameResBL = ( m_uiBaseLayerId != MSYS_UINT_MAX &&
pcCodingParameter->getLayerParameters( m_uiBaseLayerId ).getFrameWidth () == pcLayerParameters->getFrameWidth () &&
pcCodingParameter->getLayerParameters( m_uiBaseLayerId ).getFrameHeight() == pcLayerParameters->getFrameHeight() &&
pcLayerParameters->getResizeParameters().m_iExtendedSpatialScalability == ESS_NONE );
m_bSameResEL = false;
{
UInt uiLId;
for( uiLId = m_uiDependencyId + 1; uiLId < pcCodingParameter->getNumberOfLayers() && ! m_bSameResEL; uiLId++ )
{
LayerParameters& rcEL = pcCodingParameter->getLayerParameters( uiLId );
if( rcEL.getBaseLayerId() == m_uiDependencyId )
{
m_bSameResEL = ( pcLayerParameters->getFrameWidth () == rcEL.getFrameWidth () &&
pcLayerParameters->getFrameHeight() == rcEL.getFrameHeight() &&
rcEL.getResizeParameters().m_iExtendedSpatialScalability == ESS_NONE );
}
}
}
m_bMGS = pcCodingParameter->getCGSSNRRefinement () == 1 && ( m_bSameResBL || m_bSameResEL );
m_uiEncodeKeyPictures = pcCodingParameter->getEncodeKeyPictures ();
m_uiMGSKeyPictureControl = pcCodingParameter->getMGSKeyPictureControl();
m_bHighestMGSLayer = m_bMGS && !m_bSameResEL;
m_uiLastCodedFrameIdInGOP = MSYS_UINT_MAX;
m_uiLastCodedTemporalId = MSYS_UINT_MAX;
m_bExplicitQPCascading = pcLayerParameters->getExplicitQPCascading() != 0;
for( UInt uiTTL = 0; uiTTL < MAX_TEMP_LEVELS; uiTTL++ )
{
m_adDeltaQPTLevel[uiTTL] = pcLayerParameters->getDeltaQPTLevel( uiTTL );
}
//JVT-V079 Low-complexity MB mode decision {
if ( m_uiDependencyId==0 )
m_pcSliceEncoder->getMbEncoder()->setLowComplexMbEnable ( m_uiDependencyId, (pcLayerParameters->getLowComplexMbEnable ()==1) );
else
m_pcSliceEncoder->getMbEncoder()->setLowComplexMbEnable ( m_uiDependencyId, false );
//JVT-V079 Low-complexity MB mode decision }
//JVT-R057 LA-RDO{
if(pcCodingParameter->getLARDOEnable()!=0)
{
static UInt auiPLR[5];
static UInt aauiSize[5][2];
static Double dRatio[5][2];
auiPLR[m_uiDependencyId] = pcLayerParameters->getPLR ();
m_bLARDOEnable = pcCodingParameter->getLARDOEnable()==0? false:true;
aauiSize[m_uiDependencyId][0] =pcLayerParameters->getFrameWidth();
aauiSize[m_uiDependencyId][1] =pcLayerParameters->getFrameHeight();
if(m_uiDependencyId==0||pcLayerParameters->getBaseLayerId()==MSYS_UINT_MAX)
{
dRatio[m_uiDependencyId][0]=1;
dRatio[m_uiDependencyId][1]=1;
}
else
{
dRatio[m_uiDependencyId][0]=(Double)aauiSize[m_uiDependencyId][0]/aauiSize[pcLayerParameters->getBaseLayerId()][0];
dRatio[m_uiDependencyId][1]=(Double)aauiSize[m_uiDependencyId][1]/aauiSize[pcLayerParameters->getBaseLayerId()][1];
}
m_pcSliceEncoder->getMbEncoder()->setRatio(dRatio);
m_pcSliceEncoder->getMbEncoder()->setPLR(auiPLR);
pcLayerParameters->setContrainedIntraForLP();
}
//JVT-R057 LA-RDO}
m_uiPreAndSuffixUnitEnable = pcCodingParameter->getPreAndSuffixUnitEnable();//JVT-S036 lsj
m_uiMMCOBaseEnable = pcCodingParameter->getMMCOBaseEnable(); //JVT-S036 lsj
// TMM_ESS
m_pcResizeParameters = &pcLayerParameters->getResizeParameters();
m_pESSFile = 0;
if( m_pcResizeParameters->m_iExtendedSpatialScalability == ESS_PICT )
{
m_pESSFile = fopen( pcLayerParameters->getESSFilename().c_str(), "r" );
if( !m_pESSFile )
{
printf( "failed to open resize parameter file %s\n", pcLayerParameters->getESSFilename().c_str() );
ROT(1);
}
}
for( UInt uiStage = 0; uiStage < MAX_DSTAGES; uiStage++ )
{
m_adBaseQpLambdaMotion[uiStage] = pcLayerParameters->getQpModeDecision( uiStage );
}
m_dBaseQpLambdaMotionLP = pcLayerParameters->getQpModeDecisionLP ();
m_dBaseQPResidual = pcLayerParameters->getBaseQpResidual ();
m_uiFilterIdc = pcCodingParameter->getLoopFilterParams ().getFilterIdc ();
m_iAlphaOffset = pcCodingParameter->getLoopFilterParams ().getAlphaOffset ();
m_iBetaOffset = pcCodingParameter->getLoopFilterParams ().getBetaOffset ();
m_uiInterLayerFilterIdc = pcCodingParameter->getInterLayerLoopFilterParams().getFilterIdc ();
m_iInterLayerAlphaOffset = pcCodingParameter->getInterLayerLoopFilterParams().getAlphaOffset ();
m_iInterLayerBetaOffset = pcCodingParameter->getInterLayerLoopFilterParams().getBetaOffset ();
m_bLoadMotionInfo = pcLayerParameters->getMotionInfoMode () == 1;
m_bSaveMotionInfo = pcLayerParameters->getMotionInfoMode () == 2;
m_pMotionInfoFile = 0;
if( m_bLoadMotionInfo )
{
m_pMotionInfoFile = ::fopen( pcLayerParameters->getMotionInfoFilename().c_str(), "rb" );
if( ! m_pMotionInfoFile )
{
fprintf( stderr, "\nCANNOT OPEN MOTION INFO FILE \"%s\"\n\n", pcLayerParameters->getMotionInfoFilename().c_str() );
return Err::m_nERR;
}
}
else if( m_bSaveMotionInfo )
{
m_pMotionInfoFile = ::fopen( pcLayerParameters->getMotionInfoFilename().c_str(), "wb" );
if( ! m_pMotionInfoFile )
{
fprintf( stderr, "\nCANNOT OPEN MOTION INFO FILE \"%s\"\n\n", pcLayerParameters->getMotionInfoFilename().c_str() );
return Err::m_nERR;
}
}
//----- PSNR and rate -----
m_fOutputFrameRate = pcLayerParameters->getOutputFrameRate();
m_uiParameterSetBits = 0;
UInt ui;
for( ui = 0; ui <= MAX_DSTAGES; ui++ )
{
m_auiNumFramesCoded [ui] = 0;
m_adPSNRSumY [ui] = 0.0;
m_adPSNRSumU [ui] = 0.0;
m_adPSNRSumV [ui] = 0.0;
}
m_uiNewlyCodedBits = 0;
// JVT-S054 (ADD) ->
m_bIroiSliceDivisionFlag = pcLayerParameters->m_bSliceDivisionFlag;
if (m_bIroiSliceDivisionFlag)
{
m_uiNumSliceMinus1 = pcLayerParameters->m_uiNumSliceMinus1;
if (m_puiFirstMbInSlice != NULL)
free(m_puiFirstMbInSlice);
m_puiFirstMbInSlice = (UInt*)malloc((m_uiNumSliceMinus1+1)*sizeof(UInt));
memcpy( m_puiFirstMbInSlice, pcLayerParameters->m_puiFirstMbInSlice, (m_uiNumSliceMinus1+1)*sizeof(UInt) );
if (m_puiLastMbInSlice != NULL)
free(m_puiLastMbInSlice);
m_puiLastMbInSlice = (UInt*)malloc((m_uiNumSliceMinus1+1)*sizeof(UInt));
memcpy( m_puiLastMbInSlice, pcLayerParameters->m_puiLastMbInSlice, (m_uiNumSliceMinus1+1)*sizeof(UInt) );
}
// JVT-S054 (ADD) <-
//S051{
m_uiTotalFrame = pcCodingParameter->getTotalFrames();
m_uiAnaSIP = pcLayerParameters->getAnaSIP();
m_cOutSIPFileName = pcLayerParameters->getOutSIPFileName();
if(m_uiAnaSIP==1)
m_bInterLayerPrediction=true;
if(m_uiAnaSIP==2)
m_bInterLayerPrediction=m_bAdaptivePrediction=false;
if(pcCodingParameter->getNumberOfLayers() > m_uiDependencyId+1)
{
m_bEncSIP = pcCodingParameter->getLayerParameters( m_uiDependencyId+1).getEncSIP();
m_cInSIPFileName = pcCodingParameter->getLayerParameters( m_uiDependencyId+1).getInSIPFileName();
}
//S051}
//JVT-U106 Behaviour at slice boundaries{
m_bCIUFlag=pcCodingParameter->getCIUFlag()!=0;
//JVT-U106 Behaviour at slice boundaries}
{
Int iMaxNumMb = ( ( pcLayerParameters->getFrameWidth() + 15 ) >> 4 ) * ( ( pcLayerParameters->getFrameHeight() + 15 ) >> 4 );
m_apabBaseModeFlagAllowedArrays[0] = new Bool [iMaxNumMb];
m_apabBaseModeFlagAllowedArrays[1] = new Bool [iMaxNumMb];
ROF( m_apabBaseModeFlagAllowedArrays[0] );
ROF( m_apabBaseModeFlagAllowedArrays[1] );
}
m_uiFramesInCompleteGOPsProcessed = 0;
m_uiMinScalableLayer = 0;
for( UInt uiBaseLayerId = 0; uiBaseLayerId < m_uiDependencyId; uiBaseLayerId++ )
{
m_uiMinScalableLayer += pcCodingParameter->getLayerParameters( uiBaseLayerId ).getDecompositionStages() -
pcCodingParameter->getLayerParameters( uiBaseLayerId ).getNotCodedStages () + 1U;
}
//JVT-X046 {
m_uiSliceMode = pcCodingParameter->getSliceMode();
m_uiSliceArgument = pcCodingParameter->getSliceArgument();
if ( m_uiSliceMode == 2 )
{
m_uiSliceArgument = m_uiSliceArgument*8;
}
//JVT-X046 }
return Err::m_nOK;
}
__inline UInt downround2powerof2( UInt i ) { UInt r = 1; for( ; (UInt)( 1 << r ) <= i; r++ ); return ( 1 << ( r - 1 ) ); }
ErrVal
LayerEncoder::initParameterSets( const SequenceParameterSet& rcSPS,
const PictureParameterSet& rcPPSLP,
const PictureParameterSet& rcPPSHP )
{
//===== set references =====
m_pcSPS = &rcSPS;
m_pcPPSLP = &rcPPSLP;
m_pcPPSHP = &rcPPSHP;
//===== get and set relevant parameters =====
m_bFrameMbsOnlyFlag = rcSPS.getFrameMbsOnlyFlag ();
UInt uiMaxDPBSize = rcSPS.getMaxDPBSize ();
m_uiFrameWidthInMb = rcSPS.getFrameWidthInMbs ();
m_uiFrameHeightInMb = rcSPS.getFrameHeightInMbs ();
m_uiMbNumber = m_uiFrameWidthInMb * m_uiFrameHeightInMb;
m_uiMaxGOPSize = downround2powerof2( uiMaxDPBSize );
//===== re-allocate dynamic memory =====
RNOK( xDeleteData() );
RNOK( xCreateData( rcSPS ) );
//===== initialize some parameters =====
m_bInitDone = true;
m_bFirstGOPCoded = false;
m_uiFrameCounter = 0;
m_uiFrameNum = 0;
m_uiGOPNumber = 0;
::memset( m_abIsRef, 0x00, sizeof( m_abIsRef ) );
return Err::m_nOK;
}
ErrVal
LayerEncoder::addParameterSetBits( UInt uiParameterSetBits )
{
m_uiParameterSetBits += uiParameterSetBits;
return Err::m_nOK;
}
ErrVal
LayerEncoder::xCreateData( const SequenceParameterSet& rcSPS )
{
UInt uiIndex;
//========== CREATE FRAME MEMORIES ==========
ROFS ( ( m_papcFrame = new Frame* [ m_uiMaxGOPSize + 1 ] ) );
ROFS ( ( m_papcOrgFrame = new Frame* [ m_uiMaxGOPSize + 1 ] ) );
if( m_uiQualityLevelForPrediction < 15 )
{
ROFS ( ( m_papcCLRecFrame = new Frame* [ m_uiMaxGOPSize + 1 ] ) );
}
if( m_uiMGSKeyPictureControl && ! m_bHighestMGSLayer )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -