[x265] [PATCH] consolidate param functionality into param.cpp
sagar at multicorewareinc.com
sagar at multicorewareinc.com
Mon Feb 24 14:43:54 CET 2014
# HG changeset patch
# User Sagar Kotecha <sagar at multicorewareinc.com>
# Date 1393249400 -19800
# Mon Feb 24 19:13:20 2014 +0530
# Node ID e7418fc7dbc61f11762a0adb634deaa2558241c2
# Parent 80caa9f00d7c24da67d6b24e7bf339fe74752ced
consolidate param functionality into param.cpp
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/common/CMakeLists.txt
--- a/source/common/CMakeLists.txt Sun Feb 23 21:25:22 2014 +0530
+++ b/source/common/CMakeLists.txt Mon Feb 24 19:13:20 2014 +0530
@@ -148,5 +148,6 @@
md5.cpp md5.h
TShortYUV.cpp TShortYUV.h mv.h
common.cpp common.h
+ param.cpp param.h
lowres.cpp lowres.h
piclist.cpp piclist.h)
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/common/common.cpp
--- a/source/common/common.cpp Sun Feb 23 21:25:22 2014 +0530
+++ b/source/common/common.cpp Mon Feb 24 19:13:20 2014 +0530
@@ -135,122 +135,6 @@
}
extern "C"
-void x265_param_default(x265_param *param)
-{
- memset(param, 0, sizeof(x265_param));
-
- /* Applying non-zero default values to all elements in the param structure */
- param->logLevel = X265_LOG_INFO;
- param->bEnableWavefront = 1;
- param->frameNumThreads = 0;
- param->poolNumThreads = 0;
- param->csvfn = NULL;
-
- /* Source specifications */
- param->internalBitDepth = x265_max_bit_depth;
- param->internalCsp = X265_CSP_I420;
-
- /* CU definitions */
- param->maxCUSize = 64;
- param->tuQTMaxInterDepth = 1;
- param->tuQTMaxIntraDepth = 1;
-
- /* Coding Structure */
- param->keyframeMin = 0;
- param->keyframeMax = 250;
- param->bOpenGOP = 1;
- param->bframes = 4;
- param->lookaheadDepth = 20;
- param->bFrameAdaptive = X265_B_ADAPT_TRELLIS;
- param->bBPyramid = 1;
- param->scenecutThreshold = 40; /* Magic number pulled in from x264 */
-
- /* Intra Coding Tools */
- param->bEnableConstrainedIntra = 0;
- param->bEnableStrongIntraSmoothing = 1;
-
- /* Inter Coding tools */
- param->searchMethod = X265_HEX_SEARCH;
- param->subpelRefine = 2;
- param->searchRange = 57;
- param->maxNumMergeCand = 2;
- param->bEnableWeightedPred = 1;
- param->bEnableWeightedBiPred = 0;
- param->bEnableEarlySkip = 0;
- param->bEnableCbfFastMode = 0;
- param->bEnableAMP = 1;
- param->bEnableRectInter = 1;
- param->rdLevel = 3;
- param->bEnableSignHiding = 1;
- param->bEnableTransformSkip = 0;
- param->bEnableTSkipFast = 0;
- param->maxNumReferences = 3;
-
- /* Loop Filter */
- param->bEnableLoopFilter = 1;
-
- /* SAO Loop Filter */
- param->bEnableSAO = 1;
- param->saoLcuBoundary = 0;
- param->saoLcuBasedOptimization = 1;
-
- /* Coding Quality */
- param->cbQpOffset = 0;
- param->crQpOffset = 0;
- param->rdPenalty = 0;
-
- /* Rate control options */
- param->rc.vbvMaxBitrate = 0;
- param->rc.vbvBufferSize = 0;
- param->rc.vbvBufferInit = 0.9;
- param->rc.rfConstant = 28;
- param->rc.bitrate = 0;
- param->rc.rateTolerance = 1.0;
- param->rc.qCompress = 0.6;
- param->rc.ipFactor = 1.4f;
- param->rc.pbFactor = 1.3f;
- param->rc.qpStep = 4;
- param->rc.rateControlMode = X265_RC_CRF;
- param->rc.qp = 32;
- param->rc.aqMode = X265_AQ_VARIANCE;
- param->rc.aqStrength = 1.0;
- param->rc.cuTree = 1;
-
- /* Quality Measurement Metrics */
- param->bEnablePsnr = 0;
- param->bEnableSsim = 0;
-
- /* Video Usability Information (VUI) */
- param->bEnableVuiParametersPresentFlag = 0;
- param->bEnableAspectRatioIdc = 0;
- param->aspectRatioIdc = 0;
- param->sarWidth = 0;
- param->sarHeight = 0;
- param->bEnableOverscanAppropriateFlag = 0;
- param->bEnableVideoSignalTypePresentFlag = 0;
- param->videoFormat = 5;
- param->bEnableVideoFullRangeFlag = 0;
- param->bEnableColorDescriptionPresentFlag = 0;
- param->colorPrimaries = 2;
- param->transferCharacteristics = 2;
- param->matrixCoeffs = 2;
- param->bEnableChromaLocInfoPresentFlag = 0;
- param->chromaSampleLocTypeTopField = 0;
- param->chromaSampleLocTypeBottomField = 0;
- param->bEnableFieldSeqFlag = 0;
- param->bEnableFrameFieldInfoPresentFlag = 0;
- param->bEnableDefaultDisplayWindowFlag = 0;
- param->defDispWinLeftOffset = 0;
- param->defDispWinRightOffset = 0;
- param->defDispWinTopOffset = 0;
- param->defDispWinBottomOffset = 0;
- param->bEnableVuiTimingInfoPresentFlag = 0;
- param->bEnableVuiHrdParametersPresentFlag = 0;
- param->bEnableBitstreamRestrictionFlag = 0;
- param->bEnableSubPicHrdParamsPresentFlag = 0;
-}
-
-extern "C"
void x265_picture_init(x265_param *param, x265_picture *pic)
{
memset(pic, 0, sizeof(x265_picture));
@@ -259,924 +143,3 @@
pic->colorSpace = param->internalCsp;
}
-extern "C"
-int x265_param_apply_profile(x265_param *param, const char *profile)
-{
- if (!profile)
- return 0;
- if (!strcmp(profile, "main"))
- {}
- else if (!strcmp(profile, "main10"))
- {
-#if HIGH_BIT_DEPTH
- param->internalBitDepth = 10;
-#else
- x265_log(param, X265_LOG_WARNING, "Main10 not supported, not compiled for 16bpp.\n");
- return -1;
-#endif
- }
- else if (!strcmp(profile, "mainstillpicture"))
- {
- param->keyframeMax = 1;
- param->bOpenGOP = 0;
- }
- else
- {
- x265_log(param, X265_LOG_ERROR, "unknown profile <%s>\n", profile);
- return -1;
- }
-
- return 0;
-}
-
-extern "C"
-int x265_param_default_preset(x265_param *param, const char *preset, const char *tune)
-{
- x265_param_default(param);
-
- if (preset)
- {
- char *end;
- int i = strtol(preset, &end, 10);
- if (*end == 0 && i >= 0 && i < (int)(sizeof(x265_preset_names) / sizeof(*x265_preset_names) - 1))
- preset = x265_preset_names[i];
-
- if (!strcmp(preset, "ultrafast"))
- {
- param->lookaheadDepth = 10;
- param->scenecutThreshold = 0; // disable lookahead
- param->maxCUSize = 32;
- param->searchRange = 25;
- param->bFrameAdaptive = 0;
- param->subpelRefine = 0;
- param->searchMethod = X265_DIA_SEARCH;
- param->bEnableRectInter = 0;
- param->bEnableAMP = 0;
- param->bEnableEarlySkip = 1;
- param->bEnableCbfFastMode = 1;
- param->bEnableSAO = 0;
- param->bEnableSignHiding = 0;
- param->bEnableWeightedPred = 0;
- param->maxNumReferences = 1;
- param->rc.aqStrength = 0.0;
- param->rc.aqMode = X265_AQ_NONE;
- param->rc.cuTree = 0;
- }
- else if (!strcmp(preset, "superfast"))
- {
- param->lookaheadDepth = 10;
- param->maxCUSize = 32;
- param->searchRange = 44;
- param->bFrameAdaptive = 0;
- param->subpelRefine = 1;
- param->bEnableRectInter = 0;
- param->bEnableAMP = 0;
- param->bEnableEarlySkip = 1;
- param->bEnableCbfFastMode = 1;
- param->bEnableWeightedPred = 0;
- param->maxNumReferences = 1;
- param->rc.aqStrength = 0.0;
- param->rc.aqMode = X265_AQ_NONE;
- param->rc.cuTree = 0;
- }
- else if (!strcmp(preset, "veryfast"))
- {
- param->lookaheadDepth = 15;
- param->maxCUSize = 32;
- param->bFrameAdaptive = 0;
- param->subpelRefine = 1;
- param->bEnableRectInter = 0;
- param->bEnableAMP = 0;
- param->bEnableEarlySkip = 1;
- param->bEnableCbfFastMode = 1;
- param->maxNumReferences = 1;
- param->rc.cuTree = 0;
- }
- else if (!strcmp(preset, "faster"))
- {
- param->lookaheadDepth = 15;
- param->bFrameAdaptive = 0;
- param->bEnableRectInter = 0;
- param->bEnableAMP = 0;
- param->bEnableEarlySkip = 1;
- param->bEnableCbfFastMode = 1;
- param->maxNumReferences = 1;
- param->rc.cuTree = 0;
- }
- else if (!strcmp(preset, "fast"))
- {
- param->lookaheadDepth = 15;
- param->bEnableRectInter = 0;
- param->bEnableAMP = 0;
- }
- else if (!strcmp(preset, "medium"))
- {
- /* defaults */
- }
- else if (!strcmp(preset, "slow"))
- {
- param->lookaheadDepth = 25;
- param->rdLevel = 4;
- param->subpelRefine = 3;
- param->maxNumMergeCand = 3;
- param->searchMethod = X265_STAR_SEARCH;
- }
- else if (!strcmp(preset, "slower"))
- {
- param->lookaheadDepth = 30;
- param->bframes = 8;
- param->tuQTMaxInterDepth = 2;
- param->tuQTMaxIntraDepth = 2;
- param->rdLevel = 6;
- param->subpelRefine = 3;
- param->maxNumMergeCand = 3;
- param->searchMethod = X265_STAR_SEARCH;
- }
- else if (!strcmp(preset, "veryslow"))
- {
- param->lookaheadDepth = 40;
- param->bframes = 8;
- param->tuQTMaxInterDepth = 3;
- param->tuQTMaxIntraDepth = 3;
- param->rdLevel = 6;
- param->subpelRefine = 4;
- param->maxNumMergeCand = 4;
- param->searchMethod = X265_STAR_SEARCH;
- param->maxNumReferences = 5;
- }
- else if (!strcmp(preset, "placebo"))
- {
- param->lookaheadDepth = 60;
- param->searchRange = 92;
- param->bframes = 8;
- param->tuQTMaxInterDepth = 4;
- param->tuQTMaxIntraDepth = 4;
- param->rdLevel = 6;
- param->subpelRefine = 5;
- param->maxNumMergeCand = 5;
- param->searchMethod = X265_STAR_SEARCH;
- param->bEnableTransformSkip = 1;
- param->maxNumReferences = 5;
- // TODO: optimized esa
- }
- else
- return -1;
- }
- if (tune)
- {
- if (!strcmp(tune, "psnr"))
- {
- param->rc.aqStrength = 0.0;
- }
- else if (!strcmp(tune, "ssim"))
- {
- param->rc.aqMode = X265_AQ_AUTO_VARIANCE;
- }
- else if (!strcmp(tune, "zero-latency"))
- {
- param->bFrameAdaptive = 0;
- param->bframes = 0;
- param->lookaheadDepth = 0;
- }
- else
- return -1;
- }
-
- return 0;
-}
-
-static inline int _confirm(x265_param *param, bool bflag, const char* message)
-{
- if (!bflag)
- return 0;
-
- x265_log(param, X265_LOG_ERROR, "%s\n", message);
- return 1;
-}
-
-int x265_check_params(x265_param *param)
-{
-#define CHECK(expr, msg) check_failed |= _confirm(param, expr, msg)
- int check_failed = 0; /* abort if there is a fatal configuration problem */
-
- CHECK(param->maxCUSize > 64,
- "max ctu size should be less than 64");
- CHECK(param->maxCUSize < 16,
- "Maximum partition width size should be larger than or equal to 16");
- if (check_failed == 1)
- return check_failed;
-
- uint32_t maxCUDepth = (uint32_t)g_convertToBit[param->maxCUSize];
- uint32_t tuQTMaxLog2Size = maxCUDepth + 2 - 1;
- uint32_t tuQTMinLog2Size = 2; //log2(4)
-
- CHECK((param->maxCUSize >> maxCUDepth) < 4,
- "Minimum partition width size should be larger than or equal to 8");
- CHECK(param->internalCsp != X265_CSP_I420 && param->internalCsp != X265_CSP_I444,
- "Only 4:2:0 and 4:4:4 color spaces is supported at this time");
-
- /* These checks might be temporary */
-#if HIGH_BIT_DEPTH
- CHECK(param->internalBitDepth != 10,
- "x265 was compiled for 10bit encodes, only 10bit inputs supported");
-#endif
-
- CHECK(param->internalBitDepth > x265_max_bit_depth,
- "internalBitDepth must be <= x265_max_bit_depth");
- CHECK(param->rc.qp < -6 * (param->internalBitDepth - 8) || param->rc.qp > 51,
- "QP exceeds supported range (-QpBDOffsety to 51)");
- CHECK(param->fpsNum == 0 || param->fpsDenom == 0,
- "Frame rate numerator and denominator must be specified");
- CHECK(param->searchMethod<0 || param->searchMethod> X265_FULL_SEARCH,
- "Search method is not supported value (0:DIA 1:HEX 2:UMH 3:HM 5:FULL)");
- CHECK(param->searchRange < 0,
- "Search Range must be more than 0");
- CHECK(param->searchRange >= 32768,
- "Search Range must be less than 32768");
- CHECK(param->subpelRefine > X265_MAX_SUBPEL_LEVEL,
- "subme must be less than or equal to X265_MAX_SUBPEL_LEVEL (7)");
- CHECK(param->subpelRefine < 0,
- "subme must be greater than or equal to 0");
- CHECK(param->frameNumThreads < 0,
- "frameNumThreads (--frame-threads) must be 0 or higher");
- CHECK(param->cbQpOffset < -12, "Min. Chroma Cb QP Offset is -12");
- CHECK(param->cbQpOffset > 12, "Max. Chroma Cb QP Offset is 12");
- CHECK(param->crQpOffset < -12, "Min. Chroma Cr QP Offset is -12");
- CHECK(param->crQpOffset > 12, "Max. Chroma Cr QP Offset is 12");
-
- CHECK((1u << tuQTMaxLog2Size) > param->maxCUSize,
- "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
-
- CHECK(param->tuQTMaxInterDepth < 1,
- "QuadtreeTUMaxDepthInter must be greater than or equal to 1");
- CHECK(param->maxCUSize < (1u << (tuQTMinLog2Size + param->tuQTMaxInterDepth - 1)),
- "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
- CHECK(param->tuQTMaxIntraDepth < 1,
- "QuadtreeTUMaxDepthIntra must be greater than or equal to 1");
- CHECK(param->maxCUSize < (1u << (tuQTMinLog2Size + param->tuQTMaxIntraDepth - 1)),
- "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
-
- CHECK(param->maxNumMergeCand < 1, "MaxNumMergeCand must be 1 or greater.");
- CHECK(param->maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller.");
-
- CHECK(param->maxNumReferences < 1, "maxNumReferences must be 1 or greater.");
- CHECK(param->maxNumReferences > MAX_NUM_REF, "maxNumReferences must be 16 or smaller.");
-
- CHECK(param->sourceWidth % TComSPS::getWinUnitX(param->internalCsp) != 0,
- "Picture width must be an integer multiple of the specified chroma subsampling");
- CHECK(param->sourceHeight % TComSPS::getWinUnitY(param->internalCsp) != 0,
- "Picture height must be an integer multiple of the specified chroma subsampling");
-
- CHECK(param->rc.rateControlMode<X265_RC_ABR || param->rc.rateControlMode> X265_RC_CRF,
- "Rate control mode is out of range");
- CHECK(param->rdLevel < 0 || param->rdLevel > 6,
- "RD Level is out of range");
- CHECK(param->bframes > param->lookaheadDepth,
- "Lookahead depth must be greater than the max consecutive bframe count");
- CHECK(param->bframes < 0,
- "bframe count should be greater than zero");
- CHECK(param->bframes > X265_BFRAME_MAX,
- "max consecutive bframe count must be 16 or smaller");
- CHECK(param->lookaheadDepth > X265_LOOKAHEAD_MAX,
- "Lookahead depth must be less than 256");
- CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_AUTO_VARIANCE < param->rc.aqMode,
- "Aq-Mode is out of range");
- CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,
- "Aq-Strength is out of range");
-
- // max CU size should be power of 2
- uint32_t i = param->maxCUSize;
- while (i)
- {
- i >>= 1;
- if ((i & 1) == 1)
- CHECK(i != 1, "Max CU size should be 2^n");
- }
-
- CHECK(param->bEnableWavefront < 0, "WaveFrontSynchro cannot be negative");
- CHECK((param->aspectRatioIdc < 0
- || param->aspectRatioIdc > 16)
- && param->aspectRatioIdc != X265_EXTENDED_SAR,
- "Sample Aspect Ratio must be 0-16 or 255");
- CHECK(param->aspectRatioIdc == X265_EXTENDED_SAR && param->sarWidth <= 0,
- "Sample Aspect Ratio width must be greater than 0");
- CHECK(param->aspectRatioIdc == X265_EXTENDED_SAR && param->sarHeight <= 0,
- "Sample Aspect Ratio height must be greater than 0");
- CHECK(param->videoFormat < 0 || param->videoFormat > 5,
- "Video Format must be Component component,"
- " pal, ntsc, secam, mac or undef");
- CHECK(param->colorPrimaries < 0
- || param->colorPrimaries > 9
- || param->colorPrimaries == 3,
- "Color Primaries must be undef, bt709, bt470m,"
- " bt470bg, smpte170m, smpte240m, film or bt2020");
- CHECK(param->transferCharacteristics < 0
- || param->transferCharacteristics > 15
- || param->transferCharacteristics == 3,
- "Transfer Characteristics must be undef, bt709, bt470m, bt470bg,"
- " smpte170m, smpte240m, linear, log100, log316, iec61966-2-4, bt1361e,"
- " iec61966-2-1, bt2020-10 or bt2020-12");
- CHECK(param->matrixCoeffs < 0
- || param->matrixCoeffs > 10
- || param->matrixCoeffs == 3,
- "Matrix Coefficients must be undef, bt709, fcc, bt470bg, smpte170m,"
- " smpte240m, GBR, YCgCo, bt2020nc or bt2020c");
- CHECK(param->chromaSampleLocTypeTopField < 0
- || param->chromaSampleLocTypeTopField > 5,
- "Chroma Sample Location Type Top Field must be 0-5");
- CHECK(param->chromaSampleLocTypeBottomField < 0
- || param->chromaSampleLocTypeBottomField > 5,
- "Chroma Sample Location Type Bottom Field must be 0-5");
- CHECK(param->defDispWinLeftOffset < 0,
- "Default Display Window Left Offset must be 0 or greater");
- CHECK(param->defDispWinRightOffset < 0,
- "Default Display Window Right Offset must be 0 or greater");
- CHECK(param->defDispWinTopOffset < 0,
- "Default Display Window Top Offset must be 0 or greater");
- CHECK(param->defDispWinBottomOffset < 0,
- "Default Display Window Bottom Offset must be 0 or greater");
- return check_failed;
-}
-
-int x265_set_globals(x265_param *param)
-{
- uint32_t maxCUDepth = (uint32_t)g_convertToBit[param->maxCUSize];
- uint32_t tuQTMinLog2Size = 2; //log2(4)
-
- static int once /* = 0 */;
-
- if (ATOMIC_CAS32(&once, 0, 1) == 1)
- {
- if (param->maxCUSize != g_maxCUWidth)
- {
- x265_log(param, X265_LOG_ERROR, "maxCUSize must be the same for all encoders in a single process");
- return -1;
- }
- if (param->internalBitDepth != g_bitDepth)
- {
- x265_log(param, X265_LOG_ERROR, "internalBitDepth must be the same for all encoders in a single process");
- return -1;
- }
- }
- else
- {
- // set max CU width & height
- g_maxCUWidth = param->maxCUSize;
- g_maxCUHeight = param->maxCUSize;
- g_bitDepth = param->internalBitDepth;
-
- // compute actual CU depth with respect to config depth and max transform size
- g_addCUDepth = 0;
- while ((param->maxCUSize >> maxCUDepth) > (1u << (tuQTMinLog2Size + g_addCUDepth)))
- {
- g_addCUDepth++;
- }
-
- maxCUDepth += g_addCUDepth;
- g_addCUDepth++;
- g_maxCUDepth = maxCUDepth;
-
- // initialize partition order
- uint32_t* tmp = &g_zscanToRaster[0];
- initZscanToRaster(g_maxCUDepth + 1, 1, 0, tmp);
- initRasterToZscan(g_maxCUWidth, g_maxCUHeight, g_maxCUDepth + 1);
-
- // initialize conversion matrix from partition index to pel
- initRasterToPelXY(g_maxCUWidth, g_maxCUHeight, g_maxCUDepth + 1);
- }
- return 0;
-}
-
-void x265_print_params(x265_param *param)
-{
- if (param->logLevel < X265_LOG_INFO)
- return;
-#if HIGH_BIT_DEPTH
- x265_log(param, X265_LOG_INFO, "Internal bit depth : %d\n", param->internalBitDepth);
-#endif
- x265_log(param, X265_LOG_INFO, "CU size : %d\n", param->maxCUSize);
- x265_log(param, X265_LOG_INFO, "Max RQT depth inter / intra : %d / %d\n", param->tuQTMaxInterDepth, param->tuQTMaxIntraDepth);
-
- x265_log(param, X265_LOG_INFO, "ME / range / subpel / merge : %s / %d / %d / %d\n",
- x265_motion_est_names[param->searchMethod], param->searchRange, param->subpelRefine, param->maxNumMergeCand);
- if (param->keyframeMax != INT_MAX || param->scenecutThreshold)
- {
- x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut : %d / %d / %d\n", param->keyframeMin, param->keyframeMax, param->scenecutThreshold);
- }
- else
- {
- x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut : disabled\n");
- }
- if (param->cbQpOffset || param->crQpOffset)
- {
- x265_log(param, X265_LOG_INFO, "Cb/Cr QP Offset : %d / %d\n", param->cbQpOffset, param->crQpOffset);
- }
- if (param->rdPenalty)
- {
- x265_log(param, X265_LOG_INFO, "RDpenalty : %d\n", param->rdPenalty);
- }
- x265_log(param, X265_LOG_INFO, "Lookahead / bframes / badapt : %d / %d / %d\n", param->lookaheadDepth, param->bframes, param->bFrameAdaptive);
- x265_log(param, X265_LOG_INFO, "b-pyramid / weightp / refs : %d / %d / %d\n", param->bBPyramid, param->bEnableWeightedPred, param->maxNumReferences);
- switch (param->rc.rateControlMode)
- {
- case X265_RC_ABR:
- x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : ABR-%d kbps / %0.1f / %d\n", param->rc.bitrate,
- param->rc.aqStrength, param->rc.cuTree);
- break;
- case X265_RC_CQP:
- x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : CQP-%d / %0.1f / %d\n", param->rc.qp, param->rc.aqStrength,
- param->rc.cuTree);
- break;
- case X265_RC_CRF:
- x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : CRF-%0.1f / %0.1f / %d\n", param->rc.rfConstant,
- param->rc.aqStrength, param->rc.cuTree);
- break;
- }
-
- x265_log(param, X265_LOG_INFO, "tools: ");
-#define TOOLOPT(FLAG, STR) if (FLAG) fprintf(stderr, "%s ", STR)
- TOOLOPT(param->bEnableRectInter, "rect");
- TOOLOPT(param->bEnableAMP, "amp");
- TOOLOPT(param->bEnableCbfFastMode, "cfm");
- TOOLOPT(param->bEnableConstrainedIntra, "cip");
- TOOLOPT(param->bEnableEarlySkip, "esd");
- fprintf(stderr, "rd=%d ", param->rdLevel);
-
- TOOLOPT(param->bEnableLoopFilter, "lft");
- if (param->bEnableSAO)
- {
- if (param->saoLcuBasedOptimization)
- fprintf(stderr, "sao-lcu ");
- else
- fprintf(stderr, "sao-frame ");
- }
- TOOLOPT(param->bEnableSignHiding, "sign-hide");
- if (param->bEnableTransformSkip)
- {
- if (param->bEnableTSkipFast)
- fprintf(stderr, "tskip(fast) ");
- else
- fprintf(stderr, "tskip ");
- }
- TOOLOPT(param->bEnableWeightedBiPred, "weightbp");
- fprintf(stderr, "\n");
- fflush(stderr);
-}
-
-static int x265_atobool(const char *str, bool& bError)
-{
- if (!strcmp(str, "1") ||
- !strcmp(str, "true") ||
- !strcmp(str, "yes"))
- return 1;
- if (!strcmp(str, "0") ||
- !strcmp(str, "false") ||
- !strcmp(str, "no"))
- return 0;
- bError = true;
- return 0;
-}
-
-static int x265_atoi(const char *str, bool& bError)
-{
- char *end;
- int v = strtol(str, &end, 0);
-
- if (end == str || *end != '\0')
- bError = true;
- return v;
-}
-
-static double x265_atof(const char *str, bool& bError)
-{
- char *end;
- double v = strtod(str, &end);
-
- if (end == str || *end != '\0')
- bError = true;
- return v;
-}
-
-static int parseName(const char *arg, const char * const * names, bool& bError)
-{
- for (int i = 0; names[i]; i++)
- {
- if (!strcmp(arg, names[i]))
- {
- return i;
- }
- }
-
- return x265_atoi(arg, bError);
-}
-
-/* internal versions of string-to-int with additional error checking */
-#undef atoi
-#undef atof
-#define atoi(str) x265_atoi(str, bError)
-#define atof(str) x265_atof(str, bError)
-#define atobool(str) (bNameWasBool = true, x265_atobool(str, bError))
-
-extern "C"
-int x265_param_parse(x265_param *p, const char *name, const char *value)
-{
- bool bError = false;
- bool bNameWasBool = false;
- bool bValueWasNull = !value;
- char nameBuf[64];
-
- if (!name)
- return X265_PARAM_BAD_NAME;
-
- // s/_/-/g
- if (strlen(name) + 1 < sizeof(nameBuf) && strchr(name, '_'))
- {
- char *c;
- strcpy(nameBuf, name);
- while ((c = strchr(nameBuf, '_')) != 0)
- {
- *c = '-';
- }
-
- name = nameBuf;
- }
-
- if (!strncmp(name, "no-", 3))
- {
- name += 3;
- value = !value || x265_atobool(value, bError) ? "false" : "true";
- }
- else if (!strncmp(name, "no", 2))
- {
- name += 2;
- value = !value || x265_atobool(value, bError) ? "false" : "true";
- }
- else if (!value)
- value = "true";
- else if (value[0] == '=')
- value++;
-
-#if defined(_MSC_VER)
-#pragma warning(disable: 4127) // conditional expression is constant
-#endif
-#define OPT(STR) else if (!strcmp(name, STR))
- if (0) ;
- OPT("fps")
- {
- if (sscanf(value, "%u/%u", &p->fpsNum, &p->fpsDenom) == 2)
- ;
- else
- {
- float fps = (float)atof(value);
- if (fps > 0 && fps <= INT_MAX / 1000)
- {
- p->fpsNum = (int)(fps * 1000 + .5);
- p->fpsDenom = 1000;
- }
- else
- {
- p->fpsNum = atoi(value);
- p->fpsDenom = 1;
- }
- }
- }
- OPT("csv") p->csvfn = value;
- OPT("threads") p->poolNumThreads = atoi(value);
- OPT("frame-threads") p->frameNumThreads = atoi(value);
- OPT("log") p->logLevel = atoi(value);
- OPT("wpp") p->bEnableWavefront = atobool(value);
- OPT("ctu") p->maxCUSize = (uint32_t)atoi(value);
- OPT("tu-intra-depth") p->tuQTMaxIntraDepth = (uint32_t)atoi(value);
- OPT("tu-inter-depth") p->tuQTMaxInterDepth = (uint32_t)atoi(value);
- OPT("subme") p->subpelRefine = atoi(value);
- OPT("merange") p->searchRange = atoi(value);
- OPT("rect") p->bEnableRectInter = atobool(value);
- OPT("amp") p->bEnableAMP = atobool(value);
- OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value);
- OPT("early-skip") p->bEnableEarlySkip = atobool(value);
- OPT("fast-cbf") p->bEnableCbfFastMode = atobool(value);
- OPT("rdpenalty") p->rdPenalty = atoi(value);
- OPT("tskip") p->bEnableTransformSkip = atobool(value);
- OPT("no-tskip-fast") p->bEnableTSkipFast = atobool(value);
- OPT("tskip-fast") p->bEnableTSkipFast = atobool(value);
- OPT("strong-intra-smoothing") p->bEnableStrongIntraSmoothing = atobool(value);
- OPT("constrained-intra") p->bEnableConstrainedIntra = atobool(value);
- OPT("open-gop") p->bOpenGOP = atobool(value);
- OPT("scenecut") p->scenecutThreshold = atoi(value);
- OPT("keyint") p->keyframeMax = atoi(value);
- OPT("min-keyint") p->keyframeMin = atoi(value);
- OPT("rc-lookahead") p->lookaheadDepth = atoi(value);
- OPT("bframes") p->bframes = atoi(value);
- OPT("bframe-bias") p->bFrameBias = atoi(value);
- OPT("b-adapt") p->bFrameAdaptive = atoi(value);
- OPT("ref") p->maxNumReferences = atoi(value);
- OPT("weightp") p->bEnableWeightedPred = atobool(value);
- OPT("cbqpoffs") p->cbQpOffset = atoi(value);
- OPT("crqpoffs") p->crQpOffset = atoi(value);
- OPT("rd") p->rdLevel = atoi(value);
- OPT("signhide") p->bEnableSignHiding = atobool(value);
- OPT("lft") p->bEnableLoopFilter = atobool(value);
- OPT("sao") p->bEnableSAO = atobool(value);
- OPT("sao-lcu-bounds") p->saoLcuBoundary = atoi(value);
- OPT("sao-lcu-opt") p->saoLcuBasedOptimization = atoi(value);
- OPT("ssim") p->bEnableSsim = atobool(value);
- OPT("psnr") p->bEnablePsnr = atobool(value);
- OPT("hash") p->decodedPictureHashSEI = atoi(value);
- OPT("b-pyramid") p->bBPyramid = atobool(value);
- OPT("aq-mode") p->rc.aqMode = atoi(value);
- OPT("aq-strength") p->rc.aqStrength = atof(value);
- OPT("vbv-maxrate") p->rc.vbvMaxBitrate = atoi(value);
- OPT("vbv-bufsize") p->rc.vbvBufferSize = atoi(value);
- OPT("vbv-init") p->rc.vbvBufferInit = atof(value);
- OPT("crf")
- {
- p->rc.rfConstant = atof(value);
- p->rc.rateControlMode = X265_RC_CRF;
- }
- OPT("bitrate")
- {
- p->rc.bitrate = atoi(value);
- p->rc.rateControlMode = X265_RC_ABR;
- }
- OPT("qp")
- {
- p->rc.qp = atoi(value);
- p->rc.rateControlMode = X265_RC_CQP;
- }
- OPT("input-csp") p->internalCsp = parseName(value, x265_source_csp_names, bError);
- OPT("me") p->searchMethod = parseName(value, x265_motion_est_names, bError);
- OPT("cutree") p->rc.cuTree = atobool(value);
- OPT("vui")
- {
- int bvalue = atobool(value);
-
- p->bEnableVuiParametersPresentFlag = bvalue;
- p->bEnableAspectRatioIdc = bvalue;
- p->bEnableOverscanInfoPresentFlag = bvalue;
- p->bEnableVideoSignalTypePresentFlag = bvalue;
- p->bEnableColorDescriptionPresentFlag = bvalue;
- p->bEnableChromaLocInfoPresentFlag = bvalue;
- p->bEnableFieldSeqFlag = bvalue;
- p->bEnableFrameFieldInfoPresentFlag = bvalue;
- p->bEnableDefaultDisplayWindowFlag = bvalue;
- p->bEnableVuiTimingInfoPresentFlag = bvalue;
- p->bEnableVuiHrdParametersPresentFlag = bvalue;
- p->bEnableBitstreamRestrictionFlag = bvalue;
- p->bEnableSubPicHrdParamsPresentFlag = bvalue;
- }
- OPT("sar")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableAspectRatioIdc = atobool(value);
- p->aspectRatioIdc = atoi(value);
- }
- OPT("extended-sar")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableAspectRatioIdc = 1;
- p->aspectRatioIdc = X265_EXTENDED_SAR;
- bError |= sscanf(value, "%dx%d", &p->sarWidth, &p->sarHeight) != 2;
- }
- OPT("overscan")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- if (!strcmp(value, "show"))
- p->bEnableOverscanInfoPresentFlag = 1;
- else if (!strcmp(value, "crop"))
- {
- p->bEnableOverscanInfoPresentFlag = 1;
- p->bEnableOverscanAppropriateFlag = 1;
- }
- else
- p->bEnableOverscanInfoPresentFlag = -1;
- }
- OPT("videoformat")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVideoSignalTypePresentFlag = 1;
- if (!strcmp(value, "component"))
- p->videoFormat = 0;
- else if (!strcmp(value, "pal"))
- p->videoFormat = 1;
- else if (!strcmp(value, "ntsc"))
- p->videoFormat = 2;
- else if (!strcmp(value, "secam"))
- p->videoFormat = 3;
- else if (!strcmp(value, "mac"))
- p->videoFormat = 4;
- else if (!strcmp(value, "undef"))
- p->videoFormat = 5;
- else
- p->videoFormat = -1;
- }
- OPT("range")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVideoSignalTypePresentFlag = atobool(value);
- p->bEnableVideoFullRangeFlag = atobool(value);
- }
- OPT("colorprim")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVideoSignalTypePresentFlag = 1;
- p->bEnableColorDescriptionPresentFlag = 1;
- if (!strcmp(value, "bt709"))
- p->colorPrimaries = 1;
- else if (!strcmp(value, "undef"))
- p->colorPrimaries = 2;
- else if (!strcmp(value, "bt470m"))
- p->colorPrimaries = 4;
- else if (!strcmp(value, "bt470bg"))
- p->colorPrimaries = 5;
- else if (!strcmp(value, "smpte170m"))
- p->colorPrimaries = 6;
- else if (!strcmp(value, "smpte240m"))
- p->colorPrimaries = 7;
- else if (!strcmp(value, "film"))
- p->colorPrimaries = 8;
- else if (!strcmp(value, "bt2020"))
- p->colorPrimaries = 9;
- else
- p->colorPrimaries = -1;
- }
- OPT("transfer")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVideoSignalTypePresentFlag = 1;
- p->bEnableColorDescriptionPresentFlag = 1;
- if (!strcmp(value, "bt709"))
- p->transferCharacteristics = 1;
- else if (!strcmp(value, "undef"))
- p->transferCharacteristics = 2;
- else if (!strcmp(value, "bt470m"))
- p->transferCharacteristics = 4;
- else if (!strcmp(value, "bt470bg"))
- p->transferCharacteristics = 5;
- else if (!strcmp(value, "smpte170m"))
- p->transferCharacteristics = 6;
- else if (!strcmp(value, "smpte240m"))
- p->transferCharacteristics = 7;
- else if (!strcmp(value, "linear"))
- p->transferCharacteristics = 8;
- else if (!strcmp(value, "log100"))
- p->transferCharacteristics = 9;
- else if (!strcmp(value, "log316"))
- p->transferCharacteristics = 10;
- else if (!strcmp(value, "iec61966-2-4"))
- p->transferCharacteristics = 11;
- else if (!strcmp(value, "bt1361e"))
- p->transferCharacteristics = 12;
- else if (!strcmp(value, "iec61966-2-1"))
- p->transferCharacteristics = 13;
- else if (!strcmp(value, "bt2020-10"))
- p->transferCharacteristics = 14;
- else if (!strcmp(value, "bt2020-12"))
- p->transferCharacteristics = 15;
- else
- p->transferCharacteristics = -1;
- }
- OPT("colormatrix")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVideoSignalTypePresentFlag = 1;
- p->bEnableColorDescriptionPresentFlag = 1;
- if (!strcmp(value, "GBR"))
- p->matrixCoeffs = 0;
- else if (!strcmp(value, "bt709"))
- p->matrixCoeffs = 1;
- else if (!strcmp(value, "undef"))
- p->matrixCoeffs = 2;
- else if (!strcmp(value, "fcc"))
- p->matrixCoeffs = 4;
- else if (!strcmp(value, "bt470bg"))
- p->matrixCoeffs = 5;
- else if (!strcmp(value, "smpte170m"))
- p->matrixCoeffs = 6;
- else if (!strcmp(value, "smpte240m"))
- p->matrixCoeffs = 7;
- else if (!strcmp(value, "YCgCo"))
- p->matrixCoeffs = 8;
- else if (!strcmp(value, "bt2020nc"))
- p->matrixCoeffs = 9;
- else if (!strcmp(value, "bt2020c"))
- p->matrixCoeffs = 10;
- else
- p->matrixCoeffs = -1;
- }
- OPT("chromaloc")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableChromaLocInfoPresentFlag = 1;
- p->chromaSampleLocTypeTopField = atoi(value);
- p->chromaSampleLocTypeBottomField = p->chromaSampleLocTypeTopField;
- }
- OPT("fieldseq")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableFieldSeqFlag = atobool(value);
- }
- OPT("framefieldinfo")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableFrameFieldInfoPresentFlag = atobool(value);
- }
- OPT("crop-rect")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableDefaultDisplayWindowFlag = 1;
- bError |= sscanf(value, "%d,%d,%d,%d",
- &p->defDispWinLeftOffset,
- &p->defDispWinTopOffset,
- &p->defDispWinRightOffset,
- &p->defDispWinBottomOffset) != 4;
- }
- OPT("timinginfo")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVuiTimingInfoPresentFlag = atobool(value);
- }
- OPT("nal-hrd")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVuiTimingInfoPresentFlag = atobool(value);
- p->bEnableVuiHrdParametersPresentFlag = atobool(value);
- }
- OPT("bitstreamrestriction")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableBitstreamRestrictionFlag = atobool(value);
- }
- OPT("subpichrd")
- {
- p->bEnableVuiParametersPresentFlag = 1;
- p->bEnableVuiHrdParametersPresentFlag = atobool(value);
- p->bEnableSubPicHrdParamsPresentFlag = atobool(value);
- }
- else
- return X265_PARAM_BAD_NAME;
-#undef OPT
-#undef atobool
-#undef atoi
-#undef atof
-
- bError |= bValueWasNull && !bNameWasBool;
- return bError ? X265_PARAM_BAD_VALUE : 0;
-}
-
-char *x265_param2string(x265_param *p)
-{
- char *buf, *s;
-
- buf = s = X265_MALLOC(char, 2000);
- if (!buf)
- return NULL;
-
-#define BOOL(param, cliopt) \
- s += sprintf(s, " %s", (param) ? cliopt : "no-"cliopt);
-
- BOOL(p->bEnableWavefront, "wpp");
- s += sprintf(s, " fps=%d/%d", p->fpsNum, p->fpsDenom);
- s += sprintf(s, " ctu=%d", p->maxCUSize);
- s += sprintf(s, " tu-intra-depth=%d", p->tuQTMaxIntraDepth);
- s += sprintf(s, " tu-inter-depth=%d", p->tuQTMaxInterDepth);
- s += sprintf(s, " me=%d", p->searchMethod);
- s += sprintf(s, " subme=%d", p->subpelRefine);
- s += sprintf(s, " merange=%d", p->searchRange);
- BOOL(p->bEnableRectInter, "rect");
- BOOL(p->bEnableAMP, "amp");
- s += sprintf(s, " max-merge=%d", p->maxNumMergeCand);
- BOOL(p->bEnableEarlySkip, "early-skip");
- BOOL(p->bEnableCbfFastMode, "fast-cbf");
- s += sprintf(s, " rdpenalty=%d", p->rdPenalty);
- BOOL(p->bEnableTransformSkip, "tskip");
- BOOL(p->bEnableTSkipFast, "tskip-fast");
- BOOL(p->bEnableStrongIntraSmoothing, "strong-intra-smoothing");
- BOOL(p->bEnableConstrainedIntra, "constrained-intra");
- BOOL(p->bOpenGOP, "open-gop");
- s += sprintf(s, " keyint=%d", p->keyframeMax);
- s += sprintf(s, " min-keyint=%d", p->keyframeMin);
- s += sprintf(s, " scenecut=%d", p->scenecutThreshold);
- s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth);
- s += sprintf(s, " bframes=%d", p->bframes);
- s += sprintf(s, " bframe-bias=%d", p->bFrameBias);
- s += sprintf(s, " b-adapt=%d", p->bFrameAdaptive);
- s += sprintf(s, " ref=%d", p->maxNumReferences);
- BOOL(p->bEnableWeightedPred, "weightp");
- s += sprintf(s, " bitrate=%d", p->rc.bitrate);
- s += sprintf(s, " qp=%d", p->rc.qp);
- s += sprintf(s, " aq-mode=%d", p->rc.aqMode);
- s += sprintf(s, " aq-strength=%.2f", p->rc.aqStrength);
- s += sprintf(s, " cbqpoffs=%d", p->cbQpOffset);
- s += sprintf(s, " crqpoffs=%d", p->crQpOffset);
- s += sprintf(s, " rd=%d", p->rdLevel);
- BOOL(p->bEnableSignHiding, "signhide");
- BOOL(p->bEnableLoopFilter, "lft");
- BOOL(p->bEnableSAO, "sao");
- s += sprintf(s, " sao-lcu-bounds=%d", p->saoLcuBoundary);
- s += sprintf(s, " sao-lcu-opt=%d", p->saoLcuBasedOptimization);
- s += sprintf(s, " b-pyramid=%d", p->bBPyramid);
- BOOL(p->rc.cuTree, "cutree");
-#undef BOOL
-
- return buf;
-}
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/common/common.h
--- a/source/common/common.h Sun Feb 23 21:25:22 2014 +0530
+++ b/source/common/common.h Mon Feb 24 19:13:20 2014 +0530
@@ -112,11 +112,7 @@
/* defined in common.cpp */
int64_t x265_mdate(void);
void x265_log(x265_param *param, int level, const char *fmt, ...);
-int x265_check_params(x265_param *param);
-void x265_print_params(x265_param *param);
-int x265_set_globals(x265_param *param);
int x265_exp2fix8(double x);
-char *x265_param2string(x265_param *p);
void *x265_malloc(size_t size);
void x265_free(void *ptr);
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/common/param.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/source/common/param.cpp Mon Feb 24 19:13:20 2014 +0530
@@ -0,0 +1,1084 @@
+/*****************************************************************************
+ * Copyright (C) 2013 x265 project
+ *
+ * Authors: Deepthi Nandakumar <deepthi at multicorewareinc.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at licensing at multicorewareinc.com.
+ *****************************************************************************/
+
+#include "TLibCommon/TComSlice.h"
+#include "x265.h"
+#include "threading.h"
+#include "param.h"
+
+#include <climits>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+using namespace x265;
+
+extern "C"
+x265_param *x265_param_alloc()
+{
+ return (x265_param*)x265_malloc(sizeof(x265_param));
+}
+
+extern "C"
+void x265_param_free(x265_param *p)
+{
+ return x265_free(p);
+}
+
+extern "C"
+void x265_param_default(x265_param *param)
+{
+ memset(param, 0, sizeof(x265_param));
+
+ /* Applying non-zero default values to all elements in the param structure */
+ param->logLevel = X265_LOG_INFO;
+ param->bEnableWavefront = 1;
+ param->frameNumThreads = 0;
+ param->poolNumThreads = 0;
+ param->csvfn = NULL;
+
+ /* Source specifications */
+ param->internalBitDepth = x265_max_bit_depth;
+ param->internalCsp = X265_CSP_I420;
+
+ /* CU definitions */
+ param->maxCUSize = 64;
+ param->tuQTMaxInterDepth = 1;
+ param->tuQTMaxIntraDepth = 1;
+
+ /* Coding Structure */
+ param->keyframeMin = 0;
+ param->keyframeMax = 250;
+ param->bOpenGOP = 1;
+ param->bframes = 4;
+ param->lookaheadDepth = 20;
+ param->bFrameAdaptive = X265_B_ADAPT_TRELLIS;
+ param->bBPyramid = 1;
+ param->scenecutThreshold = 40; /* Magic number pulled in from x264 */
+
+ /* Intra Coding Tools */
+ param->bEnableConstrainedIntra = 0;
+ param->bEnableStrongIntraSmoothing = 1;
+
+ /* Inter Coding tools */
+ param->searchMethod = X265_HEX_SEARCH;
+ param->subpelRefine = 2;
+ param->searchRange = 57;
+ param->maxNumMergeCand = 2;
+ param->bEnableWeightedPred = 1;
+ param->bEnableWeightedBiPred = 0;
+ param->bEnableEarlySkip = 0;
+ param->bEnableCbfFastMode = 0;
+ param->bEnableAMP = 1;
+ param->bEnableRectInter = 1;
+ param->rdLevel = 3;
+ param->bEnableSignHiding = 1;
+ param->bEnableTransformSkip = 0;
+ param->bEnableTSkipFast = 0;
+ param->maxNumReferences = 3;
+
+ /* Loop Filter */
+ param->bEnableLoopFilter = 1;
+
+ /* SAO Loop Filter */
+ param->bEnableSAO = 1;
+ param->saoLcuBoundary = 0;
+ param->saoLcuBasedOptimization = 1;
+
+ /* Coding Quality */
+ param->cbQpOffset = 0;
+ param->crQpOffset = 0;
+ param->rdPenalty = 0;
+
+ /* Rate control options */
+ param->rc.vbvMaxBitrate = 0;
+ param->rc.vbvBufferSize = 0;
+ param->rc.vbvBufferInit = 0.9;
+ param->rc.rfConstant = 28;
+ param->rc.bitrate = 0;
+ param->rc.rateTolerance = 1.0;
+ param->rc.qCompress = 0.6;
+ param->rc.ipFactor = 1.4f;
+ param->rc.pbFactor = 1.3f;
+ param->rc.qpStep = 4;
+ param->rc.rateControlMode = X265_RC_CRF;
+ param->rc.qp = 32;
+ param->rc.aqMode = X265_AQ_VARIANCE;
+ param->rc.aqStrength = 1.0;
+ param->rc.cuTree = 1;
+
+ /* Quality Measurement Metrics */
+ param->bEnablePsnr = 0;
+ param->bEnableSsim = 0;
+
+ /* Video Usability Information (VUI) */
+ param->bEnableVuiParametersPresentFlag = 0;
+ param->bEnableAspectRatioIdc = 0;
+ param->aspectRatioIdc = 0;
+ param->sarWidth = 0;
+ param->sarHeight = 0;
+ param->bEnableOverscanAppropriateFlag = 0;
+ param->bEnableVideoSignalTypePresentFlag = 0;
+ param->videoFormat = 5;
+ param->bEnableVideoFullRangeFlag = 0;
+ param->bEnableColorDescriptionPresentFlag = 0;
+ param->colorPrimaries = 2;
+ param->transferCharacteristics = 2;
+ param->matrixCoeffs = 2;
+ param->bEnableChromaLocInfoPresentFlag = 0;
+ param->chromaSampleLocTypeTopField = 0;
+ param->chromaSampleLocTypeBottomField = 0;
+ param->bEnableFieldSeqFlag = 0;
+ param->bEnableFrameFieldInfoPresentFlag = 0;
+ param->bEnableDefaultDisplayWindowFlag = 0;
+ param->defDispWinLeftOffset = 0;
+ param->defDispWinRightOffset = 0;
+ param->defDispWinTopOffset = 0;
+ param->defDispWinBottomOffset = 0;
+ param->bEnableVuiTimingInfoPresentFlag = 0;
+ param->bEnableVuiHrdParametersPresentFlag = 0;
+ param->bEnableBitstreamRestrictionFlag = 0;
+ param->bEnableSubPicHrdParamsPresentFlag = 0;
+}
+
+extern "C"
+int x265_param_apply_profile(x265_param *param, const char *profile)
+{
+ if (!profile)
+ return 0;
+ if (!strcmp(profile, "main"))
+ {}
+ else if (!strcmp(profile, "main10"))
+ {
+#if HIGH_BIT_DEPTH
+ param->internalBitDepth = 10;
+#else
+ x265_log(param, X265_LOG_WARNING, "Main10 not supported, not compiled for 16bpp.\n");
+ return -1;
+#endif
+ }
+ else if (!strcmp(profile, "mainstillpicture"))
+ {
+ param->keyframeMax = 1;
+ param->bOpenGOP = 0;
+ }
+ else
+ {
+ x265_log(param, X265_LOG_ERROR, "unknown profile <%s>\n", profile);
+ return -1;
+ }
+
+ return 0;
+}
+
+extern "C"
+int x265_param_default_preset(x265_param *param, const char *preset, const char *tune)
+{
+ x265_param_default(param);
+
+ if (preset)
+ {
+ char *end;
+ int i = strtol(preset, &end, 10);
+ if (*end == 0 && i >= 0 && i < (int)(sizeof(x265_preset_names) / sizeof(*x265_preset_names) - 1))
+ preset = x265_preset_names[i];
+
+ if (!strcmp(preset, "ultrafast"))
+ {
+ param->lookaheadDepth = 10;
+ param->scenecutThreshold = 0; // disable lookahead
+ param->maxCUSize = 32;
+ param->searchRange = 25;
+ param->bFrameAdaptive = 0;
+ param->subpelRefine = 0;
+ param->searchMethod = X265_DIA_SEARCH;
+ param->bEnableRectInter = 0;
+ param->bEnableAMP = 0;
+ param->bEnableEarlySkip = 1;
+ param->bEnableCbfFastMode = 1;
+ param->bEnableSAO = 0;
+ param->bEnableSignHiding = 0;
+ param->bEnableWeightedPred = 0;
+ param->maxNumReferences = 1;
+ param->rc.aqStrength = 0.0;
+ param->rc.aqMode = X265_AQ_NONE;
+ param->rc.cuTree = 0;
+ }
+ else if (!strcmp(preset, "superfast"))
+ {
+ param->lookaheadDepth = 10;
+ param->maxCUSize = 32;
+ param->searchRange = 44;
+ param->bFrameAdaptive = 0;
+ param->subpelRefine = 1;
+ param->bEnableRectInter = 0;
+ param->bEnableAMP = 0;
+ param->bEnableEarlySkip = 1;
+ param->bEnableCbfFastMode = 1;
+ param->bEnableWeightedPred = 0;
+ param->maxNumReferences = 1;
+ param->rc.aqStrength = 0.0;
+ param->rc.aqMode = X265_AQ_NONE;
+ param->rc.cuTree = 0;
+ }
+ else if (!strcmp(preset, "veryfast"))
+ {
+ param->lookaheadDepth = 15;
+ param->maxCUSize = 32;
+ param->bFrameAdaptive = 0;
+ param->subpelRefine = 1;
+ param->bEnableRectInter = 0;
+ param->bEnableAMP = 0;
+ param->bEnableEarlySkip = 1;
+ param->bEnableCbfFastMode = 1;
+ param->maxNumReferences = 1;
+ param->rc.cuTree = 0;
+ }
+ else if (!strcmp(preset, "faster"))
+ {
+ param->lookaheadDepth = 15;
+ param->bFrameAdaptive = 0;
+ param->bEnableRectInter = 0;
+ param->bEnableAMP = 0;
+ param->bEnableEarlySkip = 1;
+ param->bEnableCbfFastMode = 1;
+ param->maxNumReferences = 1;
+ param->rc.cuTree = 0;
+ }
+ else if (!strcmp(preset, "fast"))
+ {
+ param->lookaheadDepth = 15;
+ param->bEnableRectInter = 0;
+ param->bEnableAMP = 0;
+ }
+ else if (!strcmp(preset, "medium"))
+ {
+ /* defaults */
+ }
+ else if (!strcmp(preset, "slow"))
+ {
+ param->lookaheadDepth = 25;
+ param->rdLevel = 4;
+ param->subpelRefine = 3;
+ param->maxNumMergeCand = 3;
+ param->searchMethod = X265_STAR_SEARCH;
+ }
+ else if (!strcmp(preset, "slower"))
+ {
+ param->lookaheadDepth = 30;
+ param->bframes = 8;
+ param->tuQTMaxInterDepth = 2;
+ param->tuQTMaxIntraDepth = 2;
+ param->rdLevel = 6;
+ param->subpelRefine = 3;
+ param->maxNumMergeCand = 3;
+ param->searchMethod = X265_STAR_SEARCH;
+ }
+ else if (!strcmp(preset, "veryslow"))
+ {
+ param->lookaheadDepth = 40;
+ param->bframes = 8;
+ param->tuQTMaxInterDepth = 3;
+ param->tuQTMaxIntraDepth = 3;
+ param->rdLevel = 6;
+ param->subpelRefine = 4;
+ param->maxNumMergeCand = 4;
+ param->searchMethod = X265_STAR_SEARCH;
+ param->maxNumReferences = 5;
+ }
+ else if (!strcmp(preset, "placebo"))
+ {
+ param->lookaheadDepth = 60;
+ param->searchRange = 92;
+ param->bframes = 8;
+ param->tuQTMaxInterDepth = 4;
+ param->tuQTMaxIntraDepth = 4;
+ param->rdLevel = 6;
+ param->subpelRefine = 5;
+ param->maxNumMergeCand = 5;
+ param->searchMethod = X265_STAR_SEARCH;
+ param->bEnableTransformSkip = 1;
+ param->maxNumReferences = 5;
+ // TODO: optimized esa
+ }
+ else
+ return -1;
+ }
+ if (tune)
+ {
+ if (!strcmp(tune, "psnr"))
+ {
+ param->rc.aqStrength = 0.0;
+ }
+ else if (!strcmp(tune, "ssim"))
+ {
+ param->rc.aqMode = X265_AQ_AUTO_VARIANCE;
+ }
+ else if (!strcmp(tune, "zero-latency"))
+ {
+ param->bFrameAdaptive = 0;
+ param->bframes = 0;
+ param->lookaheadDepth = 0;
+ }
+ else
+ return -1;
+ }
+
+ return 0;
+}
+
+static inline int _confirm(x265_param *param, bool bflag, const char* message)
+{
+ if (!bflag)
+ return 0;
+
+ x265_log(param, X265_LOG_ERROR, "%s\n", message);
+ return 1;
+}
+
+int x265_check_params(x265_param *param)
+{
+#define CHECK(expr, msg) check_failed |= _confirm(param, expr, msg)
+ int check_failed = 0; /* abort if there is a fatal configuration problem */
+
+ CHECK(param->maxCUSize > 64,
+ "max ctu size should be less than 64");
+ CHECK(param->maxCUSize < 16,
+ "Maximum partition width size should be larger than or equal to 16");
+ if (check_failed == 1)
+ return check_failed;
+
+ uint32_t maxCUDepth = (uint32_t)g_convertToBit[param->maxCUSize];
+ uint32_t tuQTMaxLog2Size = maxCUDepth + 2 - 1;
+ uint32_t tuQTMinLog2Size = 2; //log2(4)
+
+ CHECK((param->maxCUSize >> maxCUDepth) < 4,
+ "Minimum partition width size should be larger than or equal to 8");
+ CHECK(param->internalCsp != X265_CSP_I420 && param->internalCsp != X265_CSP_I444,
+ "Only 4:2:0 and 4:4:4 color spaces is supported at this time");
+
+ /* These checks might be temporary */
+#if HIGH_BIT_DEPTH
+ CHECK(param->internalBitDepth != 10,
+ "x265 was compiled for 10bit encodes, only 10bit inputs supported");
+#endif
+
+ CHECK(param->internalBitDepth > x265_max_bit_depth,
+ "internalBitDepth must be <= x265_max_bit_depth");
+ CHECK(param->rc.qp < -6 * (param->internalBitDepth - 8) || param->rc.qp > 51,
+ "QP exceeds supported range (-QpBDOffsety to 51)");
+ CHECK(param->fpsNum == 0 || param->fpsDenom == 0,
+ "Frame rate numerator and denominator must be specified");
+ CHECK(param->searchMethod<0 || param->searchMethod> X265_FULL_SEARCH,
+ "Search method is not supported value (0:DIA 1:HEX 2:UMH 3:HM 5:FULL)");
+ CHECK(param->searchRange < 0,
+ "Search Range must be more than 0");
+ CHECK(param->searchRange >= 32768,
+ "Search Range must be less than 32768");
+ CHECK(param->subpelRefine > X265_MAX_SUBPEL_LEVEL,
+ "subme must be less than or equal to X265_MAX_SUBPEL_LEVEL (7)");
+ CHECK(param->subpelRefine < 0,
+ "subme must be greater than or equal to 0");
+ CHECK(param->frameNumThreads < 0,
+ "frameNumThreads (--frame-threads) must be 0 or higher");
+ CHECK(param->cbQpOffset < -12, "Min. Chroma Cb QP Offset is -12");
+ CHECK(param->cbQpOffset > 12, "Max. Chroma Cb QP Offset is 12");
+ CHECK(param->crQpOffset < -12, "Min. Chroma Cr QP Offset is -12");
+ CHECK(param->crQpOffset > 12, "Max. Chroma Cr QP Offset is 12");
+
+ CHECK((1u << tuQTMaxLog2Size) > param->maxCUSize,
+ "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
+
+ CHECK(param->tuQTMaxInterDepth < 1,
+ "QuadtreeTUMaxDepthInter must be greater than or equal to 1");
+ CHECK(param->maxCUSize < (1u << (tuQTMinLog2Size + param->tuQTMaxInterDepth - 1)),
+ "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
+ CHECK(param->tuQTMaxIntraDepth < 1,
+ "QuadtreeTUMaxDepthIntra must be greater than or equal to 1");
+ CHECK(param->maxCUSize < (1u << (tuQTMinLog2Size + param->tuQTMaxIntraDepth - 1)),
+ "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
+
+ CHECK(param->maxNumMergeCand < 1, "MaxNumMergeCand must be 1 or greater.");
+ CHECK(param->maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller.");
+
+ CHECK(param->maxNumReferences < 1, "maxNumReferences must be 1 or greater.");
+ CHECK(param->maxNumReferences > MAX_NUM_REF, "maxNumReferences must be 16 or smaller.");
+
+ CHECK(param->sourceWidth % TComSPS::getWinUnitX(param->internalCsp) != 0,
+ "Picture width must be an integer multiple of the specified chroma subsampling");
+ CHECK(param->sourceHeight % TComSPS::getWinUnitY(param->internalCsp) != 0,
+ "Picture height must be an integer multiple of the specified chroma subsampling");
+
+ CHECK(param->rc.rateControlMode<X265_RC_ABR || param->rc.rateControlMode> X265_RC_CRF,
+ "Rate control mode is out of range");
+ CHECK(param->rdLevel < 0 || param->rdLevel > 6,
+ "RD Level is out of range");
+ CHECK(param->bframes > param->lookaheadDepth,
+ "Lookahead depth must be greater than the max consecutive bframe count");
+ CHECK(param->bframes < 0,
+ "bframe count should be greater than zero");
+ CHECK(param->bframes > X265_BFRAME_MAX,
+ "max consecutive bframe count must be 16 or smaller");
+ CHECK(param->lookaheadDepth > X265_LOOKAHEAD_MAX,
+ "Lookahead depth must be less than 256");
+ CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_AUTO_VARIANCE < param->rc.aqMode,
+ "Aq-Mode is out of range");
+ CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,
+ "Aq-Strength is out of range");
+
+ // max CU size should be power of 2
+ uint32_t i = param->maxCUSize;
+ while (i)
+ {
+ i >>= 1;
+ if ((i & 1) == 1)
+ CHECK(i != 1, "Max CU size should be 2^n");
+ }
+
+ CHECK(param->bEnableWavefront < 0, "WaveFrontSynchro cannot be negative");
+ CHECK((param->aspectRatioIdc < 0
+ || param->aspectRatioIdc > 16)
+ && param->aspectRatioIdc != X265_EXTENDED_SAR,
+ "Sample Aspect Ratio must be 0-16 or 255");
+ CHECK(param->aspectRatioIdc == X265_EXTENDED_SAR && param->sarWidth <= 0,
+ "Sample Aspect Ratio width must be greater than 0");
+ CHECK(param->aspectRatioIdc == X265_EXTENDED_SAR && param->sarHeight <= 0,
+ "Sample Aspect Ratio height must be greater than 0");
+ CHECK(param->videoFormat < 0 || param->videoFormat > 5,
+ "Video Format must be Component component,"
+ " pal, ntsc, secam, mac or undef");
+ CHECK(param->colorPrimaries < 0
+ || param->colorPrimaries > 9
+ || param->colorPrimaries == 3,
+ "Color Primaries must be undef, bt709, bt470m,"
+ " bt470bg, smpte170m, smpte240m, film or bt2020");
+ CHECK(param->transferCharacteristics < 0
+ || param->transferCharacteristics > 15
+ || param->transferCharacteristics == 3,
+ "Transfer Characteristics must be undef, bt709, bt470m, bt470bg,"
+ " smpte170m, smpte240m, linear, log100, log316, iec61966-2-4, bt1361e,"
+ " iec61966-2-1, bt2020-10 or bt2020-12");
+ CHECK(param->matrixCoeffs < 0
+ || param->matrixCoeffs > 10
+ || param->matrixCoeffs == 3,
+ "Matrix Coefficients must be undef, bt709, fcc, bt470bg, smpte170m,"
+ " smpte240m, GBR, YCgCo, bt2020nc or bt2020c");
+ CHECK(param->chromaSampleLocTypeTopField < 0
+ || param->chromaSampleLocTypeTopField > 5,
+ "Chroma Sample Location Type Top Field must be 0-5");
+ CHECK(param->chromaSampleLocTypeBottomField < 0
+ || param->chromaSampleLocTypeBottomField > 5,
+ "Chroma Sample Location Type Bottom Field must be 0-5");
+ CHECK(param->defDispWinLeftOffset < 0,
+ "Default Display Window Left Offset must be 0 or greater");
+ CHECK(param->defDispWinRightOffset < 0,
+ "Default Display Window Right Offset must be 0 or greater");
+ CHECK(param->defDispWinTopOffset < 0,
+ "Default Display Window Top Offset must be 0 or greater");
+ CHECK(param->defDispWinBottomOffset < 0,
+ "Default Display Window Bottom Offset must be 0 or greater");
+ return check_failed;
+}
+
+int x265_set_globals(x265_param *param)
+{
+ uint32_t maxCUDepth = (uint32_t)g_convertToBit[param->maxCUSize];
+ uint32_t tuQTMinLog2Size = 2; //log2(4)
+
+ static int once /* = 0 */;
+
+ if (ATOMIC_CAS32(&once, 0, 1) == 1)
+ {
+ if (param->maxCUSize != g_maxCUWidth)
+ {
+ x265_log(param, X265_LOG_ERROR, "maxCUSize must be the same for all encoders in a single process");
+ return -1;
+ }
+ if (param->internalBitDepth != g_bitDepth)
+ {
+ x265_log(param, X265_LOG_ERROR, "internalBitDepth must be the same for all encoders in a single process");
+ return -1;
+ }
+ }
+ else
+ {
+ // set max CU width & height
+ g_maxCUWidth = param->maxCUSize;
+ g_maxCUHeight = param->maxCUSize;
+ g_bitDepth = param->internalBitDepth;
+
+ // compute actual CU depth with respect to config depth and max transform size
+ g_addCUDepth = 0;
+ while ((param->maxCUSize >> maxCUDepth) > (1u << (tuQTMinLog2Size + g_addCUDepth)))
+ {
+ g_addCUDepth++;
+ }
+
+ maxCUDepth += g_addCUDepth;
+ g_addCUDepth++;
+ g_maxCUDepth = maxCUDepth;
+
+ // initialize partition order
+ uint32_t* tmp = &g_zscanToRaster[0];
+ initZscanToRaster(g_maxCUDepth + 1, 1, 0, tmp);
+ initRasterToZscan(g_maxCUWidth, g_maxCUHeight, g_maxCUDepth + 1);
+
+ // initialize conversion matrix from partition index to pel
+ initRasterToPelXY(g_maxCUWidth, g_maxCUHeight, g_maxCUDepth + 1);
+ }
+ return 0;
+}
+
+void x265_print_params(x265_param *param)
+{
+ if (param->logLevel < X265_LOG_INFO)
+ return;
+#if HIGH_BIT_DEPTH
+ x265_log(param, X265_LOG_INFO, "Internal bit depth : %d\n", param->internalBitDepth);
+#endif
+ x265_log(param, X265_LOG_INFO, "CU size : %d\n", param->maxCUSize);
+ x265_log(param, X265_LOG_INFO, "Max RQT depth inter / intra : %d / %d\n", param->tuQTMaxInterDepth, param->tuQTMaxIntraDepth);
+
+ x265_log(param, X265_LOG_INFO, "ME / range / subpel / merge : %s / %d / %d / %d\n",
+ x265_motion_est_names[param->searchMethod], param->searchRange, param->subpelRefine, param->maxNumMergeCand);
+ if (param->keyframeMax != INT_MAX || param->scenecutThreshold)
+ {
+ x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut : %d / %d / %d\n", param->keyframeMin, param->keyframeMax, param->scenecutThreshold);
+ }
+ else
+ {
+ x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut : disabled\n");
+ }
+ if (param->cbQpOffset || param->crQpOffset)
+ {
+ x265_log(param, X265_LOG_INFO, "Cb/Cr QP Offset : %d / %d\n", param->cbQpOffset, param->crQpOffset);
+ }
+ if (param->rdPenalty)
+ {
+ x265_log(param, X265_LOG_INFO, "RDpenalty : %d\n", param->rdPenalty);
+ }
+ x265_log(param, X265_LOG_INFO, "Lookahead / bframes / badapt : %d / %d / %d\n", param->lookaheadDepth, param->bframes, param->bFrameAdaptive);
+ x265_log(param, X265_LOG_INFO, "b-pyramid / weightp / refs : %d / %d / %d\n", param->bBPyramid, param->bEnableWeightedPred, param->maxNumReferences);
+ switch (param->rc.rateControlMode)
+ {
+ case X265_RC_ABR:
+ x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : ABR-%d kbps / %0.1f / %d\n", param->rc.bitrate,
+ param->rc.aqStrength, param->rc.cuTree);
+ break;
+ case X265_RC_CQP:
+ x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : CQP-%d / %0.1f / %d\n", param->rc.qp, param->rc.aqStrength,
+ param->rc.cuTree);
+ break;
+ case X265_RC_CRF:
+ x265_log(param, X265_LOG_INFO, "Rate Control / AQ-Strength / CUTree : CRF-%0.1f / %0.1f / %d\n", param->rc.rfConstant,
+ param->rc.aqStrength, param->rc.cuTree);
+ break;
+ }
+
+ x265_log(param, X265_LOG_INFO, "tools: ");
+#define TOOLOPT(FLAG, STR) if (FLAG) fprintf(stderr, "%s ", STR)
+ TOOLOPT(param->bEnableRectInter, "rect");
+ TOOLOPT(param->bEnableAMP, "amp");
+ TOOLOPT(param->bEnableCbfFastMode, "cfm");
+ TOOLOPT(param->bEnableConstrainedIntra, "cip");
+ TOOLOPT(param->bEnableEarlySkip, "esd");
+ fprintf(stderr, "rd=%d ", param->rdLevel);
+
+ TOOLOPT(param->bEnableLoopFilter, "lft");
+ if (param->bEnableSAO)
+ {
+ if (param->saoLcuBasedOptimization)
+ fprintf(stderr, "sao-lcu ");
+ else
+ fprintf(stderr, "sao-frame ");
+ }
+ TOOLOPT(param->bEnableSignHiding, "sign-hide");
+ if (param->bEnableTransformSkip)
+ {
+ if (param->bEnableTSkipFast)
+ fprintf(stderr, "tskip(fast) ");
+ else
+ fprintf(stderr, "tskip ");
+ }
+ TOOLOPT(param->bEnableWeightedBiPred, "weightbp");
+ fprintf(stderr, "\n");
+ fflush(stderr);
+}
+
+static int x265_atobool(const char *str, bool& bError)
+{
+ if (!strcmp(str, "1") ||
+ !strcmp(str, "true") ||
+ !strcmp(str, "yes"))
+ return 1;
+ if (!strcmp(str, "0") ||
+ !strcmp(str, "false") ||
+ !strcmp(str, "no"))
+ return 0;
+ bError = true;
+ return 0;
+}
+
+static int x265_atoi(const char *str, bool& bError)
+{
+ char *end;
+ int v = strtol(str, &end, 0);
+
+ if (end == str || *end != '\0')
+ bError = true;
+ return v;
+}
+
+static double x265_atof(const char *str, bool& bError)
+{
+ char *end;
+ double v = strtod(str, &end);
+
+ if (end == str || *end != '\0')
+ bError = true;
+ return v;
+}
+
+static int parseName(const char *arg, const char * const * names, bool& bError)
+{
+ for (int i = 0; names[i]; i++)
+ {
+ if (!strcmp(arg, names[i]))
+ {
+ return i;
+ }
+ }
+
+ return x265_atoi(arg, bError);
+}
+
+/* internal versions of string-to-int with additional error checking */
+#undef atoi
+#undef atof
+#define atoi(str) x265_atoi(str, bError)
+#define atof(str) x265_atof(str, bError)
+#define atobool(str) (bNameWasBool = true, x265_atobool(str, bError))
+
+extern "C"
+int x265_param_parse(x265_param *p, const char *name, const char *value)
+{
+ bool bError = false;
+ bool bNameWasBool = false;
+ bool bValueWasNull = !value;
+ char nameBuf[64];
+
+ if (!name)
+ return X265_PARAM_BAD_NAME;
+
+ // s/_/-/g
+ if (strlen(name) + 1 < sizeof(nameBuf) && strchr(name, '_'))
+ {
+ char *c;
+ strcpy(nameBuf, name);
+ while ((c = strchr(nameBuf, '_')) != 0)
+ {
+ *c = '-';
+ }
+
+ name = nameBuf;
+ }
+
+ if (!strncmp(name, "no-", 3))
+ {
+ name += 3;
+ value = !value || x265_atobool(value, bError) ? "false" : "true";
+ }
+ else if (!strncmp(name, "no", 2))
+ {
+ name += 2;
+ value = !value || x265_atobool(value, bError) ? "false" : "true";
+ }
+ else if (!value)
+ value = "true";
+ else if (value[0] == '=')
+ value++;
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4127) // conditional expression is constant
+#endif
+#define OPT(STR) else if (!strcmp(name, STR))
+ if (0) ;
+ OPT("fps")
+ {
+ if (sscanf(value, "%u/%u", &p->fpsNum, &p->fpsDenom) == 2)
+ ;
+ else
+ {
+ float fps = (float)atof(value);
+ if (fps > 0 && fps <= INT_MAX / 1000)
+ {
+ p->fpsNum = (int)(fps * 1000 + .5);
+ p->fpsDenom = 1000;
+ }
+ else
+ {
+ p->fpsNum = atoi(value);
+ p->fpsDenom = 1;
+ }
+ }
+ }
+ OPT("csv") p->csvfn = value;
+ OPT("threads") p->poolNumThreads = atoi(value);
+ OPT("frame-threads") p->frameNumThreads = atoi(value);
+ OPT("log") p->logLevel = atoi(value);
+ OPT("wpp") p->bEnableWavefront = atobool(value);
+ OPT("ctu") p->maxCUSize = (uint32_t)atoi(value);
+ OPT("tu-intra-depth") p->tuQTMaxIntraDepth = (uint32_t)atoi(value);
+ OPT("tu-inter-depth") p->tuQTMaxInterDepth = (uint32_t)atoi(value);
+ OPT("subme") p->subpelRefine = atoi(value);
+ OPT("merange") p->searchRange = atoi(value);
+ OPT("rect") p->bEnableRectInter = atobool(value);
+ OPT("amp") p->bEnableAMP = atobool(value);
+ OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value);
+ OPT("early-skip") p->bEnableEarlySkip = atobool(value);
+ OPT("fast-cbf") p->bEnableCbfFastMode = atobool(value);
+ OPT("rdpenalty") p->rdPenalty = atoi(value);
+ OPT("tskip") p->bEnableTransformSkip = atobool(value);
+ OPT("no-tskip-fast") p->bEnableTSkipFast = atobool(value);
+ OPT("tskip-fast") p->bEnableTSkipFast = atobool(value);
+ OPT("strong-intra-smoothing") p->bEnableStrongIntraSmoothing = atobool(value);
+ OPT("constrained-intra") p->bEnableConstrainedIntra = atobool(value);
+ OPT("open-gop") p->bOpenGOP = atobool(value);
+ OPT("scenecut") p->scenecutThreshold = atoi(value);
+ OPT("keyint") p->keyframeMax = atoi(value);
+ OPT("min-keyint") p->keyframeMin = atoi(value);
+ OPT("rc-lookahead") p->lookaheadDepth = atoi(value);
+ OPT("bframes") p->bframes = atoi(value);
+ OPT("bframe-bias") p->bFrameBias = atoi(value);
+ OPT("b-adapt") p->bFrameAdaptive = atoi(value);
+ OPT("ref") p->maxNumReferences = atoi(value);
+ OPT("weightp") p->bEnableWeightedPred = atobool(value);
+ OPT("cbqpoffs") p->cbQpOffset = atoi(value);
+ OPT("crqpoffs") p->crQpOffset = atoi(value);
+ OPT("rd") p->rdLevel = atoi(value);
+ OPT("signhide") p->bEnableSignHiding = atobool(value);
+ OPT("lft") p->bEnableLoopFilter = atobool(value);
+ OPT("sao") p->bEnableSAO = atobool(value);
+ OPT("sao-lcu-bounds") p->saoLcuBoundary = atoi(value);
+ OPT("sao-lcu-opt") p->saoLcuBasedOptimization = atoi(value);
+ OPT("ssim") p->bEnableSsim = atobool(value);
+ OPT("psnr") p->bEnablePsnr = atobool(value);
+ OPT("hash") p->decodedPictureHashSEI = atoi(value);
+ OPT("b-pyramid") p->bBPyramid = atobool(value);
+ OPT("aq-mode") p->rc.aqMode = atoi(value);
+ OPT("aq-strength") p->rc.aqStrength = atof(value);
+ OPT("vbv-maxrate") p->rc.vbvMaxBitrate = atoi(value);
+ OPT("vbv-bufsize") p->rc.vbvBufferSize = atoi(value);
+ OPT("vbv-init") p->rc.vbvBufferInit = atof(value);
+ OPT("crf")
+ {
+ p->rc.rfConstant = atof(value);
+ p->rc.rateControlMode = X265_RC_CRF;
+ }
+ OPT("bitrate")
+ {
+ p->rc.bitrate = atoi(value);
+ p->rc.rateControlMode = X265_RC_ABR;
+ }
+ OPT("qp")
+ {
+ p->rc.qp = atoi(value);
+ p->rc.rateControlMode = X265_RC_CQP;
+ }
+ OPT("input-csp") p->internalCsp = parseName(value, x265_source_csp_names, bError);
+ OPT("me") p->searchMethod = parseName(value, x265_motion_est_names, bError);
+ OPT("cutree") p->rc.cuTree = atobool(value);
+ OPT("vui")
+ {
+ int bvalue = atobool(value);
+
+ p->bEnableVuiParametersPresentFlag = bvalue;
+ p->bEnableAspectRatioIdc = bvalue;
+ p->bEnableOverscanInfoPresentFlag = bvalue;
+ p->bEnableVideoSignalTypePresentFlag = bvalue;
+ p->bEnableColorDescriptionPresentFlag = bvalue;
+ p->bEnableChromaLocInfoPresentFlag = bvalue;
+ p->bEnableFieldSeqFlag = bvalue;
+ p->bEnableFrameFieldInfoPresentFlag = bvalue;
+ p->bEnableDefaultDisplayWindowFlag = bvalue;
+ p->bEnableVuiTimingInfoPresentFlag = bvalue;
+ p->bEnableVuiHrdParametersPresentFlag = bvalue;
+ p->bEnableBitstreamRestrictionFlag = bvalue;
+ p->bEnableSubPicHrdParamsPresentFlag = bvalue;
+ }
+ OPT("sar")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableAspectRatioIdc = atobool(value);
+ p->aspectRatioIdc = atoi(value);
+ }
+ OPT("extended-sar")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableAspectRatioIdc = 1;
+ p->aspectRatioIdc = X265_EXTENDED_SAR;
+ bError |= sscanf(value, "%dx%d", &p->sarWidth, &p->sarHeight) != 2;
+ }
+ OPT("overscan")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ if (!strcmp(value, "show"))
+ p->bEnableOverscanInfoPresentFlag = 1;
+ else if (!strcmp(value, "crop"))
+ {
+ p->bEnableOverscanInfoPresentFlag = 1;
+ p->bEnableOverscanAppropriateFlag = 1;
+ }
+ else
+ p->bEnableOverscanInfoPresentFlag = -1;
+ }
+ OPT("videoformat")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVideoSignalTypePresentFlag = 1;
+ if (!strcmp(value, "component"))
+ p->videoFormat = 0;
+ else if (!strcmp(value, "pal"))
+ p->videoFormat = 1;
+ else if (!strcmp(value, "ntsc"))
+ p->videoFormat = 2;
+ else if (!strcmp(value, "secam"))
+ p->videoFormat = 3;
+ else if (!strcmp(value, "mac"))
+ p->videoFormat = 4;
+ else if (!strcmp(value, "undef"))
+ p->videoFormat = 5;
+ else
+ p->videoFormat = -1;
+ }
+ OPT("range")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVideoSignalTypePresentFlag = atobool(value);
+ p->bEnableVideoFullRangeFlag = atobool(value);
+ }
+ OPT("colorprim")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVideoSignalTypePresentFlag = 1;
+ p->bEnableColorDescriptionPresentFlag = 1;
+ if (!strcmp(value, "bt709"))
+ p->colorPrimaries = 1;
+ else if (!strcmp(value, "undef"))
+ p->colorPrimaries = 2;
+ else if (!strcmp(value, "bt470m"))
+ p->colorPrimaries = 4;
+ else if (!strcmp(value, "bt470bg"))
+ p->colorPrimaries = 5;
+ else if (!strcmp(value, "smpte170m"))
+ p->colorPrimaries = 6;
+ else if (!strcmp(value, "smpte240m"))
+ p->colorPrimaries = 7;
+ else if (!strcmp(value, "film"))
+ p->colorPrimaries = 8;
+ else if (!strcmp(value, "bt2020"))
+ p->colorPrimaries = 9;
+ else
+ p->colorPrimaries = -1;
+ }
+ OPT("transfer")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVideoSignalTypePresentFlag = 1;
+ p->bEnableColorDescriptionPresentFlag = 1;
+ if (!strcmp(value, "bt709"))
+ p->transferCharacteristics = 1;
+ else if (!strcmp(value, "undef"))
+ p->transferCharacteristics = 2;
+ else if (!strcmp(value, "bt470m"))
+ p->transferCharacteristics = 4;
+ else if (!strcmp(value, "bt470bg"))
+ p->transferCharacteristics = 5;
+ else if (!strcmp(value, "smpte170m"))
+ p->transferCharacteristics = 6;
+ else if (!strcmp(value, "smpte240m"))
+ p->transferCharacteristics = 7;
+ else if (!strcmp(value, "linear"))
+ p->transferCharacteristics = 8;
+ else if (!strcmp(value, "log100"))
+ p->transferCharacteristics = 9;
+ else if (!strcmp(value, "log316"))
+ p->transferCharacteristics = 10;
+ else if (!strcmp(value, "iec61966-2-4"))
+ p->transferCharacteristics = 11;
+ else if (!strcmp(value, "bt1361e"))
+ p->transferCharacteristics = 12;
+ else if (!strcmp(value, "iec61966-2-1"))
+ p->transferCharacteristics = 13;
+ else if (!strcmp(value, "bt2020-10"))
+ p->transferCharacteristics = 14;
+ else if (!strcmp(value, "bt2020-12"))
+ p->transferCharacteristics = 15;
+ else
+ p->transferCharacteristics = -1;
+ }
+ OPT("colormatrix")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVideoSignalTypePresentFlag = 1;
+ p->bEnableColorDescriptionPresentFlag = 1;
+ if (!strcmp(value, "GBR"))
+ p->matrixCoeffs = 0;
+ else if (!strcmp(value, "bt709"))
+ p->matrixCoeffs = 1;
+ else if (!strcmp(value, "undef"))
+ p->matrixCoeffs = 2;
+ else if (!strcmp(value, "fcc"))
+ p->matrixCoeffs = 4;
+ else if (!strcmp(value, "bt470bg"))
+ p->matrixCoeffs = 5;
+ else if (!strcmp(value, "smpte170m"))
+ p->matrixCoeffs = 6;
+ else if (!strcmp(value, "smpte240m"))
+ p->matrixCoeffs = 7;
+ else if (!strcmp(value, "YCgCo"))
+ p->matrixCoeffs = 8;
+ else if (!strcmp(value, "bt2020nc"))
+ p->matrixCoeffs = 9;
+ else if (!strcmp(value, "bt2020c"))
+ p->matrixCoeffs = 10;
+ else
+ p->matrixCoeffs = -1;
+ }
+ OPT("chromaloc")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableChromaLocInfoPresentFlag = 1;
+ p->chromaSampleLocTypeTopField = atoi(value);
+ p->chromaSampleLocTypeBottomField = p->chromaSampleLocTypeTopField;
+ }
+ OPT("fieldseq")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableFieldSeqFlag = atobool(value);
+ }
+ OPT("framefieldinfo")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableFrameFieldInfoPresentFlag = atobool(value);
+ }
+ OPT("crop-rect")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableDefaultDisplayWindowFlag = 1;
+ bError |= sscanf(value, "%d,%d,%d,%d",
+ &p->defDispWinLeftOffset,
+ &p->defDispWinTopOffset,
+ &p->defDispWinRightOffset,
+ &p->defDispWinBottomOffset) != 4;
+ }
+ OPT("timinginfo")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVuiTimingInfoPresentFlag = atobool(value);
+ }
+ OPT("nal-hrd")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVuiTimingInfoPresentFlag = atobool(value);
+ p->bEnableVuiHrdParametersPresentFlag = atobool(value);
+ }
+ OPT("bitstreamrestriction")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableBitstreamRestrictionFlag = atobool(value);
+ }
+ OPT("subpichrd")
+ {
+ p->bEnableVuiParametersPresentFlag = 1;
+ p->bEnableVuiHrdParametersPresentFlag = atobool(value);
+ p->bEnableSubPicHrdParamsPresentFlag = atobool(value);
+ }
+ else
+ return X265_PARAM_BAD_NAME;
+#undef OPT
+#undef atobool
+#undef atoi
+#undef atof
+
+ bError |= bValueWasNull && !bNameWasBool;
+ return bError ? X265_PARAM_BAD_VALUE : 0;
+}
+
+char *x265_param2string(x265_param *p)
+{
+ char *buf, *s;
+
+ buf = s = X265_MALLOC(char, 2000);
+ if (!buf)
+ return NULL;
+
+#define BOOL(param, cliopt) \
+ s += sprintf(s, " %s", (param) ? cliopt : "no-"cliopt);
+
+ BOOL(p->bEnableWavefront, "wpp");
+ s += sprintf(s, " fps=%d/%d", p->fpsNum, p->fpsDenom);
+ s += sprintf(s, " ctu=%d", p->maxCUSize);
+ s += sprintf(s, " tu-intra-depth=%d", p->tuQTMaxIntraDepth);
+ s += sprintf(s, " tu-inter-depth=%d", p->tuQTMaxInterDepth);
+ s += sprintf(s, " me=%d", p->searchMethod);
+ s += sprintf(s, " subme=%d", p->subpelRefine);
+ s += sprintf(s, " merange=%d", p->searchRange);
+ BOOL(p->bEnableRectInter, "rect");
+ BOOL(p->bEnableAMP, "amp");
+ s += sprintf(s, " max-merge=%d", p->maxNumMergeCand);
+ BOOL(p->bEnableEarlySkip, "early-skip");
+ BOOL(p->bEnableCbfFastMode, "fast-cbf");
+ s += sprintf(s, " rdpenalty=%d", p->rdPenalty);
+ BOOL(p->bEnableTransformSkip, "tskip");
+ BOOL(p->bEnableTSkipFast, "tskip-fast");
+ BOOL(p->bEnableStrongIntraSmoothing, "strong-intra-smoothing");
+ BOOL(p->bEnableConstrainedIntra, "constrained-intra");
+ BOOL(p->bOpenGOP, "open-gop");
+ s += sprintf(s, " keyint=%d", p->keyframeMax);
+ s += sprintf(s, " min-keyint=%d", p->keyframeMin);
+ s += sprintf(s, " scenecut=%d", p->scenecutThreshold);
+ s += sprintf(s, " rc-lookahead=%d", p->lookaheadDepth);
+ s += sprintf(s, " bframes=%d", p->bframes);
+ s += sprintf(s, " bframe-bias=%d", p->bFrameBias);
+ s += sprintf(s, " b-adapt=%d", p->bFrameAdaptive);
+ s += sprintf(s, " ref=%d", p->maxNumReferences);
+ BOOL(p->bEnableWeightedPred, "weightp");
+ s += sprintf(s, " bitrate=%d", p->rc.bitrate);
+ s += sprintf(s, " qp=%d", p->rc.qp);
+ s += sprintf(s, " aq-mode=%d", p->rc.aqMode);
+ s += sprintf(s, " aq-strength=%.2f", p->rc.aqStrength);
+ s += sprintf(s, " cbqpoffs=%d", p->cbQpOffset);
+ s += sprintf(s, " crqpoffs=%d", p->crQpOffset);
+ s += sprintf(s, " rd=%d", p->rdLevel);
+ BOOL(p->bEnableSignHiding, "signhide");
+ BOOL(p->bEnableLoopFilter, "lft");
+ BOOL(p->bEnableSAO, "sao");
+ s += sprintf(s, " sao-lcu-bounds=%d", p->saoLcuBoundary);
+ s += sprintf(s, " sao-lcu-opt=%d", p->saoLcuBasedOptimization);
+ s += sprintf(s, " b-pyramid=%d", p->bBPyramid);
+ BOOL(p->rc.cuTree, "cutree");
+#undef BOOL
+
+ return buf;
+}
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/common/param.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/source/common/param.h Mon Feb 24 19:13:20 2014 +0530
@@ -0,0 +1,628 @@
+/*****************************************************************************
+ * Copyright (C) 2013 x265 project
+ *
+ * Authors: Deepthi Nandakumar <deepthi at multicorewareinc.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at licensing at multicorewareinc.com.
+ *****************************************************************************/
+
+#ifndef X265_PARAM_H
+#define X265_PARAM_H
+
+/* x265 input parameters
+ *
+ * For version safety you may use x265_param_alloc/free() to manage the
+ * allocation of x265_param instances, and x265_param_parse() to assign values
+ * by name. By never dereferencing param fields in your own code you can treat
+ * x265_param as an opaque data structure */
+typedef struct x265_param
+{
+ /*== Encoder Environment ==*/
+
+ /* Enable wavefront parallel processing, greatly increases parallelism for
+ * less than 1% compression efficiency loss */
+ int bEnableWavefront;
+
+ /* Number of threads to allocate for the process global thread pool, if no
+ * thread pool has yet been created. 0 implies auto-detection. By default
+ * x265 will try to allocate one worker thread per CPU core */
+ int poolNumThreads;
+
+ /* Number of concurrently encoded frames, 0 implies auto-detection. By
+ * default x265 will use a number of frame threads emperically determined to
+ * be optimal for your CPU core count, between 2 and 6. Using more than one
+ * frame thread causes motion search in the down direction to be clamped but
+ * otherwise encode behavior is unaffected. With CQP rate control the output
+ * bitstream is deterministic for all values of frameNumThreads greater than
+ * 1. All other forms of rate-control can be negatively impacted by
+ * increases to the number of frame threads because the extra concurrency
+ * adds uncertainty to the bitrate estimations. There is no limit to the
+ * number of frame threads you use for each encoder, but frame parallelism
+ * is generally limited by the the number of CU rows */
+ int frameNumThreads;
+
+ /* The level of logging detail emitted by the encoder. X265_LOG_NONE to
+ * X265_LOG_DEBUG, default is X265_LOG_INFO */
+ int logLevel;
+
+ /* Enable the measurement and reporting of PSNR. Default is enabled */
+ int bEnablePsnr;
+
+ /* Enable the measurement and reporting of SSIM. Default is disabled */
+ int bEnableSsim;
+
+ /* filename of CSV log. If logLevel is X265_LOG_DEBUG, the encoder will emit
+ * per-slice statistics to this log file in encode order. Otherwise the
+ * encoder will emit per-stream statistics into the log file when
+ * x265_encoder_log is called (presumably at the end of the encode) */
+ const char *csvfn;
+
+ /* Enable the generation of SEI messages for each encoded frame containing
+ * the hashes of the three reconstructed picture planes. Most decoders will
+ * validate those hashes against the reconstructed images it generates and
+ * report any mismatches. This is essentially a debugging feature. Hash
+ * types are MD5(1), CRC(2), Checksum(3). Default is 0, none */
+ int decodedPictureHashSEI;
+
+ /*== Video Usability Information ==*/
+
+ /* Enable the generation of a VUI with all fields in the SPS. VUI fields
+ * that are not specified on the command line will have default values. */
+ int bEnableVuiParametersPresentFlag;
+
+ /* Enable aspect ratio in VUI. Causes the aspect_ratio_idc to be added
+ * to the VUI. The default is false. */
+ int bEnableAspectRatioIdc;
+
+ /* Aspect ratio idc to be added to the VUI. The default is 0 indicating
+ * the apsect ratio is unspecified. If set to X265_EXTENDED_SAR then
+ * sarWidth and sarHeight must also be set. */
+ int aspectRatioIdc;
+
+ /* Sample Aspect Ratio width in arbitrary units to be added to the VUI
+ * only if aspectRatioIdc is set to X265_EXTENDED_SAR. This is the width
+ * of an individual pixel. If this is set then sarHeight must also be set.
+ */
+ int sarWidth;
+
+ /* Sample Aspect Ratio height in arbitrary units to be added to the VUI.
+ * only if aspectRatioIdc is set to X265_EXTENDED_SAR. This is the width
+ * of an individual pixel. If this is set then sarWidth must also be set.
+ */
+ int sarHeight;
+
+ /* Enable overscan info present flag in the VUI. If this is set then
+ * bEnabledOverscanAppropriateFlag will be added to the VUI. The default
+ * is false. */
+ int bEnableOverscanInfoPresentFlag;
+
+ /* Enable overscan appropriate flag. The status of this flag is added to
+ * the VUI only if bEnableOverscanInfoPresentFlag is set. If this flag is
+ * set then cropped decoded pictures may be output for display. The default
+ * is false. */
+ int bEnableOverscanAppropriateFlag;
+
+ /* Video signal type present flag of the VUI. If this is set then
+ * videoFormat, bEnableVideoFullRangeFlag and
+ * bEnableColorDescriptionPresentFlag will be added to the VUI. The default
+ * is false. */
+ int bEnableVideoSignalTypePresentFlag;
+
+ /* Video format of the source video. 0 = component, 1 = PAL, 2 = NTSC,
+ * 3 = SECAM, 4 = MAC, 5 = unspecified video format is the default. */
+ int videoFormat;
+
+ /* Video full range flag indicates the black level and range of the luma
+ * and chroma signals as derived from E′Y, E′PB, and E′PR or E′R, E′G, and
+ * E′B real-valued component signals. False is the default. */
+ int bEnableVideoFullRangeFlag;
+
+ /* Color description present flag in the VUI. If this is set then
+ * color_primaries, transfer_characteristics and matrix_coeffs are to be added
+ * to the VUI. The default is false. */
+ int bEnableColorDescriptionPresentFlag;
+
+ /* Color primaries holds the chromacity coordinates of the source primaries.
+ * The default is 2. */
+ int colorPrimaries;
+
+ /* Transfer characteristics indicates the opto-electronic transfer characteristic
+ * of the source picture. The default is 2. */
+ int transferCharacteristics;
+
+ /* Matrix coefficients used to derive the luma and chroma signals from the red,
+ * blue and green primaries. The default is 2. */
+ int matrixCoeffs;
+
+ /* Chroma location info present flag adds chroma_sample_loc_type_top_field and
+ * chroma_sample_loc_type_bottom_field to the VUI. The default is false. */
+ int bEnableChromaLocInfoPresentFlag;
+
+ /* Chroma sample location type top field holds the chroma location in the top
+ * field. The default is 0. */
+ int chromaSampleLocTypeTopField;
+
+ /* Chroma sample location type bottom field holds the chroma location in the bottom
+ * field. The default is 0. */
+ int chromaSampleLocTypeBottomField;
+
+ /* Field seq flag specifies that the pictures are fields and each one has a
+ * timing SEI message. The default is false */
+ int bEnableFieldSeqFlag;
+
+ /* Frame field info present flag indicates that each picture has a timing SEI
+ * message wich includes a pic_struct, source_scan_type and duplicate_flag
+ * elements. If not set then the pic_struct element is not included. The
+ * default is false. */
+ int bEnableFrameFieldInfoPresentFlag;
+
+ /* Default display window flag adds def_disp_win_left_offset ,
+ * def_disp_win_right_offset, def_disp_win_top_offset and
+ * def_disp_win_bottom_offset to the VUI. The default is false. */
+ int bEnableDefaultDisplayWindowFlag;
+
+ /* Default display window left offset holds the left offset with the
+ * conformance cropping window to further crop the displayed window. */
+ int defDispWinLeftOffset;
+
+ /* Default display window right offset holds the right offset with the
+ * conformance cropping window to further crop the displayed window. */
+ int defDispWinRightOffset;
+
+ /* Default display window top offset holds the top offset with the
+ * conformance cropping window to further crop the displayed window. */
+ int defDispWinTopOffset;
+
+ /* Default display window bottom offset holds the bottom offset with the
+ * conformance cropping window to further crop the displayed window. */
+ int defDispWinBottomOffset;
+
+ /* VUI timing info present flag adds vui_num_units_in_tick, vui_time_scale,
+ * vui_poc_proportional_to_timing_flag and vui_hrd_parameters_present_flag
+ * to the VUI. vui_num_units_in_tick, vui_time_scale and
+ * vui_poc_proportional_to_timing_flag are derived from processing the input
+ * video. The default is false. */
+ int bEnableVuiTimingInfoPresentFlag;
+
+ /* VUI hrd parameters present flag adds the HRD to the VUI */
+ int bEnableVuiHrdParametersPresentFlag;
+
+ /* Bitstream restriction flag adds tiles_fixed_structure_flag,
+ * motion_vectors_over_pic_boundaries_flag, restricted_ref_pic_lists_flag,
+ * min_spatial_segmentation_idc, max_bytes_per_pic_denom,
+ * max_bit_per_min_cu_denom, log2_max_mv_length_horizontal and
+ * log2_max_mv_length_vertical to the VUI. All values are derived from
+ * processing the input video. The default is false. */
+ int bEnableBitstreamRestrictionFlag;
+
+ /*== Hypothetical Reference Decoder Parameters ==*/
+
+ /* Sub pic HRD params present flag determines if tic_divisor_minus2,
+ * du_cpb_removal_delay_increment_length_minus1,
+ * sub_pic_cpb_params_in_pic_timing_sei_flag,
+ * dpb_output_delay_du_length_minus1 and cpb_size_du_scale
+ * are added to the HRD. All are derived from processing the input video.
+ * The default is false. */
+ int bEnableSubPicHrdParamsPresentFlag;
+
+ /*== Internal Picture Specification ==*/
+
+ /* Internal encoder bit depth. If x265 was compiled to use 8bit pixels
+ * (HIGH_BIT_DEPTH=0), this field must be 8, else this field must be 10.
+ * Future builds may support 12bit pixels. */
+ int internalBitDepth;
+
+ /* Color space of internal pictures. Only X265_CSP_I420 and X265_CSP_I444
+ * are supported. Eventually, i422 will also be supported as an internal
+ * color space and other packed formats will be supported in
+ * x265_picture.colorSpace */
+ int internalCsp;
+
+ /* Numerator and denominator of frame rate */
+ uint32_t fpsNum;
+ uint32_t fpsDenom;
+
+ /* Width (in pixels) of the source pictures. If this width is not an even
+ * multiple of 4, the encoder will pad the pictures internally to meet this
+ * minimum requirement. All valid HEVC widths are supported */
+ int sourceWidth;
+
+ /* Height (in pixels) of the source pictures. If this height is not an even
+ * multiple of 4, the encoder will pad the pictures internally to meet this
+ * minimum requirement. All valid HEVC heights are supported */
+ int sourceHeight;
+
+ /*== Coding Unit (CU) definitions ==*/
+
+ /* Maxiumum CU width and height in pixels. The size must be 64, 32, or 16.
+ * The higher the size, the more efficiently x265 can encode areas of low
+ * complexity, greatly improving compression efficiency at large
+ * resolutions. The smaller the size, the more effective wavefront and
+ * frame parallelism will become because of the increase in rows. default 64 */
+ uint32_t maxCUSize;
+
+ /* The additional depth the residual quadtree is allowed to recurse beyond
+ * the coding quadtree, for inter coded blocks. This must be between 1 and
+ * 3. The higher the value the more efficiently the residual can be
+ * compressed by the DCT transforms, at the expense of much more compute */
+ uint32_t tuQTMaxInterDepth;
+
+ /* The additional depth the residual quadtree is allowed to recurse beyond
+ * the coding quadtree, for intra coded blocks. This must be between 1 and
+ * 3. The higher the value the more efficiently the residual can be
+ * compressed by the DCT transforms, at the expense of much more compute */
+ uint32_t tuQTMaxIntraDepth;
+
+ /*== GOP Structure and Lokoahead ==*/
+
+ /* Enable open GOP - meaning I slices are not necessariy IDR and thus frames
+ * encoded after an I slice may reference frames encoded prior to the I
+ * frame which have remained in the decoded picture buffer. Open GOP
+ * generally has better compression efficiency and negligable encoder
+ * performance impact, but the use case may preclude it. Default true */
+ int bOpenGOP;
+
+ /* Scenecuts closer together than this are coded as I, not IDR. */
+ int keyframeMin;
+
+ /* Maximum keyframe distance or intra period in number of frames. If 0 or 1,
+ * all frames are I frames. A negative value is casted to MAX_INT internally
+ * which effectively makes frame 0 the only I frame. Default is 250 */
+ int keyframeMax;
+
+ /* The maximum number of L0 references a P or B slice may use. This
+ * influences the size of the decoded picture buffer. The higher this
+ * number, the more reference frames there will be available for motion
+ * search, improving compression efficiency of most video at a cost of
+ * performance. Value must be between 1 and 16, default is 3 */
+ int maxNumReferences;
+
+ /* Sets the operating mode of the lookahead. With b-adapt 0, the GOP
+ * structure is fixed based on the values of keyframeMax and bframes.
+ * With b-adapt 1 a light lookahead is used to chose B frame placement.
+ * With b-adapt 2 (trellis) a viterbi B path selection is performed */
+ int bFrameAdaptive;
+
+ /* Maximum consecutive B frames that can be emitted by the lookehead. When
+ * b-adapt is 0 and keyframMax is greater than bframes, the lookahead emits
+ * a fixed pattern of `bframes` B frames between each P. With b-adapt 1 the
+ * lookahead ignores the value of bframes for the most part. With b-adapt 2
+ * the value of bframes determines the search (POC) distance performeed in
+ * both directions, quadradically increasing the compute load of the
+ * lookahead. The higher the value, the more B frames the lookahead may
+ * possibly use consecutively, usually improving compression. Default is 3,
+ * maximum is 16 */
+ int bframes;
+
+ /* When enabled, the encoder will use the B frame in the middle of each
+ * mini-GOP larger than 2 B frames as a motion reference for the surrounding
+ * B frames. This improves compression efficiency for a small performance
+ * penalty. Referenced B frames are treated somewhere between a B and a P
+ * frame by rate control. Default is enabled. */
+ int bBPyramid;
+
+ /* The number of frames that must be queued in the lookahead before it may
+ * make slice decisions. Increasing this value directly increases the encode
+ * latency. The longer the queue the more optimally the lookahead may make
+ * slice decisions, particularly with b-adapt 2. When mb-tree is enabled,
+ * the length of the queue linearly increases the effectiveness of the
+ * mb-tree analysis. Default is 40 frames, maximum is 250 */
+ int lookaheadDepth;
+
+ /* A value which is added to the cost estimate of B frames in the lookahead.
+ * It may be a positive value (making B frames appear more expensive, which
+ * causes the lookahead to chose more P frames) or negative, which makes the
+ * lookahead chose more B frames. Default is 0, there are no limits */
+ int bFrameBias;
+
+ /* An arbitrary threshold which determines how agressively the lookahead
+ * should detect scene cuts. The default (40) is recommended. */
+ int scenecutThreshold;
+
+ /*== Intra Coding Tools ==*/
+
+ /* Enable constrained intra prediction. This causes intra prediction to
+ * input samples that were inter predicted. For some use cases this is
+ * believed to me more robust to stream errors, but it has a compression
+ * penalty on P and (particularly) B slices. Defaults to diabled */
+ int bEnableConstrainedIntra;
+
+ /* Enable strong intra smoothing for 32x32 blocks where the reference
+ * samples are flat. It may or may not improve compression efficiency,
+ * depending on your source material. Defaults to disabled */
+ int bEnableStrongIntraSmoothing;
+
+ /*== Inter Coding Tools ==*/
+
+ /* ME search method (DIA, HEX, UMH, STAR, FULL). The search patterns
+ * (methods) are sorted in increasing complexity, with diamond being the
+ * simplest and fastest and full being the slowest. DIA, HEX, and UMH were
+ * adapted from x264 directly. STAR is an adaption of the HEVC reference
+ * encoder's three step search, while full is a naive exhaustive search. The
+ * default is the star search, it has a good balance of performance and
+ * compression efficiecy */
+ int searchMethod;
+
+ /* A value between 0 and X265_MAX_SUBPEL_LEVEL which adjusts the amount of
+ * effort performed during subpel refine. Default is 5 */
+ int subpelRefine;
+
+ /* The maximum distance from the motion prediction that the full pel motion
+ * search is allowed to progress before terminating. This value can have an
+ * effect on frame parallelism, as referenced frames must be at least this
+ * many rows of reconstructed pixels ahead of the referencee at all times.
+ * (When considering reference lag, the motion prediction must be ignored
+ * because it cannot be known ahead of time). Default is 60, which is the
+ * default max CU size (64) minus the luma HPEL half-filter length (4). If a
+ * smaller CU size is used, the search range should be similarly reduced */
+ int searchRange;
+
+ /* The maximum number of merge candidates that are considered during inter
+ * analysis. This number (between 1 and 5) is signaled in the stream
+ * headers and determines the number of bits required to signal a merge so
+ * it can have significant trade-offs. The smaller this number the higher
+ * the performance but the less compression efficiency. Default is 3 */
+ uint32_t maxNumMergeCand;
+
+ /* Enable weighted prediction in P slices. This enables weighting analysis
+ * in the lookahead, which influences slice decitions, and enables weighting
+ * analysis in the main encoder which allows P reference samples to have a
+ * weight function applied to them prior to using them for motion
+ * compensation. In video which has lighting changes, it can give a large
+ * improvement in compression efficiency. Default is enabled */
+ int bEnableWeightedPred;
+
+ /* Enable weighted bi-prediction in B slices. This option currently has no
+ * effect */
+ int bEnableWeightedBiPred;
+
+ /*== Analysis tools ==*/
+
+ /* Enable asymmetrical motion predictions. At CU depths 64, 32, and 16, it
+ * is possible to use 25%/75% split partitions in the up, down, right, left
+ * directions. For some material this can improve compression efficiency at
+ * the cost of extra analysis. bEnableRectInter must be enabled for this
+ * feature to be used. Default enabled */
+ int bEnableAMP;
+
+ /* Enable rectangular motion prediction partitions (vertical and
+ * horizontal), available at all CU depths from 64x64 to 8x8. Default is
+ * enabled */
+ int bEnableRectInter;
+
+ /* Enable the use of `coded block flags` (flags set to true when a residual
+ * has been coded for a given block) to avoid intra analysis in likely skip
+ * blocks. Default is disabled */
+ int bEnableCbfFastMode;
+
+ /* Enable early skip decisions to avoid intra and inter analysis in likely
+ * skip blocks. Default is disabled */
+ int bEnableEarlySkip;
+
+ /* Apply an optional penalty to the estimated cost of 32x32 intra blocks in
+ * non-intra slices. 0 is disabled, 1 enables a small penalty, and 2 enables
+ * a full penalty. This favors inter-coding and its low bitrate over
+ * potential increases in distortion, but usually improves performance.
+ * Default is 0 */
+ int rdPenalty;
+
+ /* A value betwen X265_NO_RDO_NO_RDOQ and X265_RDO_LEVEL which determines
+ * the level of rate distortion optimizations to perform during mode
+ * decisions and quantization. The more RDO the better the compression
+ * efficiency at a major cost of performance. Default is no RDO (0) */
+ int rdLevel;
+
+ /*== Coding tools ==*/
+
+ /* Enable the implicit signaling of the sign bit of the last coefficient of
+ * each transform unit. This saves one bit per TU at the expense of figuring
+ * out which coefficient can be toggled with the least distortion.
+ * Default is enabled */
+ int bEnableSignHiding;
+
+ /* Allow intra coded blocks to be encoded directly as residual without the
+ * DCT transform, when this improves efficiency. Checking whether the block
+ * will benefit from this option incurs a performance penalty. Default is
+ * enabled */
+ int bEnableTransformSkip;
+
+ /* Enable a faster determination of whether skippig the DCT transform will
+ * be beneficial. Slight performance gain for some compression loss. Default
+ * is enabled */
+ int bEnableTSkipFast;
+
+ /* Enable the deblocking loop filter, which improves visual quality by
+ * reducing blocking effects at block edges, particularly at lower bitrates
+ * or higher QP. When enabled it adds another CU row of reference lag,
+ * reducing frame parallelism effectiveness. Default is enabled */
+ int bEnableLoopFilter;
+
+ /* Enable the Sample Adaptive Offset loop filter, which reduces distortion
+ * effects by adjusting reconstructed sample values based on histogram
+ * analysis to better approximate the original samples. When enabled it adds
+ * a CU row of reference lag, reducing frame parallelism effectiveness.
+ * Default is enabled */
+ int bEnableSAO;
+
+ /* Note: when deblocking and SAO are both enabled, the loop filter CU lag is
+ * only one row, as they operate in series o the same row. */
+
+ /* Select the method in which SAO deals with deblocking boundary pixels. If
+ * 0 the right and bottom boundary areas are skipped. If 1, non-deblocked
+ * pixels are used entirely. Default is 0 */
+ int saoLcuBoundary;
+
+ /* Select the scope of the SAO optimization. If 0 SAO is performed over the
+ * entire output picture at once, this can severly restrict frame
+ * parallelism so it is not recommended for many-core machines. If 1 SAO is
+ * performed on LCUs in series. Default is 1 */
+ int saoLcuBasedOptimization;
+
+ /* Generally a small signed integer which offsets the QP used to quantize
+ * the Cb chroma residual (delta from luma QP specified by rate-control).
+ * Default is 0, which is recommended */
+ int cbQpOffset;
+
+ /* Generally a small signed integer which offsets the QP used to quantize
+ * the Cr chroma residual (delta from luma QP specified by rate-control).
+ * Default is 0, which is recommended */
+ int crQpOffset;
+
+ /*== Rate Control ==*/
+
+ struct
+ {
+ /* Explicit mode of rate-control, necessary for API users. It must
+ * be one of the X265_RC_METHODS enum values. */
+ int rateControlMode;
+
+ /* Base QP to use for Constant QP rate control. Adaptive QP may alter
+ * the QP used for each block. If a QP is specified on the command line
+ * CQP rate control is implied. Default: 32 */
+ int qp;
+
+ /* target bitrate for Average BitRate (ABR) rate control. If a non- zero
+ * bitrate is specified on the command line, ABR is implied. Default 0 */
+ int bitrate;
+
+ /* The degree of rate fluctuation that x265 tolerates. Rate tolerance is used
+ * alongwith overflow (difference between actual and target bitrate), to adjust
+ qp. Default is 1.0 */
+ double rateTolerance;
+
+ /* qComp sets the quantizer curve compression factor. It weights the frame
+ * quantizer based on the complexity of residual (measured by lookahead).
+ * Default value is 0.6. Increasing it to 1 will effectively generate CQP */
+ double qCompress;
+
+ /* QP offset between I/P and P/B frames. Default ipfactor: 1.4
+ * Default pbFactor: 1.3 */
+ double ipFactor;
+ double pbFactor;
+
+ /* Max QP difference between frames. Default: 4 */
+ int qpStep;
+
+ /* Ratefactor constant: targets a certain constant "quality".
+ * Acceptable values between 0 and 51. Default value: 28 */
+ double rfConstant;
+
+ /* Enable adaptive quantization. This mode distributes available bits between all
+ * macroblocks of a frame, assigning more bits to low complexity areas. Turning
+ * this ON will usually affect PSNR negatively, however SSIM and visual quality
+ * generally improves. Default: OFF (0) */
+ int aqMode;
+
+ /* Sets the strength of AQ bias towards low detail macroblocks. Valid only if
+ * AQ is enabled. Default value: 1.0. Acceptable values between 0.0 and 3.0 */
+ double aqStrength;
+
+ /* Sets the maximum rate the VBV buffer should be assumed to refill at
+ * Default is zero */
+ int vbvMaxBitrate;
+
+ /* Sets the size of the VBV buffer in kilobits. Default is zero */
+ int vbvBufferSize;
+
+ /* Sets how full the VBV buffer must be before playback starts. If it is less than
+ * 1, then the initial fill is vbv-init * vbvBufferSize. Otherwise, it is
+ * interpreted as the initial fill in kbits. Default is 0.9 */
+ double vbvBufferInit;
+
+ /* Enable CUTree ratecontrol. This keeps track of the CUs that propagate temporally
+ * across frames and assigns more bits to these CUs. Improves encode efficiency.
+ * Default: OFF (0) */
+ int cuTree;
+ /* In CRF mode, maximum CRF as caused by VBV */
+ double rfConstantMax;
+ } rc;
+} x265_param;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* x265_param_alloc:
+ * Allocates an x265_param instance. The returned param structure is not
+ * special in any way, but using this method together with x265_param_free()
+ * and x265_param_parse() to set values by name allows the application to treat
+ * x265_param as an opaque data struct for version safety */
+x265_param *x265_param_alloc();
+
+/* x265_param_free:
+ * Use x265_param_free() to release storage for an x265_param instance
+ * allocated by x26_param_alloc() */
+void x265_param_free(x265_param *);
+
+/***
+ * Initialize an x265_param_t structure to default values
+ */
+void x265_param_default(x265_param *param);
+
+/* x265_param_parse:
+ * set one parameter by name.
+ * returns 0 on success, or returns one of the following errors.
+ * note: BAD_VALUE occurs only if it can't even parse the value,
+ * numerical range is not checked until x265_encoder_open() or
+ * x265_encoder_reconfig().
+ * value=NULL means "true" for boolean options, but is a BAD_VALUE for non-booleans. */
+#define X265_PARAM_BAD_NAME (-1)
+#define X265_PARAM_BAD_VALUE (-2)
+int x265_param_parse(x265_param *p, const char *name, const char *value);
+
+/* x265_param_apply_profile:
+ * Applies the restrictions of the given profile. (one of below) */
+static const char * const x265_profile_names[] = { "main", "main10", "mainstillpicture", 0 };
+
+/* (can be NULL, in which case the function will do nothing)
+ * returns 0 on success, negative on failure (e.g. invalid profile name). */
+int x265_param_apply_profile(x265_param *, const char *profile);
+
+/* x265_param_default_preset:
+ * The same as x265_param_default, but also use the passed preset and tune
+ * to modify the default settings.
+ * (either can be NULL, which implies no preset or no tune, respectively)
+ *
+ * Currently available presets are, ordered from fastest to slowest: */
+static const char * const x265_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };
+
+/* The presets can also be indexed numerically, as in:
+ * x265_param_default_preset( ¶m, "3", ... )
+ * with ultrafast mapping to "0" and placebo mapping to "9". This mapping may
+ * of course change if new presets are added in between, but will always be
+ * ordered from fastest to slowest.
+ *
+ * Warning: the speed of these presets scales dramatically. Ultrafast is a full
+ * 100 times faster than placebo!
+ *
+ * Currently available tunings are: */
+static const char * const x265_tune_names[] = { "psnr", "ssim", "zero-latency", 0 };
+
+/* returns 0 on success, negative on failure (e.g. invalid preset/tune name). */
+int x265_param_default_preset(x265_param *, const char *preset, const char *tune);
+
+#ifdef __cplusplus
+}
+#endif
+
+int x265_check_params(x265_param *param);
+int x265_set_globals(x265_param *param);
+void x265_print_params(x265_param *param);
+char *x265_param2string(x265_param *p);
+
+#endif // ifndef X265_COMMON_H
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/dllmain.cpp
--- a/source/dllmain.cpp Sun Feb 23 21:25:22 2014 +0530
+++ b/source/dllmain.cpp Mon Feb 24 19:13:20 2014 +0530
@@ -22,6 +22,7 @@
*****************************************************************************/
#include "x265.h"
+#include "param.h"
/* this unreachable function forces the MSVC linker to include the encoder
* and common libraries into the DLL */
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Sun Feb 23 21:25:22 2014 +0530
+++ b/source/encoder/encoder.cpp Mon Feb 24 19:13:20 2014 +0530
@@ -29,6 +29,7 @@
#include "primitives.h"
#include "threadpool.h"
#include "common.h"
+#include "param.h"
#include "TLibEncoder/NALwrite.h"
#include "bitcost.h"
@@ -1587,18 +1588,6 @@
}
extern "C"
-x265_param *x265_param_alloc()
-{
- return (x265_param*)x265_malloc(sizeof(x265_param));
-}
-
-extern "C"
-void x265_param_free(x265_param *p)
-{
- return x265_free(p);
-}
-
-extern "C"
x265_picture *x265_picture_alloc()
{
return (x265_picture*)x265_malloc(sizeof(x265_picture));
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/x265.cpp
--- a/source/x265.cpp Sun Feb 23 21:25:22 2014 +0530
+++ b/source/x265.cpp Mon Feb 24 19:13:20 2014 +0530
@@ -29,6 +29,7 @@
#include "output/output.h"
#include "common.h"
#include "x265.h"
+#include "param.h"
#if HAVE_VLD
/* Visual Leak Detector */
diff -r 80caa9f00d7c -r e7418fc7dbc6 source/x265.h
--- a/source/x265.h Sun Feb 23 21:25:22 2014 +0530
+++ b/source/x265.h Mon Feb 24 19:13:20 2014 +0530
@@ -26,6 +26,7 @@
#include <stdint.h>
#include "x265_config.h"
+#include "param.h"
#ifdef __cplusplus
extern "C" {
@@ -279,599 +280,11 @@
/* new statistic member variables must be added below this line */
} x265_stats;
-/* x265 input parameters
- *
- * For version safety you may use x265_param_alloc/free() to manage the
- * allocation of x265_param instances, and x265_param_parse() to assign values
- * by name. By never dereferencing param fields in your own code you can treat
- * x265_param as an opaque data structure */
-typedef struct x265_param
-{
- /*== Encoder Environment ==*/
-
- /* Enable wavefront parallel processing, greatly increases parallelism for
- * less than 1% compression efficiency loss */
- int bEnableWavefront;
-
- /* Number of threads to allocate for the process global thread pool, if no
- * thread pool has yet been created. 0 implies auto-detection. By default
- * x265 will try to allocate one worker thread per CPU core */
- int poolNumThreads;
-
- /* Number of concurrently encoded frames, 0 implies auto-detection. By
- * default x265 will use a number of frame threads emperically determined to
- * be optimal for your CPU core count, between 2 and 6. Using more than one
- * frame thread causes motion search in the down direction to be clamped but
- * otherwise encode behavior is unaffected. With CQP rate control the output
- * bitstream is deterministic for all values of frameNumThreads greater than
- * 1. All other forms of rate-control can be negatively impacted by
- * increases to the number of frame threads because the extra concurrency
- * adds uncertainty to the bitrate estimations. There is no limit to the
- * number of frame threads you use for each encoder, but frame parallelism
- * is generally limited by the the number of CU rows */
- int frameNumThreads;
-
- /* The level of logging detail emitted by the encoder. X265_LOG_NONE to
- * X265_LOG_DEBUG, default is X265_LOG_INFO */
- int logLevel;
-
- /* Enable the measurement and reporting of PSNR. Default is enabled */
- int bEnablePsnr;
-
- /* Enable the measurement and reporting of SSIM. Default is disabled */
- int bEnableSsim;
-
- /* filename of CSV log. If logLevel is X265_LOG_DEBUG, the encoder will emit
- * per-slice statistics to this log file in encode order. Otherwise the
- * encoder will emit per-stream statistics into the log file when
- * x265_encoder_log is called (presumably at the end of the encode) */
- const char *csvfn;
-
- /* Enable the generation of SEI messages for each encoded frame containing
- * the hashes of the three reconstructed picture planes. Most decoders will
- * validate those hashes against the reconstructed images it generates and
- * report any mismatches. This is essentially a debugging feature. Hash
- * types are MD5(1), CRC(2), Checksum(3). Default is 0, none */
- int decodedPictureHashSEI;
-
- /*== Video Usability Information ==*/
-
- /* Enable the generation of a VUI with all fields in the SPS. VUI fields
- * that are not specified on the command line will have default values. */
- int bEnableVuiParametersPresentFlag;
-
- /* Enable aspect ratio in VUI. Causes the aspect_ratio_idc to be added
- * to the VUI. The default is false. */
- int bEnableAspectRatioIdc;
-
- /* Aspect ratio idc to be added to the VUI. The default is 0 indicating
- * the apsect ratio is unspecified. If set to X265_EXTENDED_SAR then
- * sarWidth and sarHeight must also be set. */
- int aspectRatioIdc;
-
- /* Sample Aspect Ratio width in arbitrary units to be added to the VUI
- * only if aspectRatioIdc is set to X265_EXTENDED_SAR. This is the width
- * of an individual pixel. If this is set then sarHeight must also be set.
- */
- int sarWidth;
-
- /* Sample Aspect Ratio height in arbitrary units to be added to the VUI.
- * only if aspectRatioIdc is set to X265_EXTENDED_SAR. This is the width
- * of an individual pixel. If this is set then sarWidth must also be set.
- */
- int sarHeight;
-
- /* Enable overscan info present flag in the VUI. If this is set then
- * bEnabledOverscanAppropriateFlag will be added to the VUI. The default
- * is false. */
- int bEnableOverscanInfoPresentFlag;
-
- /* Enable overscan appropriate flag. The status of this flag is added to
- * the VUI only if bEnableOverscanInfoPresentFlag is set. If this flag is
- * set then cropped decoded pictures may be output for display. The default
- * is false. */
- int bEnableOverscanAppropriateFlag;
-
- /* Video signal type present flag of the VUI. If this is set then
- * videoFormat, bEnableVideoFullRangeFlag and
- * bEnableColorDescriptionPresentFlag will be added to the VUI. The default
- * is false. */
- int bEnableVideoSignalTypePresentFlag;
-
- /* Video format of the source video. 0 = component, 1 = PAL, 2 = NTSC,
- * 3 = SECAM, 4 = MAC, 5 = unspecified video format is the default. */
- int videoFormat;
-
- /* Video full range flag indicates the black level and range of the luma
- * and chroma signals as derived from E′Y, E′PB, and E′PR or E′R, E′G, and
- * E′B real-valued component signals. False is the default. */
- int bEnableVideoFullRangeFlag;
-
- /* Color description present flag in the VUI. If this is set then
- * color_primaries, transfer_characteristics and matrix_coeffs are to be added
- * to the VUI. The default is false. */
- int bEnableColorDescriptionPresentFlag;
-
- /* Color primaries holds the chromacity coordinates of the source primaries.
- * The default is 2. */
- int colorPrimaries;
-
- /* Transfer characteristics indicates the opto-electronic transfer characteristic
- * of the source picture. The default is 2. */
- int transferCharacteristics;
-
- /* Matrix coefficients used to derive the luma and chroma signals from the red,
- * blue and green primaries. The default is 2. */
- int matrixCoeffs;
-
- /* Chroma location info present flag adds chroma_sample_loc_type_top_field and
- * chroma_sample_loc_type_bottom_field to the VUI. The default is false. */
- int bEnableChromaLocInfoPresentFlag;
-
- /* Chroma sample location type top field holds the chroma location in the top
- * field. The default is 0. */
- int chromaSampleLocTypeTopField;
-
- /* Chroma sample location type bottom field holds the chroma location in the bottom
- * field. The default is 0. */
- int chromaSampleLocTypeBottomField;
-
- /* Field seq flag specifies that the pictures are fields and each one has a
- * timing SEI message. The default is false */
- int bEnableFieldSeqFlag;
-
- /* Frame field info present flag indicates that each picture has a timing SEI
- * message wich includes a pic_struct, source_scan_type and duplicate_flag
- * elements. If not set then the pic_struct element is not included. The
- * default is false. */
- int bEnableFrameFieldInfoPresentFlag;
-
- /* Default display window flag adds def_disp_win_left_offset ,
- * def_disp_win_right_offset, def_disp_win_top_offset and
- * def_disp_win_bottom_offset to the VUI. The default is false. */
- int bEnableDefaultDisplayWindowFlag;
-
- /* Default display window left offset holds the left offset with the
- * conformance cropping window to further crop the displayed window. */
- int defDispWinLeftOffset;
-
- /* Default display window right offset holds the right offset with the
- * conformance cropping window to further crop the displayed window. */
- int defDispWinRightOffset;
-
- /* Default display window top offset holds the top offset with the
- * conformance cropping window to further crop the displayed window. */
- int defDispWinTopOffset;
-
- /* Default display window bottom offset holds the bottom offset with the
- * conformance cropping window to further crop the displayed window. */
- int defDispWinBottomOffset;
-
- /* VUI timing info present flag adds vui_num_units_in_tick, vui_time_scale,
- * vui_poc_proportional_to_timing_flag and vui_hrd_parameters_present_flag
- * to the VUI. vui_num_units_in_tick, vui_time_scale and
- * vui_poc_proportional_to_timing_flag are derived from processing the input
- * video. The default is false. */
- int bEnableVuiTimingInfoPresentFlag;
-
- /* VUI hrd parameters present flag adds the HRD to the VUI */
- int bEnableVuiHrdParametersPresentFlag;
-
- /* Bitstream restriction flag adds tiles_fixed_structure_flag,
- * motion_vectors_over_pic_boundaries_flag, restricted_ref_pic_lists_flag,
- * min_spatial_segmentation_idc, max_bytes_per_pic_denom,
- * max_bit_per_min_cu_denom, log2_max_mv_length_horizontal and
- * log2_max_mv_length_vertical to the VUI. All values are derived from
- * processing the input video. The default is false. */
- int bEnableBitstreamRestrictionFlag;
-
- /*== Hypothetical Reference Decoder Parameters ==*/
-
- /* Sub pic HRD params present flag determines if tic_divisor_minus2,
- * du_cpb_removal_delay_increment_length_minus1,
- * sub_pic_cpb_params_in_pic_timing_sei_flag,
- * dpb_output_delay_du_length_minus1 and cpb_size_du_scale
- * are added to the HRD. All are derived from processing the input video.
- * The default is false. */
- int bEnableSubPicHrdParamsPresentFlag;
-
- /*== Internal Picture Specification ==*/
-
- /* Internal encoder bit depth. If x265 was compiled to use 8bit pixels
- * (HIGH_BIT_DEPTH=0), this field must be 8, else this field must be 10.
- * Future builds may support 12bit pixels. */
- int internalBitDepth;
-
- /* Color space of internal pictures. Only X265_CSP_I420 and X265_CSP_I444
- * are supported. Eventually, i422 will also be supported as an internal
- * color space and other packed formats will be supported in
- * x265_picture.colorSpace */
- int internalCsp;
-
- /* Numerator and denominator of frame rate */
- uint32_t fpsNum;
- uint32_t fpsDenom;
-
- /* Width (in pixels) of the source pictures. If this width is not an even
- * multiple of 4, the encoder will pad the pictures internally to meet this
- * minimum requirement. All valid HEVC widths are supported */
- int sourceWidth;
-
- /* Height (in pixels) of the source pictures. If this height is not an even
- * multiple of 4, the encoder will pad the pictures internally to meet this
- * minimum requirement. All valid HEVC heights are supported */
- int sourceHeight;
-
- /*== Coding Unit (CU) definitions ==*/
-
- /* Maxiumum CU width and height in pixels. The size must be 64, 32, or 16.
- * The higher the size, the more efficiently x265 can encode areas of low
- * complexity, greatly improving compression efficiency at large
- * resolutions. The smaller the size, the more effective wavefront and
- * frame parallelism will become because of the increase in rows. default 64 */
- uint32_t maxCUSize;
-
- /* The additional depth the residual quadtree is allowed to recurse beyond
- * the coding quadtree, for inter coded blocks. This must be between 1 and
- * 3. The higher the value the more efficiently the residual can be
- * compressed by the DCT transforms, at the expense of much more compute */
- uint32_t tuQTMaxInterDepth;
-
- /* The additional depth the residual quadtree is allowed to recurse beyond
- * the coding quadtree, for intra coded blocks. This must be between 1 and
- * 3. The higher the value the more efficiently the residual can be
- * compressed by the DCT transforms, at the expense of much more compute */
- uint32_t tuQTMaxIntraDepth;
-
- /*== GOP Structure and Lokoahead ==*/
-
- /* Enable open GOP - meaning I slices are not necessariy IDR and thus frames
- * encoded after an I slice may reference frames encoded prior to the I
- * frame which have remained in the decoded picture buffer. Open GOP
- * generally has better compression efficiency and negligable encoder
- * performance impact, but the use case may preclude it. Default true */
- int bOpenGOP;
-
- /* Scenecuts closer together than this are coded as I, not IDR. */
- int keyframeMin;
-
- /* Maximum keyframe distance or intra period in number of frames. If 0 or 1,
- * all frames are I frames. A negative value is casted to MAX_INT internally
- * which effectively makes frame 0 the only I frame. Default is 250 */
- int keyframeMax;
-
- /* The maximum number of L0 references a P or B slice may use. This
- * influences the size of the decoded picture buffer. The higher this
- * number, the more reference frames there will be available for motion
- * search, improving compression efficiency of most video at a cost of
- * performance. Value must be between 1 and 16, default is 3 */
- int maxNumReferences;
-
- /* Sets the operating mode of the lookahead. With b-adapt 0, the GOP
- * structure is fixed based on the values of keyframeMax and bframes.
- * With b-adapt 1 a light lookahead is used to chose B frame placement.
- * With b-adapt 2 (trellis) a viterbi B path selection is performed */
- int bFrameAdaptive;
-
- /* Maximum consecutive B frames that can be emitted by the lookehead. When
- * b-adapt is 0 and keyframMax is greater than bframes, the lookahead emits
- * a fixed pattern of `bframes` B frames between each P. With b-adapt 1 the
- * lookahead ignores the value of bframes for the most part. With b-adapt 2
- * the value of bframes determines the search (POC) distance performeed in
- * both directions, quadradically increasing the compute load of the
- * lookahead. The higher the value, the more B frames the lookahead may
- * possibly use consecutively, usually improving compression. Default is 3,
- * maximum is 16 */
- int bframes;
-
- /* When enabled, the encoder will use the B frame in the middle of each
- * mini-GOP larger than 2 B frames as a motion reference for the surrounding
- * B frames. This improves compression efficiency for a small performance
- * penalty. Referenced B frames are treated somewhere between a B and a P
- * frame by rate control. Default is enabled. */
- int bBPyramid;
-
- /* The number of frames that must be queued in the lookahead before it may
- * make slice decisions. Increasing this value directly increases the encode
- * latency. The longer the queue the more optimally the lookahead may make
- * slice decisions, particularly with b-adapt 2. When mb-tree is enabled,
- * the length of the queue linearly increases the effectiveness of the
- * mb-tree analysis. Default is 40 frames, maximum is 250 */
- int lookaheadDepth;
-
- /* A value which is added to the cost estimate of B frames in the lookahead.
- * It may be a positive value (making B frames appear more expensive, which
- * causes the lookahead to chose more P frames) or negative, which makes the
- * lookahead chose more B frames. Default is 0, there are no limits */
- int bFrameBias;
-
- /* An arbitrary threshold which determines how agressively the lookahead
- * should detect scene cuts. The default (40) is recommended. */
- int scenecutThreshold;
-
- /*== Intra Coding Tools ==*/
-
- /* Enable constrained intra prediction. This causes intra prediction to
- * input samples that were inter predicted. For some use cases this is
- * believed to me more robust to stream errors, but it has a compression
- * penalty on P and (particularly) B slices. Defaults to diabled */
- int bEnableConstrainedIntra;
-
- /* Enable strong intra smoothing for 32x32 blocks where the reference
- * samples are flat. It may or may not improve compression efficiency,
- * depending on your source material. Defaults to disabled */
- int bEnableStrongIntraSmoothing;
-
- /*== Inter Coding Tools ==*/
-
- /* ME search method (DIA, HEX, UMH, STAR, FULL). The search patterns
- * (methods) are sorted in increasing complexity, with diamond being the
- * simplest and fastest and full being the slowest. DIA, HEX, and UMH were
- * adapted from x264 directly. STAR is an adaption of the HEVC reference
- * encoder's three step search, while full is a naive exhaustive search. The
- * default is the star search, it has a good balance of performance and
- * compression efficiecy */
- int searchMethod;
-
- /* A value between 0 and X265_MAX_SUBPEL_LEVEL which adjusts the amount of
- * effort performed during subpel refine. Default is 5 */
- int subpelRefine;
-
- /* The maximum distance from the motion prediction that the full pel motion
- * search is allowed to progress before terminating. This value can have an
- * effect on frame parallelism, as referenced frames must be at least this
- * many rows of reconstructed pixels ahead of the referencee at all times.
- * (When considering reference lag, the motion prediction must be ignored
- * because it cannot be known ahead of time). Default is 60, which is the
- * default max CU size (64) minus the luma HPEL half-filter length (4). If a
- * smaller CU size is used, the search range should be similarly reduced */
- int searchRange;
-
- /* The maximum number of merge candidates that are considered during inter
- * analysis. This number (between 1 and 5) is signaled in the stream
- * headers and determines the number of bits required to signal a merge so
- * it can have significant trade-offs. The smaller this number the higher
- * the performance but the less compression efficiency. Default is 3 */
- uint32_t maxNumMergeCand;
-
- /* Enable weighted prediction in P slices. This enables weighting analysis
- * in the lookahead, which influences slice decitions, and enables weighting
- * analysis in the main encoder which allows P reference samples to have a
- * weight function applied to them prior to using them for motion
- * compensation. In video which has lighting changes, it can give a large
- * improvement in compression efficiency. Default is enabled */
- int bEnableWeightedPred;
-
- /* Enable weighted bi-prediction in B slices. This option currently has no
- * effect */
- int bEnableWeightedBiPred;
-
- /*== Analysis tools ==*/
-
- /* Enable asymmetrical motion predictions. At CU depths 64, 32, and 16, it
- * is possible to use 25%/75% split partitions in the up, down, right, left
- * directions. For some material this can improve compression efficiency at
- * the cost of extra analysis. bEnableRectInter must be enabled for this
- * feature to be used. Default enabled */
- int bEnableAMP;
-
- /* Enable rectangular motion prediction partitions (vertical and
- * horizontal), available at all CU depths from 64x64 to 8x8. Default is
- * enabled */
- int bEnableRectInter;
-
- /* Enable the use of `coded block flags` (flags set to true when a residual
- * has been coded for a given block) to avoid intra analysis in likely skip
- * blocks. Default is disabled */
- int bEnableCbfFastMode;
-
- /* Enable early skip decisions to avoid intra and inter analysis in likely
- * skip blocks. Default is disabled */
- int bEnableEarlySkip;
-
- /* Apply an optional penalty to the estimated cost of 32x32 intra blocks in
- * non-intra slices. 0 is disabled, 1 enables a small penalty, and 2 enables
- * a full penalty. This favors inter-coding and its low bitrate over
- * potential increases in distortion, but usually improves performance.
- * Default is 0 */
- int rdPenalty;
-
- /* A value betwen X265_NO_RDO_NO_RDOQ and X265_RDO_LEVEL which determines
- * the level of rate distortion optimizations to perform during mode
- * decisions and quantization. The more RDO the better the compression
- * efficiency at a major cost of performance. Default is no RDO (0) */
- int rdLevel;
-
- /*== Coding tools ==*/
-
- /* Enable the implicit signaling of the sign bit of the last coefficient of
- * each transform unit. This saves one bit per TU at the expense of figuring
- * out which coefficient can be toggled with the least distortion.
- * Default is enabled */
- int bEnableSignHiding;
-
- /* Allow intra coded blocks to be encoded directly as residual without the
- * DCT transform, when this improves efficiency. Checking whether the block
- * will benefit from this option incurs a performance penalty. Default is
- * enabled */
- int bEnableTransformSkip;
-
- /* Enable a faster determination of whether skippig the DCT transform will
- * be beneficial. Slight performance gain for some compression loss. Default
- * is enabled */
- int bEnableTSkipFast;
-
- /* Enable the deblocking loop filter, which improves visual quality by
- * reducing blocking effects at block edges, particularly at lower bitrates
- * or higher QP. When enabled it adds another CU row of reference lag,
- * reducing frame parallelism effectiveness. Default is enabled */
- int bEnableLoopFilter;
-
- /* Enable the Sample Adaptive Offset loop filter, which reduces distortion
- * effects by adjusting reconstructed sample values based on histogram
- * analysis to better approximate the original samples. When enabled it adds
- * a CU row of reference lag, reducing frame parallelism effectiveness.
- * Default is enabled */
- int bEnableSAO;
-
- /* Note: when deblocking and SAO are both enabled, the loop filter CU lag is
- * only one row, as they operate in series o the same row. */
-
- /* Select the method in which SAO deals with deblocking boundary pixels. If
- * 0 the right and bottom boundary areas are skipped. If 1, non-deblocked
- * pixels are used entirely. Default is 0 */
- int saoLcuBoundary;
-
- /* Select the scope of the SAO optimization. If 0 SAO is performed over the
- * entire output picture at once, this can severly restrict frame
- * parallelism so it is not recommended for many-core machines. If 1 SAO is
- * performed on LCUs in series. Default is 1 */
- int saoLcuBasedOptimization;
-
- /* Generally a small signed integer which offsets the QP used to quantize
- * the Cb chroma residual (delta from luma QP specified by rate-control).
- * Default is 0, which is recommended */
- int cbQpOffset;
-
- /* Generally a small signed integer which offsets the QP used to quantize
- * the Cr chroma residual (delta from luma QP specified by rate-control).
- * Default is 0, which is recommended */
- int crQpOffset;
-
- /*== Rate Control ==*/
-
- struct
- {
- /* Explicit mode of rate-control, necessary for API users. It must
- * be one of the X265_RC_METHODS enum values. */
- int rateControlMode;
-
- /* Base QP to use for Constant QP rate control. Adaptive QP may alter
- * the QP used for each block. If a QP is specified on the command line
- * CQP rate control is implied. Default: 32 */
- int qp;
-
- /* target bitrate for Average BitRate (ABR) rate control. If a non- zero
- * bitrate is specified on the command line, ABR is implied. Default 0 */
- int bitrate;
-
- /* The degree of rate fluctuation that x265 tolerates. Rate tolerance is used
- * alongwith overflow (difference between actual and target bitrate), to adjust
- qp. Default is 1.0 */
- double rateTolerance;
-
- /* qComp sets the quantizer curve compression factor. It weights the frame
- * quantizer based on the complexity of residual (measured by lookahead).
- * Default value is 0.6. Increasing it to 1 will effectively generate CQP */
- double qCompress;
-
- /* QP offset between I/P and P/B frames. Default ipfactor: 1.4
- * Default pbFactor: 1.3 */
- double ipFactor;
- double pbFactor;
-
- /* Max QP difference between frames. Default: 4 */
- int qpStep;
-
- /* Ratefactor constant: targets a certain constant "quality".
- * Acceptable values between 0 and 51. Default value: 28 */
- double rfConstant;
-
- /* Enable adaptive quantization. This mode distributes available bits between all
- * macroblocks of a frame, assigning more bits to low complexity areas. Turning
- * this ON will usually affect PSNR negatively, however SSIM and visual quality
- * generally improves. Default: OFF (0) */
- int aqMode;
-
- /* Sets the strength of AQ bias towards low detail macroblocks. Valid only if
- * AQ is enabled. Default value: 1.0. Acceptable values between 0.0 and 3.0 */
- double aqStrength;
-
- /* Sets the maximum rate the VBV buffer should be assumed to refill at
- * Default is zero */
- int vbvMaxBitrate;
-
- /* Sets the size of the VBV buffer in kilobits. Default is zero */
- int vbvBufferSize;
-
- /* Sets how full the VBV buffer must be before playback starts. If it is less than
- * 1, then the initial fill is vbv-init * vbvBufferSize. Otherwise, it is
- * interpreted as the initial fill in kbits. Default is 0.9 */
- double vbvBufferInit;
-
- /* Enable CUTree ratecontrol. This keeps track of the CUs that propagate temporally
- * across frames and assigns more bits to these CUs. Improves encode efficiency.
- * Default: OFF (0) */
- int cuTree;
- /* In CRF mode, maximum CRF as caused by VBV */
- double rfConstantMax;
- } rc;
-} x265_param;
-
/***
* If not called, first encoder allocated will auto-detect the CPU and
* initialize performance primitives, which are process global */
void x265_setup_primitives(x265_param *param, int cpu);
-/* x265_param_alloc:
- * Allocates an x265_param instance. The returned param structure is not
- * special in any way, but using this method together with x265_param_free()
- * and x265_param_parse() to set values by name allows the application to treat
- * x265_param as an opaque data struct for version safety */
-x265_param *x265_param_alloc();
-
-/* x265_param_free:
- * Use x265_param_free() to release storage for an x265_param instance
- * allocated by x26_param_alloc() */
-void x265_param_free(x265_param *);
-
-/***
- * Initialize an x265_param_t structure to default values
- */
-void x265_param_default(x265_param *param);
-
-/* x265_param_parse:
- * set one parameter by name.
- * returns 0 on success, or returns one of the following errors.
- * note: BAD_VALUE occurs only if it can't even parse the value,
- * numerical range is not checked until x265_encoder_open() or
- * x265_encoder_reconfig().
- * value=NULL means "true" for boolean options, but is a BAD_VALUE for non-booleans. */
-#define X265_PARAM_BAD_NAME (-1)
-#define X265_PARAM_BAD_VALUE (-2)
-int x265_param_parse(x265_param *p, const char *name, const char *value);
-
-/* x265_param_apply_profile:
- * Applies the restrictions of the given profile. (one of below) */
-static const char * const x265_profile_names[] = { "main", "main10", "mainstillpicture", 0 };
-
-/* (can be NULL, in which case the function will do nothing)
- * returns 0 on success, negative on failure (e.g. invalid profile name). */
-int x265_param_apply_profile(x265_param *, const char *profile);
-
-/* x265_param_default_preset:
- * The same as x265_param_default, but also use the passed preset and tune
- * to modify the default settings.
- * (either can be NULL, which implies no preset or no tune, respectively)
- *
- * Currently available presets are, ordered from fastest to slowest: */
-static const char * const x265_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };
-
-/* The presets can also be indexed numerically, as in:
- * x265_param_default_preset( ¶m, "3", ... )
- * with ultrafast mapping to "0" and placebo mapping to "9". This mapping may
- * of course change if new presets are added in between, but will always be
- * ordered from fastest to slowest.
- *
- * Warning: the speed of these presets scales dramatically. Ultrafast is a full
- * 100 times faster than placebo!
- *
- * Currently available tunings are: */
-static const char * const x265_tune_names[] = { "psnr", "ssim", "zero-latency", 0 };
-
-/* returns 0 on success, negative on failure (e.g. invalid preset/tune name). */
-int x265_param_default_preset(x265_param *, const char *preset, const char *tune);
-
/* x265_picture_alloc:
* Allocates an x265_picture instance. The returned picture structure is not
* special in any way, but using this method together with x265_picture_free()
More information about the x265-devel
mailing list