You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1791 lines
64 KiB

7 months ago
//-----------------------------------------------------------------------------
// COPYRIGHT (C) 2020 CHIPS&MEDIA INC. ALL RIGHTS RESERVED
//
// This file is distributed under BSD 3 clause and LGPL2.1 (dual license)
// SPDX License Identifier: BSD-3-Clause
// SPDX License Identifier: LGPL-2.1-only
//
// The entire notice above must be reproduced on all authorized copies.
//
// Description :
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <errno.h>
#include "vpuapi.h"
#include "vpuapifunc.h"
#include "main_helper.h"
#include <string.h>
const WaveCfgInfo waveCfgInfo[] = {
//name min max default
{"InputFile", 0, 0, 0}, //0
{"SourceWidth", 0, W5_MAX_ENC_PIC_WIDTH, 0},
{"SourceHeight", 0, W5_MAX_ENC_PIC_HEIGHT, 0},
{"InputBitDepth", 8, 10, 8},
{"FrameRate", 0, 480, 0},
{"FrameSkip", 0, INT_MAX, 0},
{"FramesToBeEncoded", 0, INT_MAX, 0},
{"IntraPeriod", 0, 2047, 0},
{"DecodingRefreshType", 0, 2, 1},
{"GOPSize", 1, MAX_GOP_NUM, 1},
{"IntraNxN", 0, 1, 1},// 10
{"EnCu8x8", 0, 1, 1},
{"EnCu16x16", 0, 1, 1},
{"EnCu32x32", 0, 1, 1},
{"IntraTransSkip", 0, 2, 1},
{"ConstrainedIntraPred", 0, 1, 0},
{"IntraCtuRefreshMode", 0, 4, 0},
{"IntraCtuRefreshArg", 0, UI16_MAX, 0},
{"MaxNumMerge", 0, 2, 2},
{"EnTemporalMVP", 0, 1, 1},
{"ScalingList", 0, 2, 0}, // 20
{"IndeSliceMode", 0, 1, 0},
{"IndeSliceArg", 0, UI16_MAX, 0},
{"DeSliceMode", 0, 2, 0},
{"DeSliceArg", 0, UI16_MAX, 0},
{"EnDBK", 0, 1, 1},
{"EnSAO", 0, 1, 1},
{"LFCrossSliceBoundaryFlag", 0, 1, 1},
{"BetaOffsetDiv2", -6, 6, 0},
{"TcOffsetDiv2", -6, 6, 0},
{"WaveFrontSynchro", 0, 1, 0}, // 30
{"LosslessCoding", 0, 1, 0},
{"UsePresetEncTools", 0, 3, 0},
{"GopPreset", 0, 16, 0},
{"RateControl", 0, 1, 0},
{"EncBitrate", 0, 700000000, 0},
{"InitialDelay", 10, 3000, 0},
{"EnHvsQp", 0, 1, 1},
{"CULevelRateControl", 0, 1, 1},
{"ConfWindSizeTop", 0, W5_MAX_ENC_PIC_HEIGHT, 0},
{"ConfWindSizeBot", 0, W5_MAX_ENC_PIC_HEIGHT, 0}, //40
{"ConfWindSizeRight", 0, W5_MAX_ENC_PIC_WIDTH, 0},
{"ConfWindSizeLeft", 0, W5_MAX_ENC_PIC_WIDTH, 0},
{"HvsQpScaleDiv2", 0, 4, 2},
{"MinQp", 0, 63, 8},
{"MaxQp", 0, 63, 51},
{"MaxDeltaQp", 0, 12, 10},
{"QP", 0, 63, 30},
{"BitAllocMode", 0, 2, 0},
{"FixedBitRatio%d", 1, 255, 1},
{"InternalBitDepth", 0, 10, 0}, //50
{"EnUserDataSei", 0, 1, 0},
{"UserDataEncTiming", 0, 1, 0},
{"UserDataSize", 0, (1<<24) - 1, 1},
{"UserDataPos", 0, 1, 0},
{"EnRoi", 0, 1, 0},
{"NumUnitsInTick", 0, INT_MAX, 0},
{"TimeScale", 0, INT_MAX, 0},
{"NumTicksPocDiffOne", 0, INT_MAX, 0},
{"EncAUD", 0, 1, 0},
{"EncEOS", 0, 1, 0}, //60
{"EncEOB", 0, 1, 0},
{"CbQpOffset", -12, 12, 0},
{"CrQpOffset", -12, 12, 0},
{"RcInitialQp", -1, 63, 63},
{"EnNoiseReductionY", 0, 1, 0},
{"EnNoiseReductionCb", 0, 1, 0},
{"EnNoiseReductionCr", 0, 1, 0},
{"EnNoiseEst", 0, 1, 1},
{"NoiseSigmaY", 0, 255, 0},
{"NoiseSigmaCb", 0, 255, 0}, //70
{"NoiseSigmaCr", 0, 255, 0},
{"IntraNoiseWeightY", 0, 31, 7},
{"IntraNoiseWeightCb", 0, 31, 7},
{"IntraNoiseWeightCr", 0, 31, 7},
{"InterNoiseWeightY", 0, 31, 4},
{"InterNoiseWeightCb", 0, 31, 4},
{"InterNoiseWeightCr", 0, 31, 4},
{"UseAsLongTermRefPeriod", 0, INT_MAX, 0},
{"RefLongTermPeriod", 0, INT_MAX, 0},
{"CropXPos", 0, W5_MAX_ENC_PIC_WIDTH, 0}, //80
{"CropYPos", 0, W5_MAX_ENC_PIC_HEIGHT, 0},
{"CropXSize", 0, W5_MAX_ENC_PIC_WIDTH, 0},
{"CropYSize", 0, W5_MAX_ENC_PIC_HEIGHT, 0},
{"BitstreamFile", 0, 0, 0},
{"EnCustomVpsHeader", 0, 1, 0},
{"EnCustomSpsHeader", 0, 1, 0},
{"EnCustomPpsHeader", 0, 1, 0},
{"CustomVpsPsId", 0, 15, 0},
{"CustomSpsPsId", 0, 15, 0},
{"CustomSpsActiveVpsId", 0, 15, 0}, //90
{"CustomPpsActiveSpsId", 0, 15, 0},
{"CustomVpsIntFlag", 0, 1, 1},
{"CustomVpsAvailFlag", 0, 1, 1},
{"CustomVpsMaxLayerMinus1", 0, 62, 0},
{"CustomVpsMaxSubLayerMinus1", 0, 6, 0},
{"CustomVpsTempIdNestFlag", 0, 1, 0},
{"CustomVpsMaxLayerId", 0, 31, 0},
{"CustomVpsNumLayerSetMinus1", 0, 2, 0},
{"CustomVpsExtFlag", 0, 1, 0},
{"CustomVpsExtDataFlag", 0, 1, 0}, //100
{"CustomVpsSubOrderInfoFlag", 0, 1, 0},
{"CustomSpsSubOrderInfoFlag", 0, 1, 0},
{"CustomVpsLayerId0", 0, INT_MAX, 0},
{"CustomVpsLayerId1", 0, INT_MAX, 0},
{"CustomSpsLog2MaxPocMinus4", 0, 12, 4},
// newly added for WAVE ENCODER
{"EncMonochrome", 0, 1, 0},
{"StrongIntraSmoothing", 0, 1, 1},
{"RoiAvgQP", 0, 63, 0},
{"WeightedPred", 0, 3, 0},
{"EnBgDetect", 0, 1, 0}, // 110
{"BgThDiff", 0, 255, 8},
{"BgThMeanDiff", 0, 255, 1},
{"BgLambdaQp", 0, 63, 32},
{"BgDeltaQp", -16, 15, 3},
{"TileNumColumns", 1, 6, 1},
{"TileNumRows", 1, 6, 1},
{"TileUniformSpace", 0, 1, 1},
{"EnLambdaMap", 0, 1, 0},
{"EnCustomLambda", 0, 1, 0},
{"EnCustomMD", 0, 1, 0}, //120
{"PU04DeltaRate", 0, 255, 0},
{"PU08DeltaRate", 0, 255, 0},
{"PU16DeltaRate", 0, 255, 0},
{"PU32DeltaRate", 0, 255, 0},
{"PU04IntraPlanarDeltaRate", 0, 255, 0},
{"PU04IntraDcDeltaRate", 0, 255, 0},
{"PU04IntraAngleDeltaRate", 0, 255, 0},
{"PU08IntraPlanarDeltaRate", 0, 255, 0},
{"PU08IntraDcDeltaRate", 0, 255, 0},
{"PU08IntraAngleDeltaRate", 0, 255, 0}, //130
{"PU16IntraPlanarDeltaRate", 0, 255, 0},
{"PU16IntraDcDeltaRate", 0, 255, 0},
{"PU16IntraAngleDeltaRate", 0, 255, 0},
{"PU32IntraPlanarDeltaRate", 0, 255, 0},
{"PU32IntraDcDeltaRate", 0, 255, 0},
{"PU32IntraAngleDeltaRate", 0, 255, 0},
{"CU08IntraDeltaRate", 0, 255, 0},
{"CU08InterDeltaRate", 0, 255, 0},
{"CU08MergeDeltaRate", 0, 255, 0},
{"CU16IntraDeltaRate", 0, 255, 0}, //140
{"CU16InterDeltaRate", 0, 255, 0},
{"CU16MergeDeltaRate", 0, 255, 0},
{"CU32IntraDeltaRate", 0, 255, 0},
{"CU32InterDeltaRate", 0, 255, 0},
{"CU32MergeDeltaRate", 0, 255, 0},
{"DisableCoefClear", 0, 1, 0},
{"EnModeMap", 0, 3, 0},
{"ForcePicSkipStart", -1, INT_MAX, -1},
{"ForcePicSkipEnd", -1, INT_MAX, -1},
{"ForceCoefDropStart", -1, INT_MAX, -1}, //150
{"ForceCoefDropEnd", -1, INT_MAX, -1},
{"EnUserFilterLevel", 0, 1, 0},
{"LfFilterLevel", -63, 63, 0},
{"SharpnessLevel", 0, 7, 0},
{"LfRefDeltaIntra", -63, 63, 1},
{"LfRefDeltaRef0", -63, 63, 0},
{"LfRefDeltaRef1", -63, 63, -1},
{"LfModeDelta", -63, 63, 0},
{"EnSVC", 0, 1, 0},
{"YDcQpOffset", -3, 3, 0}, // 160
{"CbCrDcQpOffset", -3, 3, 0},
{"CbCrAcQpOffset", -3, 3, 0},
{"StillPictureProfile", 0, 1, 0},
{"SvcMode", 0, 1, 1},
{"VbvBufferSize", 10, 3000, 3000},
{"EncBitrateBL", 0, 700000000, 0},
// newly added for H.264 on WAVE5
{"IdrPeriod", 0, 2047, 0},
{"RdoSkip", 0, 1, 1},
{"LambdaScaling", 0, 1, 1},
{"Transform8x8", 0, 1, 1},
{"SliceMode", 0, 1, 0}, //170
{"SliceArg", 0, INT_MAX, 0},
{"IntraMbRefreshMode", 0, 3, 0},
{"IntraMbRefreshArg", 1, INT_MAX, 1},
{"MBLevelRateControl", 0, 1, 0},
{"CABAC", 0, 1, 1},
{"RoiQpMapFile", 0, 1, 1},
{"S2fmeOff", 0, 1, 0},
{"RcWeightParaCtrl", 1, 31, 16},
{"RcWeightBufCtrl", 1, 255, 128}, //179, total 180
// HLS
{"EnPrefixSeiData", 0, 1, 0},
{"PrefixSeiDataSize", 0, 1024, 1},
{"EnSuffixSeiData", 0, 1, 0},
{"SuffixSeiDataSize", 0, 1024, 1},
{"EncodeRbspVui", 0, 1, 0},
{"RbspVuiSize", 0, 16383, 1},
{"EncodeRbspHrdInVps", 0, 1, 0},
{"RbspHrdSize", 0, 16383, 1},//191 total : 192
{"EnForcedIDRHeader", 0, 2, 0},
{"ForceIdrPicIdx", -1, INT_MAX, -1},
{"Profile", 0, H264_PROFILE_HIGH444, 0},
};
//------------------------------------------------------------------------------
// ENCODE PARAMETER PARSE FUNCSIONS
//------------------------------------------------------------------------------
// Parameter parsing helper
static int GetValue(osal_file_t fp, const char *para, char *value)
{
char lineStr[256];
char paraStr[256];
osal_fseek(fp, 0, SEEK_SET);
while (1) {
if (fgets(lineStr, 256, (FILE*)fp) == NULL)
return 0;
sscanf(lineStr, "%s %s", paraStr, value);
if (paraStr[0] != ';') {
if (strcmp(para, paraStr) == 0)
return 1;
}
}
}
// Parse "string number number ..." at most "num" numbers
// e.g. SKIP_PIC_NUM 1 3 4 5
static int GetValues(osal_file_t fp, const char *para, int *values, int num)
{
char line[1024];
osal_fseek(fp, 0, SEEK_SET);
while (1)
{
int i;
char *str;
if (fgets(line, sizeof(line)-1, (FILE*)fp) == NULL)
return 0;
// empty line
if ((str = strtok(line, " ")) == NULL)
continue;
if(strcmp(str, para) != 0)
continue;
for (i=0; i<num; i++)
{
if ((str = strtok(NULL, " ")) == NULL)
return 1;
if (!isdigit((Int32)str[0]))
return 1;
values[i] = atoi(str);
}
return 1;
}
}
int parseMp4CfgFile(ENC_CFG *pEncCfg, char *FileName)
{
osal_file_t fp;
char sValue[1024];
int ret = 0;
fp = osal_fopen(FileName, "rt");
if (fp == NULL) {
return ret;
}
if (GetValue(fp, "YUV_SRC_IMG", sValue) == 0)
goto __end_parseMp4CfgFile;
else
strcpy(pEncCfg->SrcFileName, sValue);
if (GetValue(fp, "FRAME_NUMBER_ENCODED", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->NumFrame = atoi(sValue);
if (GetValue(fp, "PICTURE_WIDTH", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->PicX = atoi(sValue);
if (GetValue(fp, "PICTURE_HEIGHT", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->PicY = atoi(sValue);
if (GetValue(fp, "FRAME_RATE", sValue) == 0)
goto __end_parseMp4CfgFile;
{
double frameRate;
int timeRes, timeInc;
#ifdef ANDROID
frameRate = atoi(sValue);
#else
frameRate = atof(sValue);
#endif
timeInc = 1;
while ((int)frameRate != frameRate) {
timeInc *= 10;
frameRate *= 10;
}
timeRes = (int) frameRate;
// divide 2 or 5
if (timeInc%2 == 0 && timeRes%2 == 0) {
timeInc /= 2;
timeRes /= 2;
}
if (timeInc%5 == 0 && timeRes%5 == 0) {
timeInc /= 5;
timeRes /= 5;
}
if (timeRes == 2997 && timeInc == 100) {
timeRes = 30000;
timeInc = 1001;
}
pEncCfg->FrameRate = (timeInc - 1) << 16;
pEncCfg->FrameRate |= timeRes;
}
if (GetValue(fp, "VERSION_ID", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->VerId = atoi(sValue);
if (GetValue(fp, "DATA_PART_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->DataPartEn = atoi(sValue);
if (GetValue(fp, "REV_VLC_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->RevVlcEn = atoi(sValue);
if (GetValue(fp, "INTRA_DC_VLC_THRES", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->IntraDcVlcThr = atoi(sValue);
if (GetValue(fp, "SHORT_VIDEO", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->ShortVideoHeader = atoi(sValue);
if (GetValue(fp, "ANNEX_I_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->AnnexI = atoi(sValue);
if (GetValue(fp, "ANNEX_J_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->AnnexJ = atoi(sValue);
if (GetValue(fp, "ANNEX_K_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->AnnexK = atoi(sValue);
if (GetValue(fp, "ANNEX_T_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->AnnexT = atoi(sValue);
if (GetValue(fp, "VOP_QUANT_SCALE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->VopQuant = atoi(sValue);
if (GetValue(fp, "GOP_PIC_NUMBER", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->GopPicNum = atoi(sValue);
if (GetValue(fp, "SLICE_MODE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->SliceMode = atoi(sValue);
if (GetValue(fp, "SLICE_SIZE_MODE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->SliceSizeMode = atoi(sValue);
if (GetValue(fp, "SLICE_SIZE_NUMBER", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->SliceSizeNum = atoi(sValue);
if (GetValue(fp, "RATE_CONTROL_ENABLE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->RcEnable = atoi(sValue);
if (GetValue(fp, "BIT_RATE_KBPS", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->RcBitRate = atoi(sValue);
if (GetValue(fp, "DELAY_IN_MS", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->RcInitDelay = atoi(sValue);
if (GetValue(fp, "VBV_BUFFER_SIZE", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->RcBufSize = atoi(sValue);
if (GetValue(fp, "INTRA_MB_REFRESH", sValue) == 0)
goto __end_parseMp4CfgFile;
pEncCfg->IntraRefreshNum = atoi(sValue);
pEncCfg->ConscIntraRefreshEnable = 0;
if (pEncCfg->IntraRefreshNum > 0)
{
if (GetValue(fp, "CONSC_INTRA_REFRESH_EN", sValue) == 0)
pEncCfg->ConscIntraRefreshEnable = 0;
else
pEncCfg->ConscIntraRefreshEnable = atoi(sValue);
}
if (GetValue(fp, "CONST_INTRA_QP_EN", sValue) == 0)
pEncCfg->ConstantIntraQPEnable = 0;
else
pEncCfg->ConstantIntraQPEnable = atoi(sValue);
if (GetValue(fp, "CONST_INTRA_QP", sValue) == 0)
pEncCfg->RCIntraQP = 0;
else
pEncCfg->RCIntraQP = atoi(sValue);
if (GetValue(fp, "HEC_ENABLE", sValue) == 0)
pEncCfg->HecEnable = 0;
else
pEncCfg->HecEnable = atoi(sValue);
if (GetValue(fp, "SEARCH_RANGE", sValue) == 0)
pEncCfg->SearchRange = 0;
else
pEncCfg->SearchRange = atoi(sValue);
if (GetValue(fp, "ME_USE_ZERO_PMV", sValue) == 0)
pEncCfg->MeUseZeroPmv = 0;
else
pEncCfg->MeUseZeroPmv = atoi(sValue);
if (GetValue(fp, "WEIGHT_INTRA_COST", sValue) == 0)
pEncCfg->intraCostWeight = 0;
else
pEncCfg->intraCostWeight = atoi(sValue);
if (GetValue(fp, "MAX_QP_SET_ENABLE", sValue) == 0)
pEncCfg->MaxQpSetEnable= 0;
else
pEncCfg->MaxQpSetEnable = atoi(sValue);
if (GetValue(fp, "MAX_QP", sValue) == 0)
pEncCfg->MaxQp = 0;
else
pEncCfg->MaxQp = atoi(sValue);
if (GetValue(fp, "GAMMA_SET_ENABLE", sValue) == 0)
pEncCfg->GammaSetEnable = 0;
else
pEncCfg->GammaSetEnable = atoi(sValue);
if (GetValue(fp, "GAMMA", sValue) == 0)
pEncCfg->Gamma = 0;
else
pEncCfg->Gamma = atoi(sValue);
if (GetValue(fp, "RC_INTERVAL_MODE", sValue) == 0)
pEncCfg->rcIntervalMode = 0;
else
pEncCfg->rcIntervalMode = atoi(sValue);
if (GetValue(fp, "RC_MB_INTERVAL", sValue) == 0)
pEncCfg->RcMBInterval = 0;
else
pEncCfg->RcMBInterval = atoi(sValue);
ret = 1; /* Success */
__end_parseMp4CfgFile:
osal_fclose(fp);
return ret;
}
int parseAvcCfgFile(ENC_CFG *pEncCfg, char *FileName)
{
osal_file_t fp;
char sValue[1024];
int ret = 0;
fp = osal_fopen(FileName, "r");
if (fp == NULL) {
return 0;
}
if (GetValue(fp, "YUV_SRC_IMG", sValue) == 0)
goto __end_parseAvcCfgFile;
else
strcpy(pEncCfg->SrcFileName, sValue);
if (GetValue(fp, "FRAME_NUMBER_ENCODED", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->NumFrame = atoi(sValue);
if (GetValue(fp, "PICTURE_WIDTH", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->PicX = atoi(sValue);
if (GetValue(fp, "PICTURE_HEIGHT", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->PicY = atoi(sValue);
if (GetValue(fp, "FRAME_RATE", sValue) == 0)
goto __end_parseAvcCfgFile;
{
double frameRate;
int timeRes, timeInc;
#ifdef ANDROID
frameRate = atoi(sValue);
#else
frameRate = atof(sValue);
#endif
timeInc = 1;
while ((int)frameRate != frameRate) {
timeInc *= 10;
frameRate *= 10;
}
timeRes = (int) frameRate;
// divide 2 or 5
if (timeInc%2 == 0 && timeRes%2 == 0) {
timeInc /= 2;
timeRes /= 2;
}
if (timeInc%5 == 0 && timeRes%5 == 0) {
timeInc /= 5;
timeRes /= 5;
}
if (timeRes == 2997 && timeInc == 100) {
timeRes = 30000;
timeInc = 1001;
}
pEncCfg->FrameRate = (timeInc - 1) << 16;
pEncCfg->FrameRate |= timeRes;
}
if (GetValue(fp, "CONSTRAINED_INTRA", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->ConstIntraPredFlag = atoi(sValue);
if (GetValue(fp, "DISABLE_DEBLK", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->DisableDeblk = atoi(sValue);
if (GetValue(fp, "DEBLK_ALPHA", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->DeblkOffsetA = atoi(sValue);
if (GetValue(fp, "DEBLK_BETA", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->DeblkOffsetB = atoi(sValue);
if (GetValue(fp, "CHROMA_QP_OFFSET", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->ChromaQpOffset = atoi(sValue);
if (GetValue(fp, "LEVEL", sValue) == 0)
{
pEncCfg->level = 0;//note : 0 means auto calculation.
}
else
{
pEncCfg->level = atoi(sValue);
if (pEncCfg->level<0 || pEncCfg->level>51)
goto __end_parseAvcCfgFile;
}
if (GetValue(fp, "PIC_QP_Y", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->PicQpY = atoi(sValue);
if (GetValue(fp, "GOP_PIC_NUMBER", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->GopPicNum = atoi(sValue);
if (GetValue(fp, "IDR_INTERVAL", sValue) == 0)
pEncCfg->IDRInterval = 0;
else
pEncCfg->IDRInterval = atoi(sValue);
if (GetValue(fp, "SLICE_MODE", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->SliceMode = atoi(sValue);
if (GetValue(fp, "SLICE_SIZE_MODE", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->SliceSizeMode = atoi(sValue);
if (GetValue(fp, "SLICE_SIZE_NUMBER", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->SliceSizeNum = atoi(sValue);
if (GetValue(fp, "AUD_ENABLE", sValue) == 0)
pEncCfg->aud_en = 0;
else
pEncCfg->aud_en = atoi(sValue);
/**
* Error Resilience
*/
// Intra Cost Weight : not mandatory. default zero
if (GetValue(fp, "WEIGHT_INTRA_COST", sValue) == 0)
pEncCfg->intraCostWeight = 0;
else
pEncCfg->intraCostWeight = atoi(sValue);
/**
* CROP information
*/
if (GetValue(fp, "FRAME_CROP_LEFT", sValue) == 0)
pEncCfg->frameCropLeft = 0;
else
pEncCfg->frameCropLeft = atoi(sValue);
if (GetValue(fp, "FRAME_CROP_RIGHT", sValue) == 0)
pEncCfg->frameCropRight = 0;
else
pEncCfg->frameCropRight = atoi(sValue);
if (GetValue(fp, "FRAME_CROP_TOP", sValue) == 0)
pEncCfg->frameCropTop = 0;
else
pEncCfg->frameCropTop = atoi(sValue);
if (GetValue(fp, "FRAME_CROP_BOTTOM", sValue) == 0)
pEncCfg->frameCropBottom = 0;
else
pEncCfg->frameCropBottom = atoi(sValue);
/**
* ME Option
*/
if (GetValue(fp, "ME_USE_ZERO_PMV", sValue) == 0)
pEncCfg->MeUseZeroPmv = 0;
else
pEncCfg->MeUseZeroPmv = atoi(sValue);
if (GetValue(fp, "ME_BLK_MODE_ENABLE", sValue) == 0)
pEncCfg->MeBlkModeEnable = 0;
else
pEncCfg->MeBlkModeEnable = atoi(sValue);
if (GetValue(fp, "RATE_CONTROL_ENABLE", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->RcEnable = atoi(sValue);
if (GetValue(fp, "BIT_RATE_KBPS", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->RcBitRate = atoi(sValue);
if (GetValue(fp, "DELAY_IN_MS", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->RcInitDelay = atoi(sValue);
if (GetValue(fp, "VBV_BUFFER_SIZE", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->RcBufSize = atoi(sValue);
if (GetValue(fp, "INTRA_MB_REFRESH", sValue) == 0)
goto __end_parseAvcCfgFile;
pEncCfg->IntraRefreshNum = atoi(sValue);
pEncCfg->ConscIntraRefreshEnable = 0;
if (pEncCfg->IntraRefreshNum > 0)
{
if (GetValue(fp, "CONSC_INTRA_REFRESH_EN", sValue) == 0)
pEncCfg->ConscIntraRefreshEnable = 0;
else
pEncCfg->ConscIntraRefreshEnable = atoi(sValue);
}
if (GetValue(fp, "FRAME_SKIP_DISABLE", sValue) == 0)
pEncCfg->frameSkipDisable = 0;
else
pEncCfg->frameSkipDisable = atoi(sValue);
if (GetValue(fp, "CONST_INTRAQP_ENABLE", sValue) == 0)
pEncCfg->ConstantIntraQPEnable = 0;
else
pEncCfg->ConstantIntraQPEnable = atoi(sValue);
if (GetValue(fp, "RC_INTRA_QP", sValue) == 0)
pEncCfg->RCIntraQP = 0;
else
pEncCfg->RCIntraQP = atoi(sValue);
if (GetValue(fp, "MAX_QP_SET_ENABLE", sValue) == 0)
pEncCfg->MaxQpSetEnable= 0;
else
pEncCfg->MaxQpSetEnable = atoi(sValue);
if (GetValue(fp, "MAX_QP", sValue) == 0)
pEncCfg->MaxQp = 0;
else
pEncCfg->MaxQp = atoi(sValue);
if (GetValue(fp, "MIN_QP_SET_ENABLE", sValue) == 0)
pEncCfg->MinQpSetEnable= 0;
else
pEncCfg->MinQpSetEnable = atoi(sValue);
if (GetValue(fp, "MIN_QP", sValue) == 0)
pEncCfg->MinQp = 0;
else
pEncCfg->MinQp = atoi(sValue);
if (GetValue(fp, "MAX_DELTA_QP_SET_ENABLE", sValue) == 0)
pEncCfg->MaxDeltaQpSetEnable= 0;
else
pEncCfg->MaxDeltaQpSetEnable = atoi(sValue);
if (GetValue(fp, "MAX_DELTA_QP", sValue) == 0)
pEncCfg->MaxDeltaQp = 0;
else
pEncCfg->MaxDeltaQp = atoi(sValue);
if (GetValue(fp, "MIN_DELTA_QP_SET_ENABLE", sValue) == 0)
pEncCfg->MinDeltaQpSetEnable= 0;
else
pEncCfg->MinDeltaQpSetEnable = atoi(sValue);
if (GetValue(fp, "MIN_DELTA_QP", sValue) == 0)
pEncCfg->MinDeltaQp = 0;
else
pEncCfg->MinDeltaQp = atoi(sValue);
if (GetValue(fp, "GAMMA_SET_ENABLE", sValue) == 0)
pEncCfg->GammaSetEnable = 0;
else
pEncCfg->GammaSetEnable = atoi(sValue);
if (GetValue(fp, "GAMMA", sValue) == 0)
pEncCfg->Gamma = 0;
else
pEncCfg->Gamma = atoi(sValue);
/* CODA960 features */
if (GetValue(fp, "RC_INTERVAL_MODE", sValue) == 0)
pEncCfg->rcIntervalMode = 0;
else
pEncCfg->rcIntervalMode = atoi(sValue);
if (GetValue(fp, "RC_MB_INTERVAL", sValue) == 0)
pEncCfg->RcMBInterval = 0;
else
pEncCfg->RcMBInterval = atoi(sValue);
/***************************************/
if (GetValue(fp, "RC_INTERVAL_MODE", sValue) == 0)
pEncCfg->rcIntervalMode = 0;
else
pEncCfg->rcIntervalMode = atoi(sValue);
if (GetValue(fp, "RC_MB_INTERVAL", sValue) == 0)
pEncCfg->RcMBInterval = 0;
else
pEncCfg->RcMBInterval = atoi(sValue);
if (GetValue(fp, "SEARCH_RANGE", sValue) == 0)
pEncCfg->SearchRange = 0;
else
pEncCfg->SearchRange = atoi(sValue);
osal_memset(pEncCfg->skipPicNums, 0, sizeof(pEncCfg->skipPicNums));
GetValues(fp, "SKIP_PIC_NUMS", pEncCfg->skipPicNums, sizeof(pEncCfg->skipPicNums));
/**
* VUI Parameter
*/
if (GetValue(fp, "VUI_PARAMETERS_PRESENT_FLAG", sValue) == 0)
pEncCfg->VuiPresFlag = 0;
else
pEncCfg->VuiPresFlag = atoi(sValue);
if (pEncCfg->VuiPresFlag == 1) {
if (GetValue(fp, "VIDEO_SIGNAL_TYPE_PRESENT_FLAG", sValue) == 0)
pEncCfg->VideoSignalTypePresFlag = 0;
else
pEncCfg->VideoSignalTypePresFlag = atoi(sValue);
if (pEncCfg->VideoSignalTypePresFlag) {
if (GetValue(fp, "VIDEO_FORMAT", sValue) == 0)
pEncCfg->VideoFormat = 5;
else
pEncCfg->VideoFormat = (char)atoi(sValue);
if (GetValue(fp, "VIDEO_FULL_RANGE_FLAG", sValue) == 0)
pEncCfg->VideoFullRangeFlag = 0;
else
pEncCfg->VideoFullRangeFlag = (char)atoi(sValue);
if (GetValue(fp, "COLOUR_DESCRIPTION_PRESENT_FLAG", sValue) == 0)
pEncCfg->ColourDescripPresFlag = 1;
else
pEncCfg->ColourDescripPresFlag = atoi(sValue);
if (pEncCfg->ColourDescripPresFlag) {
if (GetValue(fp, "COLOUR_PRIMARIES", sValue) == 0)
pEncCfg->ColourPrimaries = 1;
else
pEncCfg->ColourPrimaries = (char)atoi(sValue);
if (GetValue(fp, "TRANSFER_CHARACTERISTICS", sValue) == 0)
pEncCfg->TransferCharacteristics = 2;
else
pEncCfg->TransferCharacteristics = (char)atoi(sValue);
if (GetValue(fp, "MATRIX_COEFFICIENTS", sValue) == 0)
pEncCfg->MatrixCoeff = 2;
else
pEncCfg->MatrixCoeff = (char)atoi(sValue);
}
}
}
ret = 1; /* Success */
__end_parseAvcCfgFile:
osal_fclose(fp);
return ret;
}
static int WAVE_GetStringValue(
osal_file_t fp,
char* para,
char* value
)
{
int pos = 0;
char* token = NULL;
char lineStr[256] = {0, };
char valueStr[256] = {0, };
osal_fseek(fp, 0, SEEK_SET);
while (1) {
if ( fgets(lineStr, 256, (FILE*)fp) == NULL ) {
return 0;//not exist para in cfg file
}
if( (lineStr[0] == '#') || (lineStr[0] == ';') || (lineStr[0] == ':') ) { // check comment
continue;
}
token = strtok(lineStr, ": "); // parameter name is separated by ' ' or ':'
if( token != NULL ) {
if ( strcasecmp(para, token) == 0) { // check parameter name
token = strtok(NULL, ":\r\n");
if ( token && strlen(token) == 1 && strncmp(token, " ", 1) == 0) //check space - ex) Frame1 : P 1 0 0
token = strtok(NULL, ":\r\n");
if ( token == NULL )
return -1;
osal_memcpy( valueStr, token, (Int32)strlen(token) );
while( valueStr[pos] == ' ' ) { // check space
pos++;
}
if ( valueStr[pos] == 0 )
return -1;//no value
strcpy(value, &valueStr[pos]);
return 1;
}
else {
continue;
}
}
else {
continue;
}
}
}
static int WAVE_GetValue(
osal_file_t fp,
const char* cfgName,
int* value
)
{
int i;
int iValue;
int ret;
char sValue[256] = {0, };
int maxCfg = sizeof(waveCfgInfo) / sizeof(WaveCfgInfo);
for (i=0; i < maxCfg ;i++) {
if ( strcmp(waveCfgInfo[i].name, cfgName) == 0)
break;
}
if ( i == maxCfg ) {
VLOG(ERR, "CFG param error : %s\n", cfgName);
return 0;
}
ret = WAVE_GetStringValue(fp, (char*)cfgName, sValue);
if(ret == 1) {
iValue = atoi(sValue);
if( (iValue >= waveCfgInfo[i].min) && (iValue <= waveCfgInfo[i].max) ) { // Check min, max
*value = iValue;
return 1;
}
else {
VLOG(ERR, "CFG file error : %s value is not available. ( min = %d, max = %d)\n", waveCfgInfo[i].name, waveCfgInfo[i].min, waveCfgInfo[i].max);
return 0;
}
}
else if ( ret == -1 ) {
VLOG(ERR, "CFG file error : %s value is not available. ( min = %d, max = %d)\n", waveCfgInfo[i].name, waveCfgInfo[i].min, waveCfgInfo[i].max);
return 0;
}
else {
*value = waveCfgInfo[i].def;
return 1;
}
}
static int WAVE_SetGOPInfo(
const char* lineStr,
CustomGopPicParam* gopPicParam,
int useDeriveLambdaWeight __attribute__((unused)),
int intraQp
)
{
int numParsed;
char sliceType;
osal_memset(gopPicParam, 0, sizeof(CustomGopPicParam));
numParsed = sscanf(lineStr, "%c %d %d %d %d %d",
&sliceType, &gopPicParam->pocOffset, &gopPicParam->picQp,
&gopPicParam->temporalId, &gopPicParam->refPocL0, &gopPicParam->refPocL1);
if (sliceType=='I') {
gopPicParam->picType = PIC_TYPE_I;
}
else if (sliceType=='P') {
gopPicParam->picType = PIC_TYPE_P;
gopPicParam->useMultiRefP = (numParsed == 6) ? 1 : 0;
}
else if (sliceType=='B') {
gopPicParam->picType = PIC_TYPE_B;
}
else {
return 0;
}
if (sliceType=='B' && numParsed != 6) {
return 0;
}
if (gopPicParam->temporalId < 0) {
return 0;
}
gopPicParam->picQp = MIN(63, gopPicParam->picQp + intraQp);
return 1;
}
static int WAVE_AVCSetGOPInfo(
const char* lineStr,
CustomGopPicParam* gopPicParam,
int useDeriveLambdaWeight __attribute__((unused)),
int intraQp
)
{
int numParsed;
char sliceType;
osal_memset(gopPicParam, 0, sizeof(CustomGopPicParam));
numParsed = sscanf(lineStr, "%c %d %d %d %d %d",
&sliceType, &gopPicParam->pocOffset, &gopPicParam->picQp,
&gopPicParam->temporalId, &gopPicParam->refPocL0, &gopPicParam->refPocL1);
if (sliceType=='I') {
gopPicParam->picType = PIC_TYPE_I;
}
else if (sliceType=='P') {
gopPicParam->picType = PIC_TYPE_P;
gopPicParam->useMultiRefP = (numParsed == 6) ? 1 : 0;
}
else if (sliceType=='B') {
gopPicParam->picType = PIC_TYPE_B;
}
else {
return 0;
}
if (sliceType=='B' && numParsed != 6) {
return 0;
}
gopPicParam->picQp = gopPicParam->picQp + intraQp;
return 1;
}
int parseRoiCtuModeParam(
char* lineStr,
VpuRect* roiRegion,
int* roiQp,
int picX,
int picY
)
{
int numParsed;
osal_memset(roiRegion, 0, sizeof(VpuRect));
*roiQp = 0;
numParsed = sscanf(lineStr, "%u %u %u %u %d",
&roiRegion->left, &roiRegion->right, &roiRegion->top, &roiRegion->bottom, roiQp);
if (numParsed != 5) {
return 0;
}
if (*roiQp < 0 || *roiQp > 51) {
return 0;
}
if ((Int32)roiRegion->left < 0 || (Int32)roiRegion->top < 0) {
return 0;
}
if (roiRegion->left > (Uint32)((picX + CTB_SIZE - 1) >> LOG2_CTB_SIZE) || \
roiRegion->top > (Uint32)((picY + CTB_SIZE - 1) >> LOG2_CTB_SIZE)) {
return 0;
}
if (roiRegion->right > (Uint32)((picX + CTB_SIZE - 1) >> LOG2_CTB_SIZE) || \
roiRegion->bottom > (Uint32)((picY + CTB_SIZE - 1) >> LOG2_CTB_SIZE)) {
return 0;
}
if (roiRegion->left > roiRegion->right) {
return 0;
}
if (roiRegion->top > roiRegion->bottom) {
return 0;
}
return 1;
}
#define FIXED_BIT_RATIO 49
#define NUM_MAX_PARAM_CHANGE 10
int parseWaveEncCfgFile(
ENC_CFG *pEncCfg,
int bitFormat,
ENCParameter *get_param
)
{
char tempStr[256] = {0, };
int i = 0;
int ret = 0;
int intra8=0, intra16=0, intra32=0, frameSkip=0; // temp value
int EnableChageParam = 0;
int FixedBitRatio = 0;
UNREFERENCED_PARAMETER(frameSkip);
/******************************************************************************************************/
/************************************** START USER CONFIGURATION **************************************/
pEncCfg->waveCfg.picX = get_param->enc_width;
pEncCfg->waveCfg.picY = get_param->enc_height;
pEncCfg->waveCfg.intraQP = get_param->enc_qp;
pEncCfg->waveCfg.minQp = get_param->enc_minqp;
pEncCfg->waveCfg.maxQp = get_param->enc_maxqp;
pEncCfg->RcBitRate = get_param->enc_bitrate;
pEncCfg->waveCfg.frameRate = get_param->enc_framerate;
pEncCfg->waveCfg.intraPeriod = get_param->enc_gop;
pEncCfg->RcEnable = get_param->enc_mode;
printf("\n==================================================\n");
printf(" ENC CONFIGURATION\n");
if(pEncCfg->waveCfg.picX == 0) pEncCfg->waveCfg.picX = 2896;
if(pEncCfg->waveCfg.picY == 0) pEncCfg->waveCfg.picY = 1872;
if(pEncCfg->waveCfg.intraQP == 0) pEncCfg->waveCfg.intraQP = 30;
if(pEncCfg->waveCfg.minQp == 0) pEncCfg->waveCfg.minQp = 8;
if(pEncCfg->waveCfg.maxQp == 0) pEncCfg->waveCfg.maxQp = 51;
if(pEncCfg->RcBitRate == 0) pEncCfg->RcBitRate = 400000;
if(pEncCfg->waveCfg.frameRate == 0) pEncCfg->waveCfg.frameRate = 30;
if(pEncCfg->waveCfg.intraPeriod == 0) pEncCfg->waveCfg.intraPeriod = 3;
printf("\n enc_width : %d\n\
enc_height : %d\n\
enc_qp : %d\n\
enc_minqp : %d\n\
enc_maxqp : %d\n\
enc_bitrate : %d\n\
enc_framerate : %d\n\
enc_gop : %d\n",
pEncCfg->waveCfg.picX,
pEncCfg->waveCfg.picY,
pEncCfg->waveCfg.intraQP,
pEncCfg->waveCfg.minQp,
pEncCfg->waveCfg.maxQp,
pEncCfg->RcBitRate,
pEncCfg->waveCfg.frameRate,
pEncCfg->waveCfg.intraPeriod
);
printf("==================================================\n");
/*************************************** END USER CONFIGURATION ***************************************/
/******************************************************************************************************/
strcpy(pEncCfg->SrcFileName, "null");
pEncCfg->SrcBitDepth = 8;
pEncCfg->waveCfg.internalBitDepth = 8;
pEncCfg->waveCfg.losslessEnable = 0;
pEncCfg->waveCfg.constIntraPredFlag = 0;
pEncCfg->waveCfg.decodingRefreshType = 1;
pEncCfg->waveCfg.enStillPicture = 0;
pEncCfg->waveCfg.bitAllocMode = 0;
pEncCfg->NumFrame = INT_MAX;
for (i = 0; i < MAX_GOP_NUM; i++) {
if (FixedBitRatio) {
if (FixedBitRatio >= waveCfgInfo[FIXED_BIT_RATIO].min && FixedBitRatio <= waveCfgInfo[FIXED_BIT_RATIO].max) {
pEncCfg->waveCfg.fixedBitRatio[i] = FixedBitRatio;
} else {
pEncCfg->waveCfg.fixedBitRatio[i] = waveCfgInfo[FIXED_BIT_RATIO].def;
}
} else {
pEncCfg->waveCfg.fixedBitRatio[i] = waveCfgInfo[FIXED_BIT_RATIO].def;
}
}
pEncCfg->waveCfg.independSliceMode = 0;
pEncCfg->waveCfg.independSliceModeArg = 0;
pEncCfg->waveCfg.dependSliceMode = 0;
pEncCfg->waveCfg.dependSliceModeArg = 0;
pEncCfg->waveCfg.intraRefreshMode = 0;
pEncCfg->waveCfg.intraRefreshArg = 0;
pEncCfg->waveCfg.useRecommendEncParam = 0;
pEncCfg->waveCfg.scalingListEnable = 0;
intra8 = 0;
intra16 = 0;
intra32 = 0;
pEncCfg->waveCfg.cuSizeMode = (intra8&0x01) | (intra16&0x01)<<1 | (intra32&0x01)<<2;
pEncCfg->waveCfg.tmvpEnable = 1;
pEncCfg->waveCfg.wppenable = 0;
pEncCfg->waveCfg.maxNumMerge = 1;
pEncCfg->waveCfg.disableDeblk = !(1);
pEncCfg->waveCfg.lfCrossSliceBoundaryEnable = 1;
pEncCfg->waveCfg.betaOffsetDiv2 = 0;
pEncCfg->waveCfg.tcOffsetDiv2 = 0;
pEncCfg->waveCfg.skipIntraTrans = 1;
pEncCfg->waveCfg.saoEnable = 1;
pEncCfg->waveCfg.intraNxNEnable = 1;
pEncCfg->RcBitRateBL = 0;
pEncCfg->waveCfg.cuLevelRCEnable = 1;
pEncCfg->waveCfg.hvsQPEnable = 1;
pEncCfg->waveCfg.hvsQpScale = 0;
pEncCfg->VbvBufferSize = 0;
if (pEncCfg->VbvBufferSize == 0) {
pEncCfg->VbvBufferSize = 3000;
}
pEncCfg->waveCfg.maxDeltaQp = 0;
pEncCfg->waveCfg.roiEnable = 0;
frameSkip = 0;
pEncCfg->waveCfg.numUnitsInTick = 0;
pEncCfg->waveCfg.timeScale = 0;
pEncCfg->waveCfg.numTicksPocDiffOne = 0;
pEncCfg->waveCfg.encAUD = 0;
pEncCfg->waveCfg.encEOS = 0;
pEncCfg->waveCfg.encEOB = 0;
pEncCfg->waveCfg.chromaCbQpOffset = 0;
pEncCfg->waveCfg.chromaCrQpOffset = 0;
pEncCfg->waveCfg.initialRcQp = -1;
pEncCfg->waveCfg.nrYEnable = 0;
pEncCfg->waveCfg.nrCbEnable = 0;
pEncCfg->waveCfg.nrCrEnable = 0;
pEncCfg->waveCfg.nrNoiseEstEnable = 0;
pEncCfg->waveCfg.nrNoiseSigmaY = 0;
pEncCfg->waveCfg.nrNoiseSigmaCb = 0;
pEncCfg->waveCfg.nrNoiseSigmaCr = 0;
pEncCfg->waveCfg.nrIntraWeightY = 7;
pEncCfg->waveCfg.nrIntraWeightCb= 7;
pEncCfg->waveCfg.nrIntraWeightCr = 7;
pEncCfg->waveCfg.nrInterWeightY = 4;
pEncCfg->waveCfg.nrInterWeightCb = 4;
pEncCfg->waveCfg.nrInterWeightCr = 4;
pEncCfg->waveCfg.useAsLongtermPeriod = 0;
pEncCfg->waveCfg.refLongtermPeriod = 0;
//GOP
pEncCfg->waveCfg.gopPresetIdx = 0;
pEncCfg->waveCfg.gopParam.customGopSize = 1;
if (pEncCfg->waveCfg.intraPeriod == 1) {
pEncCfg->waveCfg.gopParam.picParam[0].picType = PIC_TYPE_I;
pEncCfg->waveCfg.gopParam.picParam[0].picQp = pEncCfg->waveCfg.intraQP;
pEncCfg->waveCfg.gopParam.picParam[0].pocOffset = 1;
if (pEncCfg->waveCfg.gopParam.customGopSize > 1) {
VLOG(ERR, "CFG file error : gop size should be smaller than 2 for all intra case\n");
goto __end_parse;
}
} else {
for (i = 0; pEncCfg->waveCfg.gopPresetIdx == PRESET_IDX_CUSTOM_GOP && i < pEncCfg->waveCfg.gopParam.customGopSize; i++) {
if ( bitFormat == STD_AVC ) {
if ( WAVE_AVCSetGOPInfo("P 1 0 0", &pEncCfg->waveCfg.gopParam.picParam[i], 0, pEncCfg->waveCfg.intraQP) != 1) {
VLOG(ERR, "CFG file error : %s value is not available. \n", tempStr);
goto __end_parse;
}
} else {
if ( WAVE_SetGOPInfo("P 1 0 0", &pEncCfg->waveCfg.gopParam.picParam[i], 0, pEncCfg->waveCfg.intraQP) != 1) {
VLOG(ERR, "CFG file error : %s value is not available. \n", tempStr);
goto __end_parse;
}
#if TEMP_SCALABLE_RC
if ( (pEncCfg->waveCfg.gopParam.picParam[i].temporalId + 1) > MAX_NUM_TEMPORAL_LAYER) {
VLOG(ERR, "CFG file error : %s MaxTempLayer %d exceeds MAX_TEMP_LAYER(7). \n", tempStr, pEncCfg->waveCfg.gopParam.picParam[i].temporalId + 1);
goto __end_parse;
}
#endif
}
}
}
if (pEncCfg->waveCfg.roiEnable) {
sscanf("", "%s\n", pEncCfg->waveCfg.roiFileName);
}
if (pEncCfg->waveCfg.losslessEnable) {
pEncCfg->waveCfg.disableDeblk = 1;
pEncCfg->waveCfg.saoEnable = 0;
pEncCfg->RcEnable = 0;
}
if (pEncCfg->waveCfg.roiEnable) {
sscanf("/nstream/new_server/ctu_mode/roi_map.dat", "%s\n", pEncCfg->waveCfg.roiQpMapFile);
}
pEncCfg->waveCfg.idrPeriod = 0;
pEncCfg->waveCfg.rdoSkip = 1;
pEncCfg->waveCfg.lambdaScalingEnable = 1;
pEncCfg->waveCfg.transform8x8 = 0;
pEncCfg->waveCfg.avcSliceMode = 0;
pEncCfg->waveCfg.avcSliceArg = 0;
pEncCfg->waveCfg.intraMbRefreshMode = 0;
pEncCfg->waveCfg.intraMbRefreshArg = 1;
pEncCfg->waveCfg.mbLevelRc = 0;
pEncCfg->waveCfg.entropyCodingMode = 0;
pEncCfg->waveCfg.monochromeEnable = 0;
pEncCfg->waveCfg.strongIntraSmoothEnable = 1;
pEncCfg->waveCfg.roiAvgQp = 0;
pEncCfg->waveCfg.weightPredEnable = 0 & 1;
pEncCfg->waveCfg.bgDetectEnable = 0;
pEncCfg->waveCfg.bgThrDiff = 8;
pEncCfg->waveCfg.s2fmeDisable = 0;
pEncCfg->waveCfg.bgThrMeanDiff = 1;
pEncCfg->waveCfg.bgLambdaQp = 32;
pEncCfg->waveCfg.bgDeltaQp = 3;
pEncCfg->waveCfg.customLambdaMapEnable = 0;
pEncCfg->waveCfg.customLambdaEnable = 0;
pEncCfg->waveCfg.customMDEnable = 0;
pEncCfg->waveCfg.pu04DeltaRate = 0;
pEncCfg->waveCfg.pu08DeltaRate = 0;
pEncCfg->waveCfg.pu16DeltaRate = 0;
pEncCfg->waveCfg.pu32DeltaRate = 0;
pEncCfg->waveCfg.pu04IntraPlanarDeltaRate = 0;
pEncCfg->waveCfg.pu04IntraDcDeltaRate = 0;
pEncCfg->waveCfg.pu04IntraAngleDeltaRate = 0;
pEncCfg->waveCfg.pu08IntraPlanarDeltaRate = 0;
pEncCfg->waveCfg.pu08IntraDcDeltaRate = 0;
pEncCfg->waveCfg.pu08IntraAngleDeltaRate = 0;
pEncCfg->waveCfg.pu16IntraPlanarDeltaRate = 0;
pEncCfg->waveCfg.pu16IntraDcDeltaRate = 0;
pEncCfg->waveCfg.pu16IntraAngleDeltaRate = 0;
pEncCfg->waveCfg.pu32IntraPlanarDeltaRate = 0;
pEncCfg->waveCfg.pu32IntraDcDeltaRate = 0;
pEncCfg->waveCfg.pu32IntraAngleDeltaRate = 0;
pEncCfg->waveCfg.cu08IntraDeltaRate = 0;
pEncCfg->waveCfg.cu08InterDeltaRate = 0;
pEncCfg->waveCfg.cu08MergeDeltaRate = 0;
pEncCfg->waveCfg.cu16IntraDeltaRate = 0;
pEncCfg->waveCfg.cu16InterDeltaRate = 0;
pEncCfg->waveCfg.cu16MergeDeltaRate = 0;
pEncCfg->waveCfg.cu32IntraDeltaRate = 0;
pEncCfg->waveCfg.cu32InterDeltaRate = 0;
pEncCfg->waveCfg.cu32MergeDeltaRate = 0;
pEncCfg->waveCfg.coefClearDisable = 0;
pEncCfg->waveCfg.customModeMapFlag = 0;
pEncCfg->waveCfg.forcePicSkipStart = 0;
pEncCfg->waveCfg.forcePicSkipEnd = 0;
pEncCfg->waveCfg.forceCoefDropStart = 0;
pEncCfg->waveCfg.forceCoefDropEnd = 0;
pEncCfg->waveCfg.rcWeightParam = 16; // Controls update speed of RC parameters(QP, etc)
pEncCfg->waveCfg.rcWeightBuf = 128; // Controls update speed of RC parameters(QP, etc)
pEncCfg->waveCfg.forcedIdrHeaderEnable = 0;
pEncCfg->waveCfg.forceIdrPicIdx = 0;
// Scaling list
if (pEncCfg->waveCfg.scalingListEnable) {
sscanf("/nstream/new_server/user_data/default_scaling_list.txt", "%s\n", pEncCfg->waveCfg.scalingListFileName);
}
// Custom Lambda
if (pEncCfg->waveCfg.customLambdaEnable) {
sscanf("", "%s\n", pEncCfg->waveCfg.customLambdaFileName);
}
// custom Lambda Map
if (pEncCfg->waveCfg.customLambdaMapEnable) {
sscanf("", "%s\n", pEncCfg->waveCfg.customLambdaMapFileName);
}
// custom Lambda Map
if (pEncCfg->waveCfg.customModeMapFlag) {
sscanf("", "%s\n", pEncCfg->waveCfg.customModeMapFileName);
}
if (pEncCfg->waveCfg.weightPredEnable & 0x1) {
sscanf("", "%s\n", pEncCfg->waveCfg.WpParamFileName);
}
for (i = 0; i < NUM_MAX_PARAM_CHANGE; i++) {
if (EnableChageParam) {
sscanf("", "%d %d %s\n", &pEncCfg->changeParam[i].setParaChgFrmNum, &pEncCfg->changeParam[i].enableOption, pEncCfg->changeParam[i].cfgName);
} else {
pEncCfg->numChangeParam = i;
break;
}
}
pEncCfg->waveCfg.prefixSeiEnable = 0;
pEncCfg->waveCfg.prefixSeiDataSize = 0;
pEncCfg->waveCfg.suffixSeiEnable = 0;
pEncCfg->waveCfg.suffixSeiDataSize = 0;
if (pEncCfg->waveCfg.prefixSeiEnable) {
sscanf("", "%s\n", pEncCfg->waveCfg.prefixSeiDataFileName);
}
if (pEncCfg->waveCfg.suffixSeiEnable) {
sscanf("sValue", "%s\n", pEncCfg->waveCfg.suffixSeiDataFileName);
}
pEncCfg->waveCfg.vuiDataEnable = 0;
pEncCfg->waveCfg.vuiDataSize = 0;
pEncCfg->waveCfg.hrdInVPS = 0;
pEncCfg->waveCfg.hrdDataSize = 0;
if (pEncCfg->waveCfg.hrdInVPS) {
sscanf("", "%s\n", pEncCfg->waveCfg.hrdDataFileName);
}
if (pEncCfg->waveCfg.vuiDataEnable) {
sscanf("", "%s\n", pEncCfg->waveCfg.vuiDataFileName);
}
pEncCfg->Profile = 0;
ret = 1; /* Success */
__end_parse:
return ret;
}
int parseWaveChangeParamCfgFile(
ENC_CFG *pEncCfg,
char *FileName
)
{
osal_file_t fp;
char sValue[256] = {0, };
char tempStr[256] = {0, };
int iValue = 0, ret = 0, i = 0;
fp = osal_fopen(FileName, "r");
if (fp == NULL) {
VLOG(ERR, "file open err : %s, errno(%d)\n", FileName, errno);
return ret;
}
if (WAVE_GetValue(fp, "ConstrainedIntraPred", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.constIntraPredFlag = iValue;
// FixedBitRatio 0 ~ 7
for (i=0; i<MAX_GOP_NUM; i++) {
sprintf(tempStr, "FixedBitRatio%d", i);
if (WAVE_GetStringValue(fp, tempStr, sValue) == 1) {
iValue = atoi(sValue);
if ( iValue >= waveCfgInfo[FIXED_BIT_RATIO].min && iValue <= waveCfgInfo[FIXED_BIT_RATIO].max )
pEncCfg->waveCfg.fixedBitRatio[i] = iValue;
else
pEncCfg->waveCfg.fixedBitRatio[i] = waveCfgInfo[FIXED_BIT_RATIO].def;
}
else
pEncCfg->waveCfg.fixedBitRatio[i] = waveCfgInfo[FIXED_BIT_RATIO].def;
}
if (WAVE_GetValue(fp, "IndeSliceMode", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.independSliceMode = iValue;
if (WAVE_GetValue(fp, "IndeSliceArg", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.independSliceModeArg = iValue;
if (WAVE_GetValue(fp, "DeSliceMode", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.dependSliceMode = iValue;
if (WAVE_GetValue(fp, "DeSliceArg", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.dependSliceModeArg = iValue;
if (WAVE_GetValue(fp, "MaxNumMerge", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.maxNumMerge = iValue;
if (WAVE_GetValue(fp, "EnDBK", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.disableDeblk = !(iValue);
if (WAVE_GetValue(fp, "LFCrossSliceBoundaryFlag", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.lfCrossSliceBoundaryEnable = iValue;
if (WAVE_GetValue(fp, "DecodingRefreshType", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.decodingRefreshType = iValue;
if (WAVE_GetValue(fp, "BetaOffsetDiv2", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.betaOffsetDiv2 = iValue;
if (WAVE_GetValue(fp, "TcOffsetDiv2", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.tcOffsetDiv2 = iValue;
if (WAVE_GetValue(fp, "IntraNxN", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.intraNxNEnable = iValue;
if (WAVE_GetValue(fp, "QP", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.intraQP = iValue;
if (WAVE_GetValue(fp, "IntraPeriod", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.intraPeriod = iValue;
if (WAVE_GetValue(fp, "EnForcedIDRHeader", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.forcedIdrHeaderEnable = iValue;
if (WAVE_GetValue(fp, "FrameRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.frameRate = iValue;
if (WAVE_GetValue(fp, "EncBitrate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->RcBitRate = iValue;
if (WAVE_GetValue(fp, "EnHvsQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.hvsQPEnable = iValue;
if (WAVE_GetValue(fp, "HvsQpScaleDiv2", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.hvsQpScale = iValue;
if (WAVE_GetValue(fp, "InitialDelay", &iValue) == 0)
goto __end_parse;
else
pEncCfg->VbvBufferSize = iValue;
if (pEncCfg->VbvBufferSize == 0) {
if (WAVE_GetValue(fp, "VbvBufferSize", &iValue) == 0)
goto __end_parse;
else
pEncCfg->VbvBufferSize = iValue;
}
if (WAVE_GetValue(fp, "MinQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.minQp = iValue;
if (WAVE_GetValue(fp, "MaxQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.maxQp = iValue;
if (WAVE_GetValue(fp, "MaxDeltaQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.maxDeltaQp = iValue;
if (WAVE_GetValue(fp, "CbQpOffset", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.chromaCbQpOffset = iValue;
if (WAVE_GetValue(fp, "CrQpOffset", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.chromaCrQpOffset = iValue;
if (WAVE_GetValue(fp, "EnNoiseReductionY", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrYEnable = iValue;
if (WAVE_GetValue(fp, "EnNoiseReductionCb", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrCbEnable = iValue;
if (WAVE_GetValue(fp, "EnNoiseReductionCr", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrCrEnable = iValue;
if (WAVE_GetValue(fp, "EnNoiseEst", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrNoiseEstEnable = iValue;
if (WAVE_GetValue(fp, "NoiseSigmaY", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrNoiseSigmaY = iValue;
if (WAVE_GetValue(fp, "NoiseSigmaCb", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrNoiseSigmaCb = iValue;
if (WAVE_GetValue(fp, "NoiseSigmaCr", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrNoiseSigmaCr = iValue;
if (WAVE_GetValue(fp, "IntraNoiseWeightY", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrIntraWeightY = iValue;
if (WAVE_GetValue(fp, "IntraNoiseWeightCb", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrIntraWeightCb= iValue;
if (WAVE_GetValue(fp, "IntraNoiseWeightCr", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrIntraWeightCr = iValue;
if (WAVE_GetValue(fp, "InterNoiseWeightY", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrInterWeightY = iValue;
if (WAVE_GetValue(fp, "InterNoiseWeightCb", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrInterWeightCb = iValue;
if (WAVE_GetValue(fp, "InterNoiseWeightCr", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.nrInterWeightCr = iValue;
/*======================================================*/
/* newly added for WAVE Encoder */
/*======================================================*/
if (WAVE_GetValue(fp, "WeightedPred", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.weightPredEnable = iValue & 1;
if (WAVE_GetValue(fp, "EnBgDetect", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.bgDetectEnable = iValue;
if (WAVE_GetValue(fp, "BgThDiff", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.bgThrDiff = iValue;
if (WAVE_GetValue(fp, "S2fmeOff", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.s2fmeDisable = iValue;
if (WAVE_GetValue(fp, "BgThMeanDiff", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.bgThrMeanDiff = iValue;
if (WAVE_GetValue(fp, "BgLambdaQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.bgLambdaQp = iValue;
if (WAVE_GetValue(fp, "BgDeltaQp", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.bgDeltaQp = iValue;
if (WAVE_GetValue(fp, "EnCustomLambda", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.customLambdaEnable = iValue;
if (WAVE_GetValue(fp, "EnCustomMD", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.customMDEnable = iValue;
if (WAVE_GetValue(fp, "DisableCoefClear", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.coefClearDisable = iValue;
if (WAVE_GetValue(fp, "PU04DeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu04DeltaRate = iValue;
if (WAVE_GetValue(fp, "PU08DeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu08DeltaRate = iValue;
if (WAVE_GetValue(fp, "PU16DeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu16DeltaRate = iValue;
if (WAVE_GetValue(fp, "PU32DeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu32DeltaRate = iValue;
if (WAVE_GetValue(fp, "PU04IntraPlanarDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu04IntraPlanarDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU04IntraDcDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu04IntraDcDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU04IntraAngleDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu04IntraAngleDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU08IntraPlanarDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu08IntraPlanarDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU08IntraDcDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu08IntraDcDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU08IntraAngleDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu08IntraAngleDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU16IntraPlanarDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu16IntraPlanarDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU16IntraDcDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu16IntraDcDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU16IntraAngleDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu16IntraAngleDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU32IntraPlanarDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu32IntraPlanarDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU32IntraDcDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu32IntraDcDeltaRate = iValue;
if (WAVE_GetValue(fp, "PU32IntraAngleDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.pu32IntraAngleDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU08IntraDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu08IntraDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU08InterDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu08InterDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU08MergeDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu08MergeDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU16IntraDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu16IntraDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU16InterDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu16InterDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU16MergeDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu16MergeDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU32IntraDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu32IntraDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU32InterDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu32InterDeltaRate = iValue;
if (WAVE_GetValue(fp, "CU32MergeDeltaRate", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.cu32MergeDeltaRate = iValue;
/*======================================================*/
/* only for H.264 encoder */
/*======================================================*/
if (WAVE_GetValue(fp, "IdrPeriod", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.idrPeriod = iValue;
if (WAVE_GetValue(fp, "Transform8x8", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.transform8x8 = iValue;
if (WAVE_GetValue(fp, "SliceMode", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.avcSliceMode = iValue;
if (WAVE_GetValue(fp, "SliceArg", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.avcSliceArg = iValue;
if (WAVE_GetValue(fp, "CABAC", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.entropyCodingMode = iValue;
if (WAVE_GetValue(fp, "RdoSkip", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.rdoSkip = iValue;
if (WAVE_GetValue(fp, "LambdaScaling", &iValue) == 0)
goto __end_parse;
else
pEncCfg->waveCfg.lambdaScalingEnable = iValue;
ret = 1; /* Success */
__end_parse:
osal_fclose(fp);
return ret;
}