📄 gopencoder.cpp
字号:
}
pcLayerParameters->setNumFGSLayers( m_dNumFGSLayers ); // (HS): fix - also store in layer parameters
}//FIX_FRAG_CAVLC
//JVT-P031
if(m_bUseDiscardableUnit)
{
Double dPredTargetBits = 1000.0 * pcLayerParameters->getPredFGSRate() * (Double)uiNumFrames / pcLayerParameters->getOutputFrameRate();
UInt uiPredTargetBits = (UInt)floor( dPredTargetBits + 0.5 );
UInt uiSumAllBits = uiSumBaseBits + uiSumFGSBits[0] + uiSumFGSBits[1] + uiSumFGSBits[2]; //FIX_FRAG_CAVLC
if( uiPredTargetBits <= uiSumBaseBits )
{
ROF( uiPredTargetBits );
printf("Warning: Layer %d bitrate overflow (only base layer coded)\n", m_uiLayerId );
m_dPredFGSCutFactor = 0.0;
m_dPredFGSBitRateFactor = (Double)uiPredTargetBits / (Double)uiSumBaseBits; // there is a chance that only coding the base layer is not the right thing for closed-loop
}
else if( uiPredTargetBits >= uiSumAllBits )
{
printf("Warning: Layer %d bitrate underflow (code as much as possible)\n", m_uiLayerId );
m_dPredFGSCutFactor = 3.0;
m_dPredFGSBitRateFactor = (Double)uiPredTargetBits / (Double)uiSumAllBits; // it is possible that not all layers have been coded during the analysis run (e.g. for closed-loop)
}
else
{
uiPredTargetBits -= uiSumBaseBits;
for( UInt uiFGSLayer = 0; uiFGSLayer < MAX_FGS_LAYERS; uiFGSLayer++ )
{
if( uiPredTargetBits < uiSumFGSBits[uiFGSLayer] )
{
m_dPredFGSCutFactor = (Double)uiFGSLayer + (Double)uiPredTargetBits / (Double)uiSumFGSBits[uiFGSLayer];
break;
}
uiPredTargetBits -= uiSumFGSBits[uiFGSLayer];
}
m_dPredFGSBitRateFactor = 0.0;
}
}
//~JVT-P031
::fseek( m_pFGSFile, 0, SEEK_SET );
}
// 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_uiLayerId+1)
{
m_bEncSIP = pcCodingParameter->getLayerParameters( m_uiLayerId+1).getEncSIP();
m_cInSIPFileName = pcCodingParameter->getLayerParameters( m_uiLayerId+1).getInSIPFileName();
}
//S051}
m_uiPaff = pcLayerParameters->getPaff();
//JVT-U106 Behaviour at slice boundaries{
m_bCIUFlag=pcCodingParameter->getCIUFlag()!=0;
//JVT-U106 Behaviour at slice boundaries}
m_uiFramesInCompleteGOPsProcessed = 0;
m_uiMinScalableLayer = 0;
for( UInt uiBaseLayerId = 0; uiBaseLayerId < m_uiLayerId; uiBaseLayerId++ )
{
m_uiMinScalableLayer += ( pcCodingParameter->getLayerParameters( uiBaseLayerId ).getDecompositionStages() -
pcCodingParameter->getLayerParameters( uiBaseLayerId ).getNotCodedMCTFStages () + 1U ) *
( 1U +
(UInt)pcCodingParameter->getLayerParameters( uiBaseLayerId ).getNumFGSLayers () );
}
return Err::m_nOK;
}
__inline UInt downround2powerof2( UInt i ) { UInt r = 1; for( ; (UInt)( 1 << r ) <= i; r++ ); return ( 1 << ( r - 1 ) ); }
ErrVal
MCTFEncoder::initParameterSetsForFGS( const SequenceParameterSet& rcSPS,
const PictureParameterSet& rcPPSLP,
const PictureParameterSet& rcPPSHP )
{
m_pcSPS_FGS = &rcSPS;
m_pcPPSLP_FGS = &rcPPSLP;
m_pcPPSHP_FGS = &rcPPSHP;
return Err::m_nOK;
}
ErrVal
MCTFEncoder::initParameterSets( const SequenceParameterSet& rcSPS,
const PictureParameterSet& rcPPSLP,
const PictureParameterSet& rcPPSHP )
{
//===== set references =====
m_pcSPS = &rcSPS;
m_pcPPSLP = &rcPPSLP;
m_pcPPSHP = &rcPPSHP;
m_pcSPS_FGS = &rcSPS;
m_pcPPSLP_FGS = &rcPPSLP;
m_pcPPSHP_FGS = &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
MCTFEncoder::addParameterSetBits( UInt uiParameterSetBits )
{
m_uiParameterSetBits += uiParameterSetBits;
return Err::m_nOK;
}
ErrVal
MCTFEncoder::xCreateData( const SequenceParameterSet& rcSPS )
{
UInt uiIndex;
//========== CREATE FRAME MEMORIES ==========
ROFS ( ( m_papcFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
ROFS ( ( m_papcOrgFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
if( m_uiClosedLoopMode == 2 )
{
ROFS ( ( m_papcBQFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
}
if( m_uiQualityLevelForPrediction < 3 || m_bUseDiscardableUnit) //JVT-P031
{
ROFS ( ( m_papcCLRecFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
}
if( m_uiMGSKeyPictureControl && ! m_bHighestMGSLayer )
{
ROFS ( ( m_papcELFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
}
ROFS ( ( m_papcResidual = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
ROFS ( ( m_papcSubband = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
//-- JVT-R091
ROFS ( ( m_papcSmoothedFrame = new IntFrame* [ m_uiMaxGOPSize + 1 ] ) );
//--
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
RNOK( IntFrame::create( m_papcFrame [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_papcFrame [ uiIndex ] ->init () );
RNOK( IntFrame::create( m_papcOrgFrame [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_papcOrgFrame [ uiIndex ] ->init () );
if( m_papcBQFrame )
{
RNOK( IntFrame::create( m_papcBQFrame [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK( m_papcBQFrame [ uiIndex ] ->init () );
}
if( m_papcCLRecFrame )
{
RNOK( IntFrame::create( m_papcCLRecFrame[ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK( m_papcCLRecFrame [ uiIndex ] ->init () );
}
if( m_papcELFrame )
{
RNOK( IntFrame::create( m_papcELFrame[ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK( m_papcELFrame [ uiIndex ] ->init () );
}
//-- JVT-R091
if( m_papcSmoothedFrame )
{
RNOK( IntFrame::create( m_papcSmoothedFrame[ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK( m_papcSmoothedFrame [ uiIndex ] ->init () );
}
RNOK( IntFrame::create( m_papcResidual [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_papcResidual [ uiIndex ] ->init () );
RNOK( IntFrame::create( m_papcSubband [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_papcSubband [ uiIndex ] ->init () );
}
for( uiIndex = 0; uiIndex < NUM_TMP_FRAMES; uiIndex++ )
{
RNOK( IntFrame::create( m_apcFrameTemp [ uiIndex ], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_apcFrameTemp [ uiIndex ] ->init () );
}
for( uiIndex = 0; uiIndex < 2; uiIndex++ )
{
for( UInt uiLayerIdx = 0; uiLayerIdx < 4; uiLayerIdx ++ )
{
RNOK( IntFrame::create( m_aapcFGSRecon[uiIndex][uiLayerIdx], *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_aapcFGSRecon[uiIndex][uiLayerIdx] ->init () );
}
}
RNOK( IntFrame::create( m_aapcFGSPredFrame, *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_aapcFGSPredFrame ->init () );
RNOK( IntFrame::create( m_pcLowPassBaseReconstruction, *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_pcLowPassBaseReconstruction ->init () );
RNOK( IntFrame::create( m_pcAnchorFrameOriginal , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_pcAnchorFrameOriginal ->init () );
RNOK( IntFrame::create( m_pcAnchorFrameReconstructed , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_pcAnchorFrameReconstructed ->init () );
RNOK( IntFrame::create( m_pcBaseLayerFrame , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_pcBaseLayerFrame ->init () );
RNOK( IntFrame::create( m_pcBaseLayerResidual , *m_pcYuvFullPelBufferCtrl, *m_pcYuvHalfPelBufferCtrl, FRAME ) );
RNOK ( m_pcBaseLayerResidual ->init () );
ROFS ( ( m_pbFieldPicFlag = new Bool[ m_uiMaxGOPSize + 1 ] ));
//========== CREATE MACROBLOCK DATA MEMORIES ==========
ROFS ( ( m_pacControlData = new ControlData[ m_uiMaxGOPSize + 1 ] ) );
ROFS ( ( m_pacControlDataEL = new ControlData[ m_uiMaxGOPSize + 1 ] ) );
for( uiIndex = 0; uiIndex <= m_uiMaxGOPSize; uiIndex++ )
{
MbDataCtrl* pcMbDataCtrl = 0;
ROFS ( ( pcMbDataCtrl = new MbDataCtrl () ) );
RNOK ( pcMbDataCtrl ->init ( rcSPS ) );
RNOK ( m_pacControlData[ uiIndex ] . setMbDataCtrl ( pcMbDataCtrl ) );
RNOK ( m_pacControlData[ uiIndex ] .initFGSData ( m_uiFrameWidthInMb * m_uiFrameHeightInMb ) );
Bool bLowPass = ( ( uiIndex % ( 1 << m_uiDecompositionStages ) ) == 0 );
SliceHeader* pcSliceHeader = 0;
ROFS ( ( pcSliceHeader = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ) );
RNOK ( m_pacControlData[ uiIndex ] . setSliceHeader ( pcSliceHeader, FRAME ) );
if( m_uiPaff )
{
ROFRS ( ( pcSliceHeader = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ), Err::m_nERR );
RNOK ( m_pacControlData[ uiIndex ] . setSliceHeader ( pcSliceHeader, BOT_FIELD ) );
}
MbDataCtrl* pcMbDataCtrlEL = 0;
ROFS ( ( pcMbDataCtrlEL = new MbDataCtrl () ) );
RNOK ( pcMbDataCtrlEL ->init ( rcSPS ) );
RNOK ( m_pacControlDataEL[ uiIndex ] . setMbDataCtrl ( pcMbDataCtrlEL ) );
RNOK ( m_pacControlDataEL[ uiIndex ] .initFGSData ( m_uiFrameWidthInMb * m_uiFrameHeightInMb ) );
// ICU/ETRI FGS_MOT_USE
SliceHeader* pcSliceHeaderEL = 0;
ROFS ( ( pcSliceHeaderEL = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ) );
RNOK ( m_pacControlDataEL[ uiIndex ] . setSliceHeader ( pcSliceHeaderEL, FRAME ) );
if( m_uiPaff )
{
ROFRS ( ( pcSliceHeader = new SliceHeader ( *m_pcSPS, bLowPass ? *m_pcPPSLP : *m_pcPPSHP ) ), Err::m_nERR );
RNOK ( m_pacControlDataEL[ uiIndex ] . setSliceHeader ( pcSliceHeader, BOT_FIELD ) );
}
if( m_uiClosedLoopMode == 2 )
{
RNOK( m_pacControlData[ uiIndex ] .initBQData ( m_uiFrameWidthInMb * m_uiFrameHeightInMb ) );
// ICU/ETRI FGS_MOT_USE
RNOK( m_pacControlDataEL[ uiIndex ] .initBQData ( m_uiFrameWidthInMb * m_uiFrameHeightInMb ) );
}
m_pacControlData[ uiIndex ].getMbDataCtrl()->initFgsBQData(m_uiFrameWidthInMb * m_uiFrameHeightInMb);
m_pacControlDataEL[ uiIndex ].getMbDataCtrl()->initFgsBQData(m_uiFrameWidthInMb * m_uiFrameHeightInMb);
}
ROFS ( ( m_pcBaseLayerCtrl = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrl ->init ( rcSPS ) );
ROFS ( ( m_pcBaseLayerCtrlField = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrlField ->init ( rcSPS ) );
ROFS ( ( m_pcBaseLayerCtrlEL = new MbDataCtrl() ) );
RNOK ( m_pcBaseLayerCtrlEL ->init ( rcSPS ) );
//========== CREATE UPDATE WEIGHTS ARRAY and WRITE BUFFER ==========
UInt uiNum4x4Blocks = m_uiFrameWidthInMb * m_uiFrameHeightInMb * 4 * 4;
m_uiWriteBufferSize = 3 * ( uiNum4x4Blocks * 4 * 4 );
ROFS( ( m_pucWriteBuffer = new UChar [ m_uiWriteBufferSize ] ) );
ROT ( m_cDownConvert .init ( m_uiFrameWidthInMb<<4, m_uiFrameHeightInMb<<4 ) );
RNOK( m_pcRQFGSEncoder ->initSPS( rcSPS ) );
//S051{
ROFRS( m_auiFrameBits = new UInt[m_uiTotalFrame], Err::m_nERR );
memset( m_auiFrameBits,0,sizeof(UInt)*m_uiTotalFrame);
if(m_bEncSIP)
{
FILE* file=fopen(m_cInSIPFileName.c_str(),"rt");
if(file==NULL)
{
printf("\nCan't open SIP file %s",m_cInSIPFileName.c_str());
return Err::m_nOK;
}
while(!feof(file))
{
UInt tmp;
fscanf(file,"%d",&tmp);
m_cPocList.push_back(tmp);
}
fclose(file);
}
//S051}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -