📄 encodercodingparameter.h
字号:
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 );
//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("AVCMode", &m_uiAVCmode, 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-T073 {
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("NestingSEI", &m_uiNestingSEIEnable, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("SceneInfo", &m_uiSceneInfoEnable, 0 );
//JVT-T073 }
//JVT-S036 lsj start //bug-fix suffix{{
//PreAndSuffixUnitEnable shall always be on in SVC contexts (i.e. when there are FGS/CGS/spatial enhancement layers)
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("PreAndSuffixUnitEnable", &m_uiPreAndSuffixUnitEnable, 1 ); //prefix unit
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MMCOBaseEnable", &m_uiMMCOBaseEnable, 1 );
//JVT-S036 lsj end //bug-fix suffix}}
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("CgsSnrRefinement", &m_uiCGSSNRRefinementFlag, 0 ); //JVT-T054
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("TLNestingFlag", &m_uiTlevelNestingFlag, 0 ); //JVT-U085
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("TLPicIdxEnable", &m_uiTl0PicIdxPresentFlag, 0 ); //JVT-U116
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("RCDOBlockSizes", &m_uiRCDOBlockSizes, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("RCDOMotionCompensationY", &m_uiRCDOMotionCompensationY, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("RCDOMotionCompensationC", &m_uiRCDOMotionCompensationC, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("RCDODeblocking", &m_uiRCDODeblocking, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("4TapMotionCompensationY", &m_ui4TapMotionCompensationY, 0 ); // V090
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("EncodeKeyPictures", &m_uiEncodeKeyPictures, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MGSControl", &m_uiMGSKeyPictureControl, 0 );
m_pEncoderLines[uiParLnCount++] = new EncoderConfigLineUInt("MGSKeyPicMotRef", &m_uiMGSKeyPictureMotionRefinement, 1 );
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_uiAVCmode )
{
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 );
//JVT-T054{
UInt uiPrevLayer = 0;
Double dPrevTemp = 0.0;
UInt uiPrevWidth = 0;
UInt uiPrevHeight = 0;
UInt uiLayerTemp = 0;
UInt uiQualityLevelTemp = 0;
UInt uiLastLayer = 0;
UInt uiMaxLayer = 0;
UInt uiMaxQualityLevel = 0;
//JVT-T054}
Bool bInterlaced = false;
UInt ui = 0;
for( ui = 0; ui < m_uiNumberOfLayers; ui++ )
{
getLayerParameters(ui).setLayerId(ui);
RNOK( xReadLayerFromFile( acLayerConfigName[ui], getLayerParameters(ui) ) );
//TMM_INTERLACE{
if ( getLayerParameters(ui).m_uiMbAff || getLayerParameters(ui).m_uiPaff )
bInterlaced = true;
//TMM_INTERLACE}
//JVT-T054{
if(m_uiCGSSNRRefinementFlag)
{
if(ui == 0)
{
uiPrevLayer = ui;
dPrevTemp = getLayerParameters(ui).getOutputFrameRate();
uiPrevWidth = getLayerParameters(ui).getFrameWidth();
uiPrevHeight = getLayerParameters(ui).getFrameHeight();
getLayerParameters(ui).setLayerCGSSNR(ui);
getLayerParameters(ui).setQualityLevelCGSSNR(0);
uiLastLayer = uiPrevLayer;
getLayerParameters(ui).setBaseLayerCGSSNR( MSYS_UINT_MAX );
getLayerParameters(ui).setBaseQualityLevelCGSSNR( 0 );
}
else
{
if( dPrevTemp == getLayerParameters(ui).getOutputFrameRate() &&
uiPrevWidth == getLayerParameters(ui).getFrameWidth() &&
uiPrevHeight == getLayerParameters(ui).getFrameHeight())
{
// layer can be considered as a CGS refinement
uiLayerTemp = getLayerParameters(ui-1).getLayerCGSSNR();
getLayerParameters(ui).setLayerCGSSNR(uiLayerTemp);
uiQualityLevelTemp = getLayerParameters(ui-1).getQualityLevelCGSSNR();
getLayerParameters(ui).setQualityLevelCGSSNR(uiQualityLevelTemp+1);
getLayerParameters(ui).setBaseLayerCGSSNR( uiLayerTemp );
getLayerParameters(ui).setBaseQualityLevelCGSSNR( uiQualityLevelTemp );
if(uiMaxQualityLevel < uiQualityLevelTemp+1)
uiMaxQualityLevel = uiQualityLevelTemp+1;
}
else
{
//layer is not a refinement from previous CGS layer
uiLastLayer++;
uiPrevLayer = uiLastLayer;
dPrevTemp = getLayerParameters(ui).getOutputFrameRate();
uiPrevWidth = getLayerParameters(ui).getFrameWidth();
uiPrevHeight = getLayerParameters(ui).getFrameHeight();
getLayerParameters(ui).setLayerCGSSNR(uiLastLayer);
getLayerParameters(ui).setQualityLevelCGSSNR(0);
uiLayerTemp = getLayerParameters(ui-1).getLayerCGSSNR();
uiQualityLevelTemp = getLayerParameters(ui-1).getQualityLevelCGSSNR();
getLayerParameters(ui).setBaseLayerCGSSNR( uiLayerTemp );
getLayerParameters(ui).setBaseQualityLevelCGSSNR( uiQualityLevelTemp );
if(uiMaxLayer < uiLastLayer)
uiMaxLayer = uiLastLayer;
}
}
}
else
{
getLayerParameters(ui).setLayerCGSSNR(ui);
getLayerParameters(ui).setQualityLevelCGSSNR(0);
}
m_uiMaxLayerCGSSNR = uiMaxLayer;
m_uiMaxQualityLevelCGSSNR = uiMaxQualityLevel;
//JVT-T054}
// 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;
curr->m_iInWidth = prev->m_iGlobWidth; //TMM
curr->m_iInHeight = prev->m_iGlobHeight; //TMM
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 }
}
//TMM_INTERLACE{
for( ui = 0; ui < m_uiNumberOfLayers; ui++ )
getResizeParameters(ui)->m_bInterlaced = bInterlaced;
//TMM_INTERLACE}
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 );
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineStr ("InputFile", &cInputFilename, "test.yuv");
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineStr ("ReconFile", &cOutputFilename, "rec.yuv" );
m_pLayerLines[uiParLnCount++] = new EncoderConfigLineUInt("MbAff", &(rcLayer.m_uiMbAff), 0 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -