gopencoder.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,842 行 · 第 1/5 页
CPP
1,842 行
pcLayerParameters->getAdaptiveRefFGSWeights(
m_uiBaseWeightZeroBaseBlock, m_uiBaseWeightZeroBaseCoeff);
m_uiFgsEncStructureFlag = pcLayerParameters->getFgsEncStructureFlag();
m_uiLayerId = pcLayerParameters->getLayerId ();
m_uiBaseLayerId = pcLayerParameters->getBaseLayerId ();
m_uiBaseQualityLevel = pcLayerParameters->getBaseQualityLevel ();
// JVT-Q065 EIDR{
m_iIDRPeriod = pcLayerParameters->getIDRPeriod ();
m_bBLSkipEnable = pcLayerParameters->getBLSkipEnable ();
// JVT-Q065 EIDR}
m_bExtendedPriorityId = pcCodingParameter->getExtendedPriorityId();
m_uiQualityLevelForPrediction = 3;
if( pcCodingParameter->getNumberOfLayers() > pcLayerParameters->getLayerId() + 1 )
{
m_uiQualityLevelForPrediction = (pcLayerParameters + 1)->getBaseQualityLevel();
if( m_uiQualityLevelForPrediction > 3)
m_uiQualityLevelForPrediction = 3;
}
m_uiDecompositionStages = pcLayerParameters->getDecompositionStages ();
m_uiTemporalResolution = pcLayerParameters->getTemporalResolution ();
m_uiNotCodedMCTFStages = pcLayerParameters->getNotCodedMCTFStages ();
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_uiClosedLoopMode = pcLayerParameters->getClosedLoop ();
m_bH264AVCCompatible = pcCodingParameter->getBaseLayerMode () > 0 && m_uiLayerId == 0;
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_uiLayerId == 0;
//JVT-R057 LA-RDO{
if(pcCodingParameter->getLARDOEnable()!=0)
{
static UInt auiPLR[5];
static UInt aauiSize[5][2];
static Double dRatio[5][2];
auiPLR[m_uiLayerId] = pcLayerParameters->getPLR ();
m_bLARDOEnable = pcCodingParameter->getLARDOEnable()==0? false:true;
m_bLARDOEnable = m_bLARDOEnable&&((Int)pcLayerParameters->getNumFGSLayers()==0);
aauiSize[m_uiLayerId][0] =pcLayerParameters->getFrameWidth();
aauiSize[m_uiLayerId][1] =pcLayerParameters->getFrameHeight();
if(m_uiLayerId==0||pcLayerParameters->getBaseLayerId()==MSYS_UINT_MAX)
{
dRatio[m_uiLayerId][0]=1;
dRatio[m_uiLayerId][1]=1;
}
else
{
dRatio[m_uiLayerId][0]=(Double)aauiSize[m_uiLayerId][0]/aauiSize[pcLayerParameters->getBaseLayerId()][0];
dRatio[m_uiLayerId][1]=(Double)aauiSize[m_uiLayerId][1]/aauiSize[pcLayerParameters->getBaseLayerId()][1];
}
m_pcSliceEncoder->getMbEncoder()->setRatio(dRatio);
m_pcSliceEncoder->getMbEncoder()->setPLR(auiPLR);
pcLayerParameters->setContrainedIntraForLP();
}
//JVT-R057 LA-RDO}
m_uiSuffixUnitEnable = pcCodingParameter->getSuffixUnitEnable();//JVT-S036 lsj
m_uiMMCOBaseEnable = pcCodingParameter->getMMCOBaseEnable(); //JVT-S036 lsj
#if MULTIPLE_LOOP_DECODING
m_bCompletelyDecodeLayer = ( pcCodingParameter->getNumberOfLayers() > m_uiLayerId+1 &&
pcCodingParameter->getLayerParameters( m_uiLayerId+1).getInterLayerPredictionMode() > 0 &&
pcCodingParameter->getLayerParameters( m_uiLayerId+1).getDecodingLoops() > 1 );
m_bHighestLayer = ( pcCodingParameter->getNumberOfLayers() == m_uiLayerId + 1 );
#endif
// TMM_ESS
m_pcResizeParameters = pcLayerParameters->getResizeParameters();
for( UInt uiStage = 0; uiStage < MAX_DSTAGES; uiStage++ )
{
m_adBaseQpLambdaMotion[uiStage] = pcLayerParameters->getQpModeDecision( uiStage );
}
m_dBaseQpLambdaMotionLP = pcLayerParameters->getQpModeDecisionLP ();
m_dBaseQPResidual = pcLayerParameters->getBaseQpResidual ();
m_dNumFGSLayers = pcLayerParameters->getNumFGSLayers ();
m_uiFilterIdc = pcCodingParameter->getLoopFilterParams ().getFilterIdc ();
m_iAlphaOffset = pcCodingParameter->getLoopFilterParams ().getAlphaOffset ();
m_iBetaOffset = pcCodingParameter->getLoopFilterParams ().getBetaOffset ();
m_bLoadMotionInfo = pcLayerParameters->getMotionInfoMode () == 1;
m_bSaveMotionInfo = pcLayerParameters->getMotionInfoMode () == 2;
m_pMotionInfoFile = 0;
m_uiFGSMotionMode = pcLayerParameters->getFGSMotionMode();
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_auiCurrGOPBitsBase[ui] = 0;
m_auiCurrGOPBitsFGS [ui] = 0;
m_adSeqBitsBase [ui] = 0.0;
m_adSeqBitsFGS [ui] = 0.0;
m_adPSNRSumY [ui] = 0.0;
m_adPSNRSumU [ui] = 0.0;
m_adPSNRSumV [ui] = 0.0;
}
for( ui = 0; ui < MAX_SCALABLE_LAYERS; ui++ )
{
m_auiCurrGOPBits [ui] = 0;
m_adSeqBits [ui] = 0.0;
}
//----- FGS -----
m_uiFGSMode = pcLayerParameters->getFGSMode();
m_pFGSFile = 0;
//FIX_FRAG_CAVLC
m_bUseDiscardableUnit = pcLayerParameters->getUseDiscardable();
if(m_bUseDiscardableUnit)
{
m_pFGSFile = ::fopen( pcLayerParameters->getFGSFilename().c_str(), "rt" );
if (!m_pFGSFile)
fprintf( stderr, "Error: FGS failed '%s' couldn't be Opened\n",pcLayerParameters->getFGSFilename().c_str());
ROF( m_pFGSFile );
}
else
{
//~FIX_FRAG_CAVLC
if( m_uiFGSMode == 1 )
{
m_pFGSFile = ::fopen( pcLayerParameters->getFGSFilename().c_str(), "wt" );
if (!m_pFGSFile)
fprintf( stderr, "Error: FGS failed '%s' couldn't be created\n",pcLayerParameters->getFGSFilename().c_str());
ROF( m_pFGSFile );
}
if( m_uiFGSMode == 2 )
{
m_pFGSFile = ::fopen( pcLayerParameters->getFGSFilename().c_str(), "rt" );
if (!m_pFGSFile)
fprintf( stderr, "Error: FGS failed '%s' couldn't be Opened\n",pcLayerParameters->getFGSFilename().c_str());
ROF( m_pFGSFile );
}
} //FIX_FRAG_CAVLC
m_dFGSBitRateFactor = 0.0;
m_dFGSRoundingOffset = 0.0;
m_iLastFGSError = 0;
m_uiNotYetConsideredBaseLayerBits = 0;
// analyse and set parameters
//JVT-P031
m_bUseDiscardableUnit = pcLayerParameters->getUseDiscardable();
m_dPredFGSCutFactor = 0.0;
m_dPredFGSRoundingOffset = 0.0;
m_iPredLastFGSError = 0;
if(m_bUseDiscardableUnit || m_uiFGSMode == 2)
//JVT-P031
{
Char acLine [1000];
UInt uiNumFrames = 0;
UInt uiBaseBits = 0;
UInt uiSumBaseBits = 0;
UInt uiSumFGSBits [MAX_FGS_LAYERS] = { 0, 0, 0 };
UInt uiFGSBits [MAX_FGS_LAYERS] = { 0, 0, 0 };
UInt uiDummy;
for( ; ; )
{
Int i, c;
for( i = 0; ( c = fgetc(m_pFGSFile), ( c != '\n' && c != EOF ) ); acLine[i++] = c );
acLine[i] = '\0';
if( feof(m_pFGSFile) )
{
break;
}
sscanf( acLine, "%d %d %d %d %d %d %d ",
&uiBaseBits, &uiDummy, &uiFGSBits[0], &uiDummy, &uiFGSBits[1], &uiDummy, &uiFGSBits[2] );
uiNumFrames ++;
uiSumBaseBits += uiBaseBits;
uiSumFGSBits[0] += uiFGSBits[0];
uiSumFGSBits[1] += uiFGSBits[1];
uiSumFGSBits[2] += uiFGSBits[2];
}
ROF( uiNumFrames );
//FIX_FRAG_CAVLC
if(m_uiFGSMode == 2)
{
//~FIX_FRAG_CAVLC
Double dTargetBits = 1000.0 * pcLayerParameters->getFGSRate() * (Double)uiNumFrames / pcLayerParameters->getOutputFrameRate();
UInt uiTargetBits = (UInt)floor( dTargetBits + 0.5 );
UInt uiSumAllBits = uiSumBaseBits + uiSumFGSBits[0] + uiSumFGSBits[1] + uiSumFGSBits[2];
if( uiTargetBits <= uiSumBaseBits )
{
ROF( uiTargetBits );
printf("Warning: Layer %d bitrate overflow (only base layer coded)\n", m_uiLayerId );
m_dFGSCutFactor = 0.0;
m_dFGSBitRateFactor = (Double)uiTargetBits / (Double)uiSumBaseBits; // there is a chance that only coding the base layer is not the right thing for closed-loop
m_dNumFGSLayers = 0.0;
}
else if( uiTargetBits >= uiSumAllBits )
{
printf("Warning: Layer %d bitrate underflow (code as much as possible)\n", m_uiLayerId );
m_dFGSCutFactor = 3.0;
m_dFGSBitRateFactor = (Double)uiTargetBits / (Double)uiSumAllBits; // it is possible that not all layers have been coded during the analysis run (e.g. for closed-loop)
m_dNumFGSLayers = 3.0;
for( UInt uiFGSLayer = 0; uiFGSLayer < MAX_FGS_LAYERS; uiFGSLayer++ )
{
if (uiSumFGSBits[uiFGSLayer] == 0)
{
m_dNumFGSLayers = (Double)uiFGSLayer;
break;
}
}
}
else
{
uiTargetBits -= uiSumBaseBits;
for( UInt uiFGSLayer = 0; uiFGSLayer < MAX_FGS_LAYERS; uiFGSLayer++ )
{
if( uiTargetBits < uiSumFGSBits[uiFGSLayer] )
{
m_dFGSCutFactor = (Double)uiFGSLayer + (Double)uiTargetBits / (Double)uiSumFGSBits[uiFGSLayer];
m_dNumFGSLayers = uiFGSLayer + 1;
break;
}
uiTargetBits -= uiSumFGSBits[uiFGSLayer];
}
m_dFGSBitRateFactor = 0.0;
}
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 );
}
//{{Adaptive GOP structure
// --ETRI & KHU
m_uiUseAGS = pcCodingParameter->getUseAGS();
m_uiMaxDecStages = m_uiDecompositionStages; // -- 10.18.2005
if (m_uiUseAGS)
{
m_uiWriteGOPMode = pcCodingParameter->getWriteGOPMode();
if ( m_uiWriteGOPMode )
{
FILE* d_gop;
m_cGOPModeFilename = pcCodingParameter->getGOPModeFile();
d_gop = fopen(pcCodingParameter->getGOPModeFile().c_str(), "w");
fclose(d_gop);
m_uiSelect = NULL;
m_dMSETemp = 0;
m_uiSelectPos = 0;
}
else
{
FILE* d_gop;
d_gop = fopen(pcCodingParameter->getGOPModeFile().c_str(), "rt");
// ROTREPORT( d_gop == NULL, "need \"gop mode\" file\n");
if (d_gop == NULL)
{
printf("need \"gop mode\" file\n");
exit(0);
}
m_bFinish = 0;
UInt temp=0;
int i, j;
int line = 0;
char ch;
while(EOF != (ch = fgetc(d_gop)))
{
if (ch == '\n')
line++;
}
m_uiSelect = new UInt*[line];
for(j = 0; j < line + 1; j++)
{
m_uiSelect[j] = new UInt[8];
for (i = 0; i < 8; i++) {
m_uiSelect[j][i] = 0;
}
}
fseek(d_gop, 0, SEEK_SET);
for(j = 0; j < line; j++)
{
UInt sum = 0;
for(i = 0;sum < (UInt)(1<<(pcLayerParameters->getDecompositionStages())); i++)
{
fscanf(d_gop, "%d ", &temp);
if (temp > 6)
break;
//m_uiSelect[j][i] = temp + m_uiLayerId;
m_uiSelect[j][i] = temp + (pcLayerParameters->getDecompositionStages()
- pcCodingParameter->getLayerParameters(0).getDecompositionStages());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?