//----------------------------------------------------------------------------- // 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 #include #include "vpuapi.h" #include "vpuapifunc.h" #include "main_helper.h" #include 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; iSrcFileName, 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= 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; }