encodercodingparameter.h
来自「JVT-S203 contains the JSVM 6 reference s」· C头文件 代码 · 共 1,119 行 · 第 1/4 页
H
1,119 行
printf(" -aip independent parsing for all layers\n");
printf(" -ipars (Layer) (Independent Parsing) [0: off, 1: on]\n");
#endif
printf(" -org (Layer) (original file)\n");
printf(" -rec (Layer) (reconstructed file)\n");
printf(" -ec (Layer) (entropy coding mode)\n");
printf(" -rqp (Layer) (ResidualQP)\n");
printf(" -mqp (Layer) (Stage) (MotionQP)\n");
printf(" -lqp (Layer) (ResidualAndMotionQP)\n");
printf(" -ilpred (Layer) (InterLayerPredictionMode)\n");
printf(" -mfile (Layer) (Mode) (MotionInfoFile)\n");
printf(" -anafgs (Layer) (NumFGSLayers) (File for storing FGS parameters)\n");
printf(" -encfgs (Layer) (bit-rate in kbps) (File with stored FGS parameters)\n");
printf(" -cl (Layer) (ClosedLoopParameter)\n");
printf(" -ds (Layer) (Rate for inter-layer prediction)\n");
printf(" -fgsmot (Layer) (FGSMotionRefinementMode) [0: no, 1: HP only, 2: all]\n");
printf(" -lcupd Update method [0 - original, 1 - low-complexity (default)]\n");
printf(" -bcip Constrained intra prediction for base layer (needed for single-loop) in scripts\n");
printf(" -anaags [1 - mode decision for Adaptive GOP Structure]\n");
//S051{
printf(" -anasip (Layer) (SIP Analysis Mode)[0: persists all inter-predictions, 1: forbids all inter-prediction.] (File for storing bits information)\n");
printf(" -encsip (Layer) (File with stored SIP information)\n");
//S051}
printf(" -h Print Option List \n");
printf("\n");
}
ErrVal EncoderCodingParameter::xReadLine( FILE* hFile, std::string* pacTag )
{
ROF( pacTag );
Int n;
UInt uiTagNum = 0;
Bool bComment = false;
std::string* pcTag = &pacTag[0];
for( n = 0; n < 4; n++ )
{
pacTag[n] = "";
}
for( n = 0; ; n++ )
{
Char cChar = (Char) fgetc( hFile );
ROTRS( cChar == '\n' || feof( hFile ), Err::m_nOK ); // end of line
if ( cChar == '#' )
{
bComment = true;
}
if( ! bComment )
{
if ( cChar == '\t' || cChar == ' ' ) // white space
{
ROTR( uiTagNum == 3, Err::m_nERR );
if( ! pcTag->empty() )
{
uiTagNum++;
pcTag = &pacTag[uiTagNum];
}
}
else
{
*pcTag += cChar;
}
}
}
}
ErrVal EncoderCodingParameter::xReadFromFile( std::string& rcFilename, std::string& rcBitstreamFile )
{
std::string acLayerConfigName[MAX_LAYERS];
std::string acTags[4];
UInt uiLayerCnt = 0;
UInt uiParLnCount = 0;
FILE *f = fopen( rcFilename.c_str(), "r");
if( NULL == f )
{
printf( "failed to open %s parameter file\n", rcFilename.c_str() );
return Err::m_nERR;
}
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineStr ("OutputFile", &rcBitstreamFile, "test.264");
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("FrameRate", &m_dMaximumFrameRate, 60.0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("MaxDelay", &m_dMaximumDelay, 1200.0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("FramesToBeEncoded", &m_uiTotalFrames, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("GOPSize", &m_uiGOPSize, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("IntraPeriod", &m_uiIntraPeriod, MSYS_UINT_MAX );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("NumberReferenceFrames", &m_uiNumRefFrames, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("BaseLayerMode", &m_uiBaseLayerMode, 3 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("NumLayers", &m_uiNumberOfLayers, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SearchRange", &(m_cMotionVectorSearchParams.m_uiSearchRange), 96);
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("BiPredIter", &(m_cMotionVectorSearchParams.m_uiNumMaxIter), 4 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("IterSearchRange", &(m_cMotionVectorSearchParams.m_uiIterSearchRange), 8 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("LoopFilterDisable", &(m_cLoopFilterParams.m_uiFilterIdc), 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt ("LoopFilterAlphaC0Offset", (Int*)&(m_cLoopFilterParams.m_iAlphaOffset), 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt ("LoopFilterBetaOffset", (Int*)&(m_cLoopFilterParams.m_iBetaOffset), 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt ("SearchMode", (Int*)&(m_cMotionVectorSearchParams.m_eSearchMode), 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt ("SearchFuncFullPel", (Int*)&(m_cMotionVectorSearchParams.m_eFullPelDFunc), 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt ("SearchFuncSubPel", (Int*)&(m_cMotionVectorSearchParams.m_eSubPelDFunc), 0 );
//{{Adaptive GOP structure
// --ETRI & KHU
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("UseAdaptiveGOP", &m_uiUseAGS, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("AGSModeDecision", &m_uiWriteGOPMode, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineStr ("AGSGOPModeFile", &m_cGOPModeFilename, "ags.dat" );
//}}Adaptive GOP structure
//TMM_WP
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("WeightedPrediction", &m_uiIPMode, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("WeightedBiprediction", &m_uiBMode, 0 );
//TMM_WP
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineInt("NonRequiredEnable", &m_bNonRequiredEnable, 0 ); //NonRequired JVT-Q066
std::string cInputFile, cReconFile;
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MVCMode", &m_uiMVCmode, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineStr ("InputFile", &cInputFile, "in.yuv");
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineStr ("ReconFile", &cReconFile, "rec.yuv");
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SourceWidth", &m_uiFrameWidth, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SourceHeight", &m_uiFrameHeight, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SymbolMode", &m_uiSymbolMode, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("FRExt", &m_ui8x8Mode, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("BasisQP", &m_dBasisQp, 26 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("DPBSize", &m_uiDPBSize, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("NumRefFrames", &m_uiNumDPBRefFrames, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("Log2MaxFrameNum", &m_uiLog2MaxFrameNum, 4 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("Log2MaxPocLsb", &m_uiLog2MaxPocLsb, 4 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineStr ("SequenceFormatString", &m_cSequenceFormatString, "A0*n{P0}" );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer0Quant", &m_adDeltaQpLayer[0], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer1Quant", &m_adDeltaQpLayer[1], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer2Quant", &m_adDeltaQpLayer[2], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer3Quant", &m_adDeltaQpLayer[3], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer4Quant", &m_adDeltaQpLayer[4], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineDbl ("DeltaLayer5Quant", &m_adDeltaQpLayer[5], 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MaxRefIdxActiveBL0", &m_uiMaxRefIdxActiveBL0, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MaxRefIdxActiveBL1", &m_uiMaxRefIdxActiveBL1, 1 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MaxRefIdxActiveP", &m_uiMaxRefIdxActiveP, 1 );
//JVT-R057 LA-RDO{
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("LARDO", &m_uiLARDOEnable, 0 );
//JVT-R057 LA-RDO}
//JVT-S036 lsj start
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SuffixUnitEnable", &m_uiSuffixUnitEnable, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MMCOBaseEnable", &m_uiMMCOBaseEnable, 0 );
//JVT-S036 lsj end
m_pEncoderLines[uiParLnCount] = NULL;
while (!feof(f))
{
RNOK( xReadLine( f, acTags ) );
if ( acTags[0].empty() )
{
continue;
}
for (UInt ui=0; m_pEncoderLines[ui] != NULL; ui++)
{
if( acTags[0] == m_pEncoderLines[ui]->getTag() )
{
m_pEncoderLines[ui]->setVar( acTags[1] );
break;
}
}
if( acTags[0] == "LayerCfg" )
{
acLayerConfigName[uiLayerCnt++] = acTags[1];
continue;
}
}
uiParLnCount = 0;
while (m_pEncoderLines[uiParLnCount] != NULL)
{
delete m_pEncoderLines[uiParLnCount];
m_pEncoderLines[uiParLnCount] = NULL;
uiParLnCount++;
}
if( m_uiMVCmode )
{
m_uiNumberOfLayers = 0;
getLayerParameters(0).setInputFilename ( (Char*)cInputFile.c_str() );
getLayerParameters(0).setOutputFilename ( (Char*)cReconFile.c_str() );
getLayerParameters(0).setFrameWidth ( m_uiFrameWidth );
getLayerParameters(0).setFrameHeight ( m_uiFrameHeight );
fclose( f );
return Err::m_nOK;
}
if ( uiLayerCnt != m_uiNumberOfLayers )
{
fprintf(stderr, "Could not locate all layer config files: check config file syntax\n");
AF();
}
fclose( f );
for( UInt ui = 0; ui < m_uiNumberOfLayers; ui++ )
{
getLayerParameters(ui).setLayerId(ui);
RNOK( xReadLayerFromFile( acLayerConfigName[ui], getLayerParameters(ui) ) );
// TMM_ESS {
ResizeParameters * curr;
curr = getResizeParameters(ui);
// JVT-Q065 EIDR{
if(ui > 0 && getLayerParameters(ui-1).getIDRPeriod() == getLayerParameters(ui).getIDRPeriod())
{
getLayerParameters(ui).setBLSkipEnable(true);
}
// JVT-Q065 EIDR}
// HS: set base layer id
UInt uiBaseLayerId = getLayerParameters(ui).getBaseLayerId();
if( ui && uiBaseLayerId == MSYS_UINT_MAX )
{
uiBaseLayerId = ui - 1; // default value
}
getLayerParameters(ui).setBaseLayerId(uiBaseLayerId);
// HS: set base layer id
if (ui>0)
{
ResizeParameters * prev = getResizeParameters(uiBaseLayerId); // HS: use "real" base layer
curr->m_iInWidth = prev->m_iOutWidth;
curr->m_iInHeight = prev->m_iOutHeight;
bool is_crop_aligned = (curr->m_iPosX%16 == 0) && (curr->m_iPosY%16 == 0);
if ((curr->m_iInWidth == curr->m_iOutWidth) && (curr->m_iInHeight == curr->m_iOutHeight) &&
is_crop_aligned && (curr->m_iExtendedSpatialScalability < ESS_PICT) )
curr->m_iSpatialScalabilityType = SST_RATIO_1;
else if ((curr->m_iInWidth*2 == curr->m_iOutWidth) && (curr->m_iInHeight*2 == curr->m_iOutHeight) &&
is_crop_aligned && (curr->m_iExtendedSpatialScalability < ESS_PICT) )
curr->m_iSpatialScalabilityType = SST_RATIO_2;
else
{
curr->m_iSpatialScalabilityType = SST_RATIO_X;
if ( curr->m_iExtendedSpatialScalability == ESS_NONE )
curr->m_iExtendedSpatialScalability = ESS_SEQ;
}
}
else
{
curr->m_iSpatialScalabilityType = SST_RATIO_1;
curr->m_iExtendedSpatialScalability = ESS_NONE;
}
// TMM_ESS }
}
return Err::m_nOK;
}
ErrVal EncoderCodingParameter::xReadLayerFromFile ( std::string& rcFilename,
h264::LayerParameters& rcLayer )
{
std::string acTags[4];
std::string cInputFilename, cOutputFilename, cMotionFilename, cESSFilename;
//S051{
std::string cEncSIPFilename;
//S051}
UInt uiParLnCount = 0;
FILE *f = fopen( rcFilename.c_str(), "r");
if( NULL == f )
{
printf( "failed to open %s layer config file\n", rcFilename.c_str() );
return Err::m_nERR;
}
//--ICU/ETRI FMO Implementation
UInt bSliceGroupChangeDirection_flag=0;
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineUInt("SourceWidth", &(rcLayer.m_uiFrameWidth), 176 );
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineUInt("SourceHeight", &(rcLayer.m_uiFrameHeight), 352 );
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineDbl ("FrameRateIn", &(rcLayer.m_dInputFrameRate), 30 );
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineDbl ("FrameRateOut", &(rcLayer.m_dOutputFrameRate), 30 );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?