Coverage Report

Created: 2026-03-08 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/x265/source/common/param.cpp
Line
Count
Source
1
/*****************************************************************************
2
 * Copyright (C) 2013-2020 MulticoreWare, Inc
3
 *
4
 * Authors: Deepthi Nandakumar <deepthi@multicorewareinc.com>
5
 *          Min Chen <min.chen@multicorewareinc.com>
6
 *
7
 * This program is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 2 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
20
 *
21
 * This program is also available under a commercial proprietary license.
22
 * For more information, contact us at license @ x265.com.
23
 *****************************************************************************/
24
25
#include "common.h"
26
#include "slice.h"
27
#include "threading.h"
28
#include "param.h"
29
#include "cpu.h"
30
#include "x265.h"
31
#include "svt.h"
32
33
#if _MSC_VER
34
#pragma warning(disable: 4996) // POSIX functions are just fine, thanks
35
#pragma warning(disable: 4706) // assignment within conditional
36
#pragma warning(disable: 4127) // conditional expression is constant
37
#endif
38
39
#if _WIN32
40
#define strcasecmp _stricmp
41
#endif
42
43
#if !defined(HAVE_STRTOK_R)
44
45
/*
46
 * adapted from public domain strtok_r() by Charlie Gordon
47
 *
48
 *   from comp.lang.c  9/14/2007
49
 *
50
 *      http://groups.google.com/group/comp.lang.c/msg/2ab1ecbb86646684
51
 *
52
 *     (Declaration that it's public domain):
53
 *      http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
54
 */
55
56
#undef strtok_r
57
static char* strtok_r(char* str, const char* delim, char** nextp)
58
{
59
    if (!str)
60
        str = *nextp;
61
62
    str += strspn(str, delim);
63
64
    if (!*str)
65
        return NULL;
66
67
    char *ret = str;
68
69
    str += strcspn(str, delim);
70
71
    if (*str)
72
        *str++ = '\0';
73
74
    *nextp = str;
75
76
    return ret;
77
}
78
79
#endif // if !defined(HAVE_STRTOK_R)
80
81
#if EXPORT_C_API
82
83
/* these functions are exported as C functions (default) */
84
using namespace X265_NS;
85
extern "C" {
86
87
#else
88
89
/* these functions exist within private namespace (multilib) */
90
namespace X265_NS {
91
92
#endif
93
94
x265_param *x265_param_alloc()
95
2.61k
{
96
2.61k
    x265_param* param = (x265_param*)x265_malloc(sizeof(x265_param));
97
2.61k
    memset(param, 0, sizeof(x265_param));
98
#ifdef SVT_HEVC
99
    param->svtHevcParam = (EB_H265_ENC_CONFIGURATION*)x265_malloc(sizeof(EB_H265_ENC_CONFIGURATION));
100
#endif
101
2.61k
    return param;
102
2.61k
}
103
104
void x265_param_free(x265_param* p)
105
2.57k
{
106
2.57k
    x265_zone_free(p);
107
#ifdef SVT_HEVC
108
     x265_free(p->svtHevcParam);
109
#endif
110
2.57k
    x265_free(p);
111
2.57k
}
112
113
#if ENABLE_SCC_EXT
114
enum SCCProfileName
115
{
116
    NONE = 0,
117
    // The following are SCC profiles, which would map to the MAINSCC profile idc.
118
    // The enumeration indicates the bit-depth constraint in the bottom 2 digits
119
    //                           the chroma format in the next digit
120
    //                           the intra constraint in the next digit
121
    //                           If it is a SCC profile there is a '2' for the next digit.
122
    //                           If it is a highthroughput , there is a '2' for the top digit else '1' for the top digit
123
    SCC_MAIN = 121108,
124
    SCC_MAIN_10 = 121110,
125
    SCC_MAIN_444 = 121308,
126
    SCC_MAIN_444_10 = 121310,
127
};
128
129
static const SCCProfileName validSCCProfileNames[1][4/* bit depth constraint 8=0, 10=1, 12=2, 14=3*/][4/*chroma format*/] =
130
{
131
   {
132
        { NONE,         SCC_MAIN,      NONE,      SCC_MAIN_444                     }, // 8-bit  intra for 400, 420, 422 and 444
133
        { NONE,         SCC_MAIN_10,   NONE,      SCC_MAIN_444_10                  }, // 10-bit intra for 400, 420, 422 and 444
134
        { NONE,         NONE,          NONE,      NONE                             }, // 12-bit intra for 400, 420, 422 and 444
135
        { NONE,         NONE,          NONE,      NONE                             }  // 16-bit intra for 400, 420, 422 and 444
136
    },
137
};
138
#endif
139
140
void x265_param_default(x265_param* param)
141
2.61k
{
142
#ifdef SVT_HEVC
143
    EB_H265_ENC_CONFIGURATION* svtParam = (EB_H265_ENC_CONFIGURATION*)param->svtHevcParam;
144
#endif
145
146
2.61k
    memset(param, 0, sizeof(x265_param));
147
148
    /* Applying default values to all elements in the param structure */
149
2.61k
    param->cpuid = X265_NS::cpu_detect(false);
150
2.61k
    param->bEnableWavefront = 1;
151
2.61k
    param->frameNumThreads = 0;
152
153
2.61k
    param->logLevel = X265_LOG_INFO;
154
2.61k
    param->csvLogLevel = 0;
155
2.61k
    param->csvfn[0] = 0;
156
2.61k
    param->rc.lambdaFileName[0] = 0;
157
2.61k
    param->bLogCuStats = 0;
158
2.61k
    param->decodedPictureHashSEI = 0;
159
160
    /* Quality Measurement Metrics */
161
2.61k
    param->bEnablePsnr = 0;
162
2.61k
    param->bEnableSsim = 0;
163
164
    /* Source specifications */
165
2.61k
    param->internalBitDepth = X265_DEPTH;
166
2.61k
    param->sourceBitDepth = 8;
167
2.61k
    param->internalCsp = X265_CSP_I420;
168
2.61k
    param->levelIdc = 0; //Auto-detect level
169
2.61k
    param->uhdBluray = 0;
170
2.61k
    param->bHighTier = 1; //Allow high tier by default
171
2.61k
    param->interlaceMode = 0;
172
2.61k
    param->bField = 0;
173
2.61k
    param->bAnnexB = 1;
174
2.61k
    param->bRepeatHeaders = 0;
175
2.61k
    param->bEnableAccessUnitDelimiters = 0;
176
2.61k
    param->bEnableEndOfBitstream = 0;
177
2.61k
    param->bEnableEndOfSequence = 0;
178
2.61k
    param->bEmitHRDSEI = 0;
179
2.61k
    param->bEmitInfoSEI = 1;
180
2.61k
    param->bEmitHDRSEI = 0; /*Deprecated*/
181
2.61k
    param->bEmitHDR10SEI = 0;
182
2.61k
    param->bEmitIDRRecoverySEI = 0;
183
184
    /* CU definitions */
185
2.61k
    param->maxCUSize = 64;
186
2.61k
    param->minCUSize = 8;
187
2.61k
    param->tuQTMaxInterDepth = 1;
188
2.61k
    param->tuQTMaxIntraDepth = 1;
189
2.61k
    param->maxTUSize = 32;
190
191
    /* Coding Structure */
192
2.61k
    param->keyframeMin = 0;
193
2.61k
    param->keyframeMax = 250;
194
2.61k
    param->gopLookahead = 0;
195
2.61k
    param->bOpenGOP = 1;
196
2.61k
  param->craNal = 0;
197
2.61k
    param->bframes = 4;
198
2.61k
    param->lookaheadDepth = 20;
199
2.61k
    param->bFrameAdaptive = X265_B_ADAPT_TRELLIS;
200
2.61k
    param->bBPyramid = 1;
201
2.61k
    param->scenecutThreshold = 40; /* Magic number pulled in from x264 */
202
2.61k
    param->bHistBasedSceneCut = 0;
203
2.61k
    param->lookaheadSlices = 8;
204
2.61k
    param->lookaheadThreads = 0;
205
2.61k
    param->scenecutBias = 5.0;
206
2.61k
    param->radl = 0;
207
2.61k
    param->chunkStart = 0;
208
2.61k
    param->chunkEnd = 0;
209
2.61k
    param->bEnableHRDConcatFlag = 0;
210
2.61k
    param->bEnableFades = 0;
211
2.61k
    param->bEnableSceneCutAwareQp = 0;
212
2.61k
    param->fwdMaxScenecutWindow = 1200;
213
2.61k
    param->bwdMaxScenecutWindow = 600;
214
2.61k
    param->mcstfFrameRange = 2;
215
18.3k
    for (int i = 0; i < 6; i++)
216
15.6k
    {
217
15.6k
        int deltas[6] = { 5, 4, 3, 2, 1, 0 };
218
219
15.6k
        param->fwdScenecutWindow[i] = 200;
220
15.6k
        param->fwdRefQpDelta[i] = deltas[i];
221
15.6k
        param->fwdNonRefQpDelta[i] = param->fwdRefQpDelta[i] + (SLICE_TYPE_DELTA * param->fwdRefQpDelta[i]);
222
223
15.6k
        param->bwdScenecutWindow[i] = 100;
224
15.6k
        param->bwdRefQpDelta[i] = -1;
225
15.6k
        param->bwdNonRefQpDelta[i] = -1;
226
15.6k
    }
227
228
    /* Intra Coding Tools */
229
2.61k
    param->bEnableConstrainedIntra = 0;
230
2.61k
    param->bEnableStrongIntraSmoothing = 1;
231
2.61k
    param->bEnableFastIntra = 0;
232
2.61k
    param->bEnableSplitRdSkip = 0;
233
234
    /* Inter Coding tools */
235
2.61k
    param->searchMethod = X265_HEX_SEARCH;
236
2.61k
    param->subpelRefine = 2;
237
2.61k
    param->searchRange = 57;
238
2.61k
    param->maxNumMergeCand = 3;
239
2.61k
    param->limitReferences = 1;
240
2.61k
    param->limitModes = 0;
241
2.61k
    param->bEnableWeightedPred = 1;
242
2.61k
    param->bEnableWeightedBiPred = 0;
243
2.61k
    param->bEnableEarlySkip = 1;
244
2.61k
    param->recursionSkipMode = 1;
245
2.61k
    param->edgeVarThreshold = 0.05f;
246
2.61k
    param->bEnableAMP = 0;
247
2.61k
    param->bEnableRectInter = 0;
248
2.61k
    param->rdLevel = 3;
249
2.61k
    param->rdoqLevel = 0;
250
2.61k
    param->bEnableSignHiding = 1;
251
2.61k
    param->bEnableTransformSkip = 0;
252
2.61k
    param->bEnableTSkipFast = 0;
253
2.61k
    param->maxNumReferences = 3;
254
2.61k
    param->bEnableTemporalMvp = 1;
255
2.61k
    param->bEnableHME = 0;
256
2.61k
    param->hmeSearchMethod[0] = X265_HEX_SEARCH;
257
2.61k
    param->hmeSearchMethod[1] = param->hmeSearchMethod[2] = X265_UMH_SEARCH;
258
2.61k
    param->hmeRange[0] = 16;
259
2.61k
    param->hmeRange[1] = 32;
260
2.61k
    param->hmeRange[2] = 48;
261
2.61k
    param->bSourceReferenceEstimation = 0;
262
2.61k
    param->limitTU = 0;
263
2.61k
    param->dynamicRd = 0;
264
265
    /* Loop Filter */
266
2.61k
    param->bEnableLoopFilter = 1;
267
268
    /* SAO Loop Filter */
269
2.61k
    param->bEnableSAO = 1;
270
2.61k
    param->bSaoNonDeblocked = 0;
271
2.61k
    param->bLimitSAO = 0;
272
2.61k
    param->selectiveSAO = 0;
273
274
    /* Coding Quality */
275
2.61k
    param->cbQpOffset = 0;
276
2.61k
    param->crQpOffset = 0;
277
2.61k
    param->rdPenalty = 0;
278
2.61k
    param->psyRd = 2.0;
279
2.61k
    param->psyRdoq = 0.0;
280
2.61k
    param->analysisReuseMode = 0; /*DEPRECATED*/
281
2.61k
    param->analysisMultiPassRefine = 0;
282
2.61k
    param->analysisMultiPassDistortion = 0;
283
2.61k
    param->analysisReuseFileName[0] = 0;
284
2.61k
    param->analysisSave[0] = 0;
285
2.61k
    param->analysisLoad[0] = 0;
286
2.61k
    param->bIntraInBFrames = 1;
287
2.61k
    param->bLossless = 0;
288
2.61k
    param->bCULossless = 0;
289
2.61k
    param->bEnableTemporalSubLayers = 0;
290
2.61k
    param->bEnableRdRefine = 0;
291
2.61k
    param->bMultiPassOptRPS = 0;
292
2.61k
    param->bSsimRd = 0;
293
294
    /* Rate control options */
295
2.61k
    param->rc.vbvMaxBitrate = 0;
296
2.61k
    param->rc.vbvBufferSize = 0;
297
2.61k
    param->rc.vbvBufferInit = 0.9;
298
2.61k
    param->vbvBufferEnd = 0;
299
2.61k
    param->vbvEndFrameAdjust = 0;
300
2.61k
    param->minVbvFullness = 50;
301
2.61k
    param->maxVbvFullness = 80;
302
2.61k
    param->rc.rfConstant = 28;
303
2.61k
    param->rc.bitrate = 0;
304
2.61k
    param->rc.qCompress = 0.6;
305
2.61k
    param->rc.ipFactor = 1.4f;
306
2.61k
    param->rc.pbFactor = 1.3f;
307
2.61k
    param->rc.qpStep = 4;
308
2.61k
    param->rc.rateControlMode = X265_RC_CRF;
309
2.61k
    param->rc.qp = 32;
310
2.61k
    param->rc.aqMode = X265_AQ_AUTO_VARIANCE;
311
2.61k
    param->rc.hevcAq = 0;
312
2.61k
    param->rc.qgSize = 32;
313
2.61k
    param->rc.aqStrength = 1.0;
314
2.61k
    param->rc.qpAdaptationRange = 1.0;
315
2.61k
    param->rc.cuTree = 1;
316
2.61k
    param->rc.rfConstantMax = 0;
317
2.61k
    param->rc.rfConstantMin = 0;
318
2.61k
    param->rc.bStatRead = 0;
319
2.61k
    param->rc.bStatWrite = 0;
320
2.61k
    param->rc.dataShareMode = X265_SHARE_MODE_FILE;
321
2.61k
    param->rc.statFileName[0] = 0;
322
2.61k
    param->rc.sharedMemName[0] = 0;
323
2.61k
    param->rc.bEncFocusedFramesOnly = 0;
324
2.61k
    param->rc.complexityBlur = 20;
325
2.61k
    param->rc.qblur = 0.5;
326
2.61k
    param->rc.zoneCount = 0;
327
2.61k
    param->rc.zonefileCount = 0;
328
2.61k
    param->rc.zones = NULL;
329
2.61k
    param->rc.bEnableSlowFirstPass = 1;
330
2.61k
    param->rc.bStrictCbr = 0;
331
2.61k
    param->rc.bEnableGrain = 0;
332
2.61k
    param->rc.qpMin = 0;
333
2.61k
    param->rc.qpMax = QP_MAX_MAX;
334
2.61k
    param->rc.bEnableConstVbv = 0;
335
2.61k
    param->bResetZoneConfig = 1;
336
2.61k
    param->reconfigWindowSize = 0;
337
2.61k
    param->decoderVbvMaxRate = 0;
338
2.61k
    param->bliveVBV2pass = 0;
339
340
    /* Video Usability Information (VUI) */
341
2.61k
    param->vui.aspectRatioIdc = 0;
342
2.61k
    param->vui.sarWidth = 0;
343
2.61k
    param->vui.sarHeight = 0;
344
2.61k
    param->vui.bEnableOverscanAppropriateFlag = 0;
345
2.61k
    param->vui.bEnableVideoSignalTypePresentFlag = 0;
346
2.61k
    param->vui.videoFormat = 5;
347
2.61k
    param->vui.bEnableVideoFullRangeFlag = 0;
348
2.61k
    param->vui.bEnableColorDescriptionPresentFlag = 0;
349
2.61k
    param->vui.colorPrimaries = 2;
350
2.61k
    param->vui.transferCharacteristics = 2;
351
2.61k
    param->vui.matrixCoeffs = 2;
352
2.61k
    param->vui.bEnableChromaLocInfoPresentFlag = 0;
353
2.61k
    param->vui.chromaSampleLocTypeTopField = 0;
354
2.61k
    param->vui.chromaSampleLocTypeBottomField = 0;
355
2.61k
    param->vui.bEnableDefaultDisplayWindowFlag = 0;
356
2.61k
    param->vui.defDispWinLeftOffset = 0;
357
2.61k
    param->vui.defDispWinRightOffset = 0;
358
2.61k
    param->vui.defDispWinTopOffset = 0;
359
2.61k
    param->vui.defDispWinBottomOffset = 0;
360
2.61k
    param->maxCLL = 0;
361
2.61k
    param->maxFALL = 0;
362
2.61k
    param->minLuma = 0;
363
2.61k
    param->maxLuma = PIXEL_MAX;
364
2.61k
    param->log2MaxPocLsb = 8;
365
2.61k
    param->maxSlices = 1;
366
2.61k
    param->videoSignalTypePreset[0] = 0;
367
368
    /*Conformance window*/
369
2.61k
    param->confWinRightOffset = 0;
370
2.61k
    param->confWinBottomOffset = 0;
371
372
2.61k
    param->bEmitVUITimingInfo   = 1;
373
2.61k
    param->bEmitVUIHRDInfo      = 1;
374
2.61k
    param->bOptQpPPS            = 0;
375
2.61k
    param->bOptRefListLengthPPS = 0;
376
2.61k
    param->bOptCUDeltaQP        = 0;
377
2.61k
    param->bAQMotion = 0;
378
2.61k
    param->bHDROpt = 0; /*DEPRECATED*/
379
2.61k
    param->bHDR10Opt = 0;
380
2.61k
    param->analysisReuseLevel = 0;  /*DEPRECATED*/
381
2.61k
    param->analysisSaveReuseLevel = 0;
382
2.61k
    param->analysisLoadReuseLevel = 0;
383
2.61k
    param->toneMapFile[0] = 0;
384
2.61k
    param->bDhdr10opt = 0;
385
2.61k
    param->dolbyProfile = 0;
386
2.61k
    param->bCTUInfo = 0;
387
2.61k
    param->bUseRcStats = 0;
388
2.61k
    param->scaleFactor = 0;
389
2.61k
    param->intraRefine = 0;
390
2.61k
    param->interRefine = 0;
391
2.61k
    param->bDynamicRefine = 0;
392
2.61k
    param->mvRefine = 1;
393
2.61k
    param->ctuDistortionRefine = 0;
394
2.61k
    param->bUseAnalysisFile = 1;
395
2.61k
    param->csvfpt = NULL;
396
2.61k
    param->forceFlush = 0;
397
2.61k
    param->bDisableLookahead = 0;
398
2.61k
    param->bCopyPicToFrame = 1;
399
2.61k
    param->maxAUSizeFactor = 1;
400
2.61k
    param->naluFile[0] = 0;
401
402
    /* DCT Approximations */
403
2.61k
    param->bLowPassDct = 0;
404
2.61k
    param->bAnalysisType = 0;
405
2.61k
    param->bSingleSeiNal = 0;
406
407
    /* SEI messages */
408
2.61k
    param->preferredTransferCharacteristics = -1;
409
2.61k
    param->pictureStructure = -1;
410
2.61k
    param->bEmitCLL = 1;
411
412
2.61k
    param->bEnableFrameDuplication = 0;
413
2.61k
    param->dupThreshold = 70;
414
415
    /* SVT Hevc Encoder specific params */
416
2.61k
    param->bEnableSvtHevc = 0;
417
2.61k
    param->svtHevcParam = NULL;
418
419
    /* MCSTF */
420
2.61k
    param->bEnableTemporalFilter = 0;
421
2.61k
    param->temporalFilterStrength = 0.95;
422
2.61k
    param->searchRangeForLayer0 = 3;
423
2.61k
    param->searchRangeForLayer1 = 3;
424
2.61k
    param->searchRangeForLayer2 = 3;
425
426
    /* Threaded ME */
427
2.61k
    param->tmeTaskBlockSize = 1;
428
2.61k
    param->tmeNumBufferRows = 10;
429
430
    /*Alpha Channel Encoding*/
431
2.61k
    param->bEnableAlpha = 0;
432
2.61k
    param->numScalableLayers = 1;
433
434
#ifdef SVT_HEVC
435
    param->svtHevcParam = svtParam;
436
    svt_param_default(param);
437
#endif
438
    /* Film grain characteristics model filename */
439
2.61k
    param->filmGrain = NULL;
440
2.61k
    param->aomFilmGrain = NULL;
441
2.61k
    param->bEnableSBRC = 0;
442
443
    /* Multi-View Encoding*/
444
2.61k
    param->numViews = 1;
445
2.61k
    param->format = 0;
446
447
2.61k
    param->numLayers = 1;
448
449
    /* SCC */
450
2.61k
    param->bEnableSCC = 0;
451
452
2.61k
    param->bConfigRCFrame = 0;
453
2.61k
}
454
455
int x265_param_default_preset(x265_param* param, const char* preset, const char* tune)
456
654
{
457
654
#if EXPORT_C_API
458
654
    ::x265_param_default(param);
459
#else
460
    X265_NS::x265_param_default(param);
461
#endif
462
463
654
    if (preset)
464
654
    {
465
654
        char *end;
466
654
        int i = strtol(preset, &end, 10);
467
654
        if (*end == 0 && i >= 0 && i < (int)(sizeof(x265_preset_names) / sizeof(*x265_preset_names) - 1))
468
0
            preset = x265_preset_names[i];
469
470
654
        if (!strcmp(preset, "ultrafast"))
471
0
        {
472
0
            param->mcstfFrameRange = 1;
473
0
            param->maxNumMergeCand = 2;
474
0
            param->bIntraInBFrames = 0;
475
0
            param->lookaheadDepth = 5;
476
0
            param->scenecutThreshold = 0; // disable lookahead
477
0
            param->maxCUSize = 32;
478
0
            param->minCUSize = 16;
479
0
            param->bframes = 3;
480
0
            param->bFrameAdaptive = 0;
481
0
            param->subpelRefine = 0;
482
0
            param->searchMethod = X265_DIA_SEARCH;
483
0
            param->bEnableSAO = 0;
484
0
            param->bEnableSignHiding = 0;
485
0
            param->bEnableWeightedPred = 0;
486
0
            param->rdLevel = 2;
487
0
            param->maxNumReferences = 1;
488
0
            param->limitReferences = 0;
489
0
            param->rc.aqStrength = 0.0;
490
0
            param->rc.aqMode = X265_AQ_NONE;
491
0
            param->rc.hevcAq = 0;
492
0
            param->rc.qgSize = 32;
493
0
            param->bEnableFastIntra = 1;
494
0
        }
495
654
        else if (!strcmp(preset, "superfast"))
496
0
        {
497
0
            param->mcstfFrameRange = 1;
498
0
            param->maxNumMergeCand = 2;
499
0
            param->bIntraInBFrames = 0;
500
0
            param->lookaheadDepth = 10;
501
0
            param->maxCUSize = 32;
502
0
            param->bframes = 3;
503
0
            param->bFrameAdaptive = 0;
504
0
            param->subpelRefine = 1;
505
0
            param->bEnableWeightedPred = 0;
506
0
            param->rdLevel = 2;
507
0
            param->maxNumReferences = 1;
508
0
            param->limitReferences = 0;
509
0
            param->rc.aqStrength = 0.0;
510
0
            param->rc.aqMode = X265_AQ_NONE;
511
0
            param->rc.hevcAq = 0;
512
0
            param->rc.qgSize = 32;
513
0
            param->bEnableSAO = 0;
514
0
            param->bEnableFastIntra = 1;
515
0
        }
516
654
        else if (!strcmp(preset, "veryfast"))
517
0
        {
518
0
            param->mcstfFrameRange = 1;
519
0
            param->maxNumMergeCand = 2;
520
0
            param->limitReferences = 3;
521
0
            param->bIntraInBFrames = 0;
522
0
            param->lookaheadDepth = 15;
523
0
            param->bFrameAdaptive = 0;
524
0
            param->subpelRefine = 1;
525
0
            param->rdLevel = 2;
526
0
            param->maxNumReferences = 2;
527
0
            param->rc.qgSize = 32;
528
0
            param->bEnableFastIntra = 1;
529
0
        }
530
654
        else if (!strcmp(preset, "faster"))
531
0
        {
532
0
            param->mcstfFrameRange = 1;
533
0
            param->maxNumMergeCand = 2;
534
0
            param->limitReferences = 3;
535
0
            param->bIntraInBFrames = 0;
536
0
            param->lookaheadDepth = 15;
537
0
            param->bFrameAdaptive = 0;
538
0
            param->rdLevel = 2;
539
0
            param->maxNumReferences = 2;
540
0
            param->bEnableFastIntra = 1;
541
0
        }
542
654
        else if (!strcmp(preset, "fast"))
543
0
        {
544
0
            param->mcstfFrameRange = 1;
545
0
            param->maxNumMergeCand = 2;
546
0
            param->limitReferences = 3;
547
0
            param->bEnableEarlySkip = 0;
548
0
            param->bIntraInBFrames = 0;
549
0
            param->lookaheadDepth = 15;
550
0
            param->bFrameAdaptive = 0;
551
0
            param->rdLevel = 2;
552
0
            param->maxNumReferences = 3;
553
0
            param->bEnableFastIntra = 1;
554
0
        }
555
654
        else if (!strcmp(preset, "medium"))
556
0
        {
557
0
            param->mcstfFrameRange = 1;
558
            /* defaults */
559
0
        }
560
654
        else if (!strcmp(preset, "slow"))
561
654
        {
562
654
            param->limitReferences = 3;
563
654
            param->bEnableEarlySkip = 0;
564
654
            param->bIntraInBFrames = 0;
565
654
            param->bEnableRectInter = 1;
566
654
            param->lookaheadDepth = 25;
567
654
            param->rdLevel = 4;
568
654
            param->rdoqLevel = 2;
569
654
            param->psyRdoq = 1.0;
570
654
            param->subpelRefine = 3;
571
654
            param->searchMethod = X265_STAR_SEARCH;
572
654
            param->maxNumReferences = 4;
573
654
            param->limitModes = 1;
574
654
            param->lookaheadSlices = 4; // limit parallelism as already enough work exists
575
654
        }
576
0
        else if (!strcmp(preset, "slower"))
577
0
        {
578
0
            param->bEnableEarlySkip = 0;
579
0
            param->bEnableWeightedBiPred = 1;
580
0
            param->bEnableAMP = 1;
581
0
            param->bEnableRectInter = 1;
582
0
            param->lookaheadDepth = 40;
583
0
            param->bframes = 8;
584
0
            param->tuQTMaxInterDepth = 3;
585
0
            param->tuQTMaxIntraDepth = 3;
586
0
            param->rdLevel = 6;
587
0
            param->rdoqLevel = 2;
588
0
            param->psyRdoq = 1.0;
589
0
            param->subpelRefine = 4;
590
0
            param->maxNumMergeCand = 4;
591
0
            param->searchMethod = X265_STAR_SEARCH;
592
0
            param->maxNumReferences = 5;
593
0
            param->limitModes = 1;
594
0
            param->lookaheadSlices = 0; // disabled for best quality
595
0
            param->limitTU = 4;
596
0
        }
597
0
        else if (!strcmp(preset, "veryslow"))
598
0
        {
599
0
            param->bEnableEarlySkip = 0;
600
0
            param->bEnableWeightedBiPred = 1;
601
0
            param->bEnableAMP = 1;
602
0
            param->bEnableRectInter = 1;
603
0
            param->lookaheadDepth = 40;
604
0
            param->bframes = 8;
605
0
            param->tuQTMaxInterDepth = 3;
606
0
            param->tuQTMaxIntraDepth = 3;
607
0
            param->rdLevel = 6;
608
0
            param->rdoqLevel = 2;
609
0
            param->psyRdoq = 1.0;
610
0
            param->subpelRefine = 4;
611
0
            param->maxNumMergeCand = 5;
612
0
            param->searchMethod = X265_STAR_SEARCH;
613
0
            param->maxNumReferences = 5;
614
0
            param->limitReferences = 0;
615
0
            param->limitModes = 0;
616
0
            param->lookaheadSlices = 0; // disabled for best quality
617
0
            param->limitTU = 0;
618
0
        }
619
0
        else if (!strcmp(preset, "placebo"))
620
0
        {
621
0
            param->bEnableEarlySkip = 0;
622
0
            param->bEnableWeightedBiPred = 1;
623
0
            param->bEnableAMP = 1;
624
0
            param->bEnableRectInter = 1;
625
0
            param->lookaheadDepth = 60;
626
0
            param->searchRange = 92;
627
0
            param->bframes = 8;
628
0
            param->tuQTMaxInterDepth = 4;
629
0
            param->tuQTMaxIntraDepth = 4;
630
0
            param->rdLevel = 6;
631
0
            param->rdoqLevel = 2;
632
0
            param->psyRdoq = 1.0;
633
0
            param->subpelRefine = 5;
634
0
            param->maxNumMergeCand = 5;
635
0
            param->searchMethod = X265_STAR_SEARCH;
636
0
            param->bEnableTransformSkip = 1;
637
0
            param->recursionSkipMode = 0;
638
0
            param->maxNumReferences = 5;
639
0
            param->limitReferences = 0;
640
0
            param->lookaheadSlices = 0; // disabled for best quality
641
            // TODO: optimized esa
642
0
        }
643
0
        else
644
0
            return -1;
645
654
    }
646
654
    if (tune)
647
654
    {
648
654
        param->tune = tune;
649
654
        if (!strcmp(tune, "psnr"))
650
0
        {
651
0
            param->rc.aqStrength = 0.0;
652
0
            param->psyRd = 0.0;
653
0
            param->psyRdoq = 0.0;
654
0
        }
655
654
        else if (!strcmp(tune, "ssim"))
656
654
        {
657
654
            param->rc.aqMode = X265_AQ_AUTO_VARIANCE;
658
654
            param->psyRd = 0.0;
659
654
            param->psyRdoq = 0.0;
660
654
        }
661
0
        else if (!strcmp(tune, "fastdecode") ||
662
0
                 !strcmp(tune, "fast-decode"))
663
0
        {
664
0
            param->bEnableLoopFilter = 0;
665
0
            param->bEnableSAO = 0;
666
0
            param->bEnableWeightedPred = 0;
667
0
            param->bEnableWeightedBiPred = 0;
668
0
            param->bIntraInBFrames = 0;
669
0
        }
670
0
        else if (!strcmp(tune, "zerolatency") ||
671
0
                 !strcmp(tune, "zero-latency"))
672
0
        {
673
0
            param->bFrameAdaptive = 0;
674
0
            param->bframes = 0;
675
0
            param->lookaheadDepth = 0;
676
0
            param->scenecutThreshold = 0;
677
0
            param->bHistBasedSceneCut = 0;
678
0
            param->rc.cuTree = 0;
679
0
            param->frameNumThreads = 1;
680
0
        }
681
0
        else if (!strcmp(tune, "grain"))
682
0
        {
683
0
            param->rc.ipFactor = 1.1;
684
0
            param->rc.pbFactor = 1.0;
685
0
            param->rc.cuTree = 0;
686
0
            param->rc.aqMode = 0;
687
0
            param->rc.hevcAq = 0;
688
0
            param->rc.qpStep = 1;
689
0
            param->rc.bEnableGrain = 1;
690
0
            param->recursionSkipMode = 0;
691
0
            param->psyRd = 4.0;
692
0
            param->psyRdoq = 10.0;
693
0
            param->bEnableSAO = 0;
694
0
            param->rc.bEnableConstVbv = 1;
695
0
        }
696
0
        else if (!strcmp(tune, "animation"))
697
0
        {
698
0
            param->bframes = (param->bframes + 2) >= param->lookaheadDepth? param->bframes : param->bframes + 2;
699
0
            param->psyRd = 0.4;
700
0
            param->rc.aqStrength = 0.4;
701
0
            param->deblockingFilterBetaOffset = 1;
702
0
            param->deblockingFilterTCOffset = 1;
703
0
        }
704
0
        else if (!strcmp(tune, "vmaf"))  /*Adding vmaf for x265 + SVT-HEVC integration support*/
705
0
        {
706
            /*vmaf is under development, currently x265 won't support vmaf*/
707
0
        }
708
0
        else
709
0
            return -1;
710
654
    }
711
712
#ifdef SVT_HEVC
713
    if (svt_set_preset(param, preset))
714
        return -1;
715
#endif
716
717
654
    return 0;
718
654
}
719
720
static int x265_atobool(const char* str, bool& bError)
721
3.92k
{
722
3.92k
    if (!strcmp(str, "1") ||
723
2.61k
        !strcmp(str, "true") ||
724
2.61k
        !strcmp(str, "yes"))
725
1.30k
        return 1;
726
2.61k
    if (!strcmp(str, "0") ||
727
1.30k
        !strcmp(str, "false") ||
728
1.30k
        !strcmp(str, "no"))
729
1.30k
        return 0;
730
1.30k
    bError = true;
731
1.30k
    return 0;
732
2.61k
}
733
734
static int parseName(const char* arg, const char* const* names, bool& bError)
735
654
{
736
1.30k
    for (int i = 0; names[i]; i++)
737
1.30k
        if (!strcmp(arg, names[i]))
738
654
            return i;
739
740
0
    return x265_atoi(arg, bError);
741
654
}
742
/* internal versions of string-to-int with additional error checking */
743
#undef atoi
744
#undef atof
745
#define atoi(str) x265_atoi(str, bError)
746
#define atof(str) x265_atof(str, bError)
747
#define atobool(str) (x265_atobool(str, bError))
748
749
int x265_scenecut_aware_qp_param_parse(x265_param* p, const char* name, const char* value)
750
0
{
751
0
    bool bError = false;
752
0
    char nameBuf[64];
753
0
    if (!name)
754
0
        return X265_PARAM_BAD_NAME;
755
    // skip -- prefix if provided
756
0
    if (name[0] == '-' && name[1] == '-')
757
0
        name += 2;
758
    // s/_/-/g
759
0
    if (strlen(name) + 1 < sizeof(nameBuf) && strchr(name, '_'))
760
0
    {
761
0
        char *c;
762
0
        strcpy(nameBuf, name);
763
0
        while ((c = strchr(nameBuf, '_')) != 0)
764
0
            *c = '-';
765
0
        name = nameBuf;
766
0
    }
767
0
    if (!value)
768
0
        value = "true";
769
0
    else if (value[0] == '=')
770
0
        value++;
771
0
#define OPT(STR) else if (!strcmp(name, STR))
772
0
    if (0);
773
0
    OPT("scenecut-aware-qp") p->bEnableSceneCutAwareQp = x265_atoi(value, bError);
774
0
    OPT("masking-strength") bError = parseMaskingStrength(p, value);
775
0
    else
776
0
        return X265_PARAM_BAD_NAME;
777
0
#undef OPT
778
0
    return bError ? X265_PARAM_BAD_VALUE : 0;
779
0
}
780
781
782
/* internal versions of string-to-int with additional error checking */
783
#undef atoi
784
#undef atof
785
0
#define atoi(str) x265_atoi(str, bError)
786
0
#define atof(str) x265_atof(str, bError)
787
0
#define atobool(str) (x265_atobool(str, bError))
788
789
int x265_zone_param_parse(x265_param* p, const char* name, const char* value)
790
0
{
791
0
    bool bError = false;
792
0
    char nameBuf[64];
793
794
0
    if (!name)
795
0
        return X265_PARAM_BAD_NAME;
796
797
    // skip -- prefix if provided
798
0
    if (name[0] == '-' && name[1] == '-')
799
0
        name += 2;
800
801
    // s/_/-/g
802
0
    if (strlen(name) + 1 < sizeof(nameBuf) && strchr(name, '_'))
803
0
    {
804
0
        char *c;
805
0
        strcpy(nameBuf, name);
806
0
        while ((c = strchr(nameBuf, '_')) != 0)
807
0
            *c = '-';
808
809
0
        name = nameBuf;
810
0
    }
811
812
0
    if (!strncmp(name, "no-", 3))
813
0
    {
814
0
        name += 3;
815
0
        value = !value || x265_atobool(value, bError) ? "false" : "true";
816
0
    }
817
0
    else if (!strncmp(name, "no", 2))
818
0
    {
819
0
        name += 2;
820
0
        value = !value || x265_atobool(value, bError) ? "false" : "true";
821
0
    }
822
0
    else if (!value)
823
0
        value = "true";
824
0
    else if (value[0] == '=')
825
0
        value++;
826
827
0
#define OPT(STR) else if (!strcmp(name, STR))
828
0
#define OPT2(STR1, STR2) else if (!strcmp(name, STR1) || !strcmp(name, STR2))
829
830
0
    if (0);
831
0
    OPT("ref") p->maxNumReferences = atoi(value);
832
0
    OPT("fast-intra") p->bEnableFastIntra = atobool(value);
833
0
    OPT("early-skip") p->bEnableEarlySkip = atobool(value);
834
0
    OPT("rskip") p->recursionSkipMode = atoi(value);
835
0
    OPT("rskip-edge-threshold") p->edgeVarThreshold = atoi(value)/100.0f;
836
0
    OPT("me") p->searchMethod = parseName(value, x265_motion_est_names, bError);
837
0
    OPT("subme") p->subpelRefine = atoi(value);
838
0
    OPT("merange") p->searchRange = atoi(value);
839
0
    OPT("rect") p->bEnableRectInter = atobool(value);
840
0
    OPT("amp") p->bEnableAMP = atobool(value);
841
0
    OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value);
842
0
    OPT("rd") p->rdLevel = atoi(value);
843
0
    OPT("radl") p->radl = atoi(value);
844
0
    OPT2("rdoq", "rdoq-level")
845
0
    {
846
0
        int bval = atobool(value);
847
0
        if (bError || bval)
848
0
        {
849
0
            bError = false;
850
0
            p->rdoqLevel = atoi(value);
851
0
        }
852
0
        else
853
0
            p->rdoqLevel = 0;
854
0
    }
855
0
    OPT("b-intra") p->bIntraInBFrames = atobool(value);
856
0
    OPT("scaling-list") snprintf(p->scalingLists, X265_MAX_STRING_SIZE, "%s", value);
857
0
    OPT("crf")
858
0
    {
859
0
        p->rc.rfConstant = atof(value);
860
0
        p->rc.rateControlMode = X265_RC_CRF;
861
0
    }
862
0
    OPT("qp")
863
0
    {
864
0
        p->rc.qp = atoi(value);
865
0
        p->rc.rateControlMode = X265_RC_CQP;
866
0
    }
867
0
    OPT("bitrate")
868
0
    {
869
0
        p->rc.bitrate = atoi(value);
870
0
        p->rc.rateControlMode = X265_RC_ABR;
871
0
    }
872
0
    OPT("aq-mode") p->rc.aqMode = atoi(value);
873
0
    OPT("aq-strength") p->rc.aqStrength = atof(value);
874
0
    OPT("nr-intra") p->noiseReductionIntra = atoi(value);
875
0
    OPT("nr-inter") p->noiseReductionInter = atoi(value);
876
0
    OPT("limit-modes") p->limitModes = atobool(value);
877
0
    OPT("splitrd-skip") p->bEnableSplitRdSkip = atobool(value);
878
0
    OPT("cu-lossless") p->bCULossless = atobool(value);
879
0
    OPT("rd-refine") p->bEnableRdRefine = atobool(value);
880
0
    OPT("limit-tu") p->limitTU = atoi(value);
881
0
    OPT("tskip") p->bEnableTransformSkip = atobool(value);
882
0
    OPT("tskip-fast") p->bEnableTSkipFast = atobool(value);
883
0
    OPT("rdpenalty") p->rdPenalty = atoi(value);
884
0
    OPT("dynamic-rd") p->dynamicRd = atof(value);
885
0
    else
886
0
        return X265_PARAM_BAD_NAME;
887
888
0
#undef OPT
889
0
#undef OPT2
890
891
0
    return bError ? X265_PARAM_BAD_VALUE : 0;
892
0
}
893
894
#undef atobool
895
#undef atoi
896
#undef atof
897
898
/* internal versions of string-to-int with additional error checking */
899
#undef atoi
900
#undef atof
901
3.27k
#define atoi(str) x265_atoi(str, bError)
902
1.30k
#define atof(str) x265_atof(str, bError)
903
3.92k
#define atobool(str) (bNameWasBool = true, x265_atobool(str, bError))
904
905
int x265_param_parse(x265_param* p, const char* name, const char* value)
906
7.84k
{
907
7.84k
    bool bError = false;
908
7.84k
    bool bNameWasBool = false;
909
7.84k
    bool bValueWasNull = !value;
910
7.84k
    bool bExtraParams = false;
911
7.84k
    char nameBuf[64];
912
#ifdef SVT_HEVC
913
    static int count;
914
#endif
915
916
7.84k
    if (!name)
917
0
        return X265_PARAM_BAD_NAME;
918
919
#ifdef SVT_HEVC
920
    count++;
921
#endif
922
    // skip -- prefix if provided
923
7.84k
    if (name[0] == '-' && name[1] == '-')
924
0
        name += 2;
925
926
    // s/_/-/g
927
7.84k
    if (strlen(name) + 1 < sizeof(nameBuf) && strchr(name, '_'))
928
0
    {
929
0
        char *c;
930
0
        strcpy(nameBuf, name);
931
0
        while ((c = strchr(nameBuf, '_')) != 0)
932
0
            *c = '-';
933
934
0
        name = nameBuf;
935
0
    }
936
937
7.84k
    if (!strncmp(name, "no-", 3))
938
0
    {
939
0
        name += 3;
940
0
        value = !value || x265_atobool(value, bError) ? "false" : "true";
941
0
    }
942
7.84k
    else if (!strncmp(name, "no", 2))
943
0
    {
944
0
        name += 2;
945
0
        value = !value || x265_atobool(value, bError) ? "false" : "true";
946
0
    }
947
7.84k
    else if (!value)
948
0
        value = "true";
949
7.84k
    else if (value[0] == '=')
950
0
        value++;
951
952
#if defined(_MSC_VER)
953
#pragma warning(disable: 4127) // conditional expression is constant
954
#endif
955
358k
#define OPT(STR) else if (!strcmp(name, STR))
956
26.1k
#define OPT2(STR1, STR2) else if (!strcmp(name, STR1) || !strcmp(name, STR2))
957
958
#ifdef SVT_HEVC
959
    if (p->bEnableSvtHevc)
960
    {
961
        if(svt_param_parse(p, name, value))
962
        {
963
            x265_log(p, X265_LOG_ERROR, "Error while parsing params \n");
964
            bError = true;
965
        }
966
        return bError ? X265_PARAM_BAD_VALUE : 0;
967
    }
968
#endif
969
970
7.84k
    if (0) ;
971
7.84k
    OPT("asm")
972
0
    {
973
0
#if X265_ARCH_X86
974
0
        if (!strcasecmp(value, "avx512"))
975
0
        {
976
0
            p->cpuid = X265_NS::cpu_detect(true);
977
0
            if (!(p->cpuid & X265_CPU_AVX512))
978
0
                x265_log(p, X265_LOG_WARNING, "AVX512 is not supported\n");
979
0
        }
980
0
        else
981
0
        {
982
0
            if (bValueWasNull)
983
0
                p->cpuid = atobool(value);
984
0
            else
985
0
                p->cpuid = parseCpuName(value, bError, false);
986
0
        }
987
#else
988
        if (bValueWasNull)
989
            p->cpuid = atobool(value);
990
        else
991
            p->cpuid = parseCpuName(value, bError, false);
992
#endif
993
0
    }
994
7.84k
    OPT("fps")
995
0
    {
996
0
        if (sscanf(value, "%u/%u", &p->fpsNum, &p->fpsDenom) == 2)
997
0
            ;
998
0
        else
999
0
        {
1000
0
            float fps = (float)atof(value);
1001
0
            if (fps > 0 && fps <= INT_MAX / 1000)
1002
0
            {
1003
0
                p->fpsNum = (int)(fps * 1000 + .5);
1004
0
                p->fpsDenom = 1000;
1005
0
            }
1006
0
            else
1007
0
            {
1008
0
                p->fpsNum = atoi(value);
1009
0
                p->fpsDenom = 1;
1010
0
            }
1011
0
        }
1012
0
    }
1013
7.84k
    OPT("frame-threads") p->frameNumThreads = atoi(value);
1014
7.84k
    OPT("pmode") p->bDistributeModeAnalysis = atobool(value);
1015
7.84k
    OPT("pme") p->bDistributeMotionEstimation = atobool(value);
1016
7.84k
    OPT2("level-idc", "level")
1017
0
    {
1018
        /* allow "5.1" or "51", both converted to integer 51 */
1019
        /* if level-idc specifies an obviously wrong value in either float or int, 
1020
        throw error consistently. Stronger level checking will be done in encoder_open() */
1021
0
        if (atof(value) < 10)
1022
0
            p->levelIdc = (int)(10 * atof(value) + .5);
1023
0
        else if (atoi(value) < 100)
1024
0
            p->levelIdc = atoi(value);
1025
0
        else 
1026
0
            bError = true;
1027
0
    }
1028
7.84k
    OPT("high-tier") p->bHighTier = atobool(value);
1029
7.84k
    OPT("allow-non-conformance") p->bAllowNonConformance = atobool(value);
1030
7.84k
    OPT2("log-level", "log")
1031
0
    {
1032
0
        p->logLevel = atoi(value);
1033
0
        if (bError)
1034
0
        {
1035
0
            bError = false;
1036
0
            p->logLevel = parseName(value, logLevelNames, bError) - 1;
1037
0
        }
1038
0
    }
1039
7.84k
    OPT("cu-stats") p->bLogCuStats = atobool(value);
1040
7.84k
    OPT("total-frames") p->totalFrames = atoi(value);
1041
7.84k
    OPT("annexb") p->bAnnexB = atobool(value);
1042
7.84k
    OPT("repeat-headers") p->bRepeatHeaders = atobool(value);
1043
7.84k
    OPT("wpp") p->bEnableWavefront = atobool(value);
1044
7.84k
    OPT("ctu") p->maxCUSize = (uint32_t)atoi(value);
1045
7.84k
    OPT("min-cu-size") p->minCUSize = (uint32_t)atoi(value);
1046
7.19k
    OPT("tu-intra-depth") p->tuQTMaxIntraDepth = (uint32_t)atoi(value);
1047
7.19k
    OPT("tu-inter-depth") p->tuQTMaxInterDepth = (uint32_t)atoi(value);
1048
6.54k
    OPT("max-tu-size") p->maxTUSize = (uint32_t)atoi(value);
1049
6.54k
    OPT("subme") p->subpelRefine = atoi(value);
1050
6.54k
    OPT("merange") p->searchRange = atoi(value);
1051
6.54k
    OPT("rect") p->bEnableRectInter = atobool(value);
1052
6.54k
    OPT("amp") p->bEnableAMP = atobool(value);
1053
5.88k
    OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value);
1054
5.23k
    OPT("temporal-mvp") p->bEnableTemporalMvp = atobool(value);
1055
5.23k
    OPT("early-skip") p->bEnableEarlySkip = atobool(value);
1056
5.23k
    OPT("rskip") p->recursionSkipMode = atoi(value);
1057
5.23k
    OPT("rdpenalty") p->rdPenalty = atoi(value);
1058
4.57k
    OPT("tskip") p->bEnableTransformSkip = atobool(value);
1059
4.57k
    OPT("no-tskip-fast") p->bEnableTSkipFast = atobool(value);
1060
4.57k
    OPT("tskip-fast") p->bEnableTSkipFast = atobool(value);
1061
4.57k
    OPT("strong-intra-smoothing") p->bEnableStrongIntraSmoothing = atobool(value);
1062
4.57k
    OPT("lossless") p->bLossless = atobool(value);
1063
4.57k
    OPT("cu-lossless") p->bCULossless = atobool(value);
1064
4.57k
    OPT2("constrained-intra", "cip") p->bEnableConstrainedIntra = atobool(value);
1065
4.57k
    OPT("fast-intra") p->bEnableFastIntra = atobool(value);
1066
4.57k
    OPT("open-gop") p->bOpenGOP = atobool(value);
1067
4.57k
    OPT("intra-refresh") p->bIntraRefresh = atobool(value);
1068
4.57k
    OPT("lookahead-slices") p->lookaheadSlices = atoi(value);
1069
4.57k
    OPT("scenecut")
1070
0
    {
1071
0
       p->scenecutThreshold = atobool(value);
1072
0
       if (bError || p->scenecutThreshold)
1073
0
       {
1074
0
           bError = false;
1075
0
           p->scenecutThreshold = atoi(value);
1076
0
       }
1077
0
    }
1078
4.57k
    OPT("temporal-layers") p->bEnableTemporalSubLayers = atoi(value);
1079
4.57k
    OPT("keyint") p->keyframeMax = atoi(value);
1080
4.57k
    OPT("min-keyint") p->keyframeMin = atoi(value);
1081
4.57k
    OPT("rc-lookahead") p->lookaheadDepth = atoi(value);
1082
4.57k
    OPT("bframes") p->bframes = atoi(value);
1083
4.57k
    OPT("bframe-bias") p->bFrameBias = atoi(value);
1084
4.57k
    OPT("b-adapt")
1085
0
    {
1086
0
        p->bFrameAdaptive = atobool(value);
1087
0
        if (bError || p->bFrameAdaptive)
1088
0
        {
1089
0
            bError = false;
1090
0
            p->bFrameAdaptive = atoi(value);
1091
0
        }
1092
0
    }
1093
4.57k
    OPT("interlace")
1094
0
    {
1095
0
        p->interlaceMode = atobool(value);
1096
0
        if (bError || p->interlaceMode)
1097
0
        {
1098
0
            bError = false;
1099
0
            p->interlaceMode = parseName(value, x265_interlace_names, bError);
1100
0
        }
1101
0
    }
1102
4.57k
    OPT("ref") p->maxNumReferences = atoi(value);
1103
4.57k
    OPT("limit-refs") p->limitReferences = atoi(value);
1104
4.57k
    OPT("limit-modes") p->limitModes = atobool(value);
1105
3.92k
    OPT("weightp") p->bEnableWeightedPred = atobool(value);
1106
3.27k
    OPT("weightb") p->bEnableWeightedBiPred = atobool(value);
1107
3.27k
    OPT("cbqpoffs") p->cbQpOffset = atoi(value);
1108
3.27k
    OPT("crqpoffs") p->crQpOffset = atoi(value);
1109
3.27k
    OPT("rd") p->rdLevel = atoi(value);
1110
3.27k
    OPT2("rdoq", "rdoq-level")
1111
0
    {
1112
0
        int bval = atobool(value);
1113
0
        if (bError || bval)
1114
0
        {
1115
0
            bError = false;
1116
0
            p->rdoqLevel = atoi(value);
1117
0
        }
1118
0
        else
1119
0
            p->rdoqLevel = 0;
1120
0
    }
1121
3.27k
    OPT("psy-rd")
1122
654
    {
1123
654
        int bval = atobool(value);
1124
654
        if (bError || bval)
1125
654
        {
1126
654
            bError = false;
1127
654
            p->psyRd = atof(value);
1128
654
        }
1129
0
        else
1130
0
            p->psyRd = 0.0;
1131
654
    }
1132
3.27k
    OPT("psy-rdoq")
1133
654
    {
1134
654
        int bval = atobool(value);
1135
654
        if (bError || bval)
1136
654
        {
1137
654
            bError = false;
1138
654
            p->psyRdoq = atof(value);
1139
654
        }
1140
0
        else
1141
0
            p->psyRdoq = 0.0;
1142
654
    }
1143
2.61k
    OPT("rd-refine") p->bEnableRdRefine = atobool(value);
1144
1.96k
    OPT("signhide") p->bEnableSignHiding = atobool(value);
1145
1.96k
    OPT("b-intra") p->bIntraInBFrames = atobool(value);
1146
1.96k
    OPT("lft") p->bEnableLoopFilter = atobool(value); /* DEPRECATED */
1147
1.96k
    OPT("deblock")
1148
0
    {
1149
0
        if (2 == sscanf(value, "%d:%d", &p->deblockingFilterTCOffset, &p->deblockingFilterBetaOffset) ||
1150
0
            2 == sscanf(value, "%d,%d", &p->deblockingFilterTCOffset, &p->deblockingFilterBetaOffset))
1151
0
        {
1152
0
            p->bEnableLoopFilter = true;
1153
0
        }
1154
0
        else if (sscanf(value, "%d", &p->deblockingFilterTCOffset))
1155
0
        {
1156
0
            p->bEnableLoopFilter = 1;
1157
0
            p->deblockingFilterBetaOffset = p->deblockingFilterTCOffset;
1158
0
        }
1159
0
        else
1160
0
            p->bEnableLoopFilter = atobool(value);
1161
0
    }
1162
1.96k
    OPT("sao") p->bEnableSAO = atobool(value);
1163
1.96k
    OPT("sao-non-deblock") p->bSaoNonDeblocked = atobool(value);
1164
1.96k
    OPT("ssim") p->bEnableSsim = atobool(value);
1165
1.96k
    OPT("psnr") p->bEnablePsnr = atobool(value);
1166
1.96k
    OPT("hash") p->decodedPictureHashSEI = atoi(value);
1167
1.96k
    OPT("aud") p->bEnableAccessUnitDelimiters = atobool(value);
1168
1.96k
    OPT("info") p->bEmitInfoSEI = atobool(value);
1169
1.96k
    OPT("b-pyramid") p->bBPyramid = atobool(value);
1170
1.30k
    OPT("hrd") p->bEmitHRDSEI = atobool(value);
1171
1.30k
    OPT2("ipratio", "ip-factor") p->rc.ipFactor = atof(value);
1172
1.30k
    OPT2("pbratio", "pb-factor") p->rc.pbFactor = atof(value);
1173
1.30k
    OPT("qcomp") p->rc.qCompress = atof(value);
1174
1.30k
    OPT("qpstep") p->rc.qpStep = atoi(value);
1175
1.30k
    OPT("cplxblur") p->rc.complexityBlur = atof(value);
1176
1.30k
    OPT("qblur") p->rc.qblur = atof(value);
1177
1.30k
    OPT("aq-mode") p->rc.aqMode = atoi(value);
1178
1.30k
    OPT("aq-strength") p->rc.aqStrength = atof(value);
1179
654
    OPT("vbv-maxrate") p->rc.vbvMaxBitrate = atoi(value);
1180
654
    OPT("vbv-bufsize") p->rc.vbvBufferSize = atoi(value);
1181
654
    OPT("vbv-init")    p->rc.vbvBufferInit = atof(value);
1182
654
    OPT("crf-max")     p->rc.rfConstantMax = atof(value);
1183
654
    OPT("crf-min")     p->rc.rfConstantMin = atof(value);
1184
654
    OPT("qpmax")       p->rc.qpMax = atoi(value);
1185
654
    OPT("crf")
1186
0
    {
1187
0
        p->rc.rfConstant = atof(value);
1188
0
        p->rc.rateControlMode = X265_RC_CRF;
1189
0
    }
1190
654
    OPT("bitrate")
1191
0
    {
1192
0
        p->rc.bitrate = atoi(value);
1193
0
        p->rc.rateControlMode = X265_RC_ABR;
1194
0
    }
1195
654
    OPT("qp")
1196
0
    {
1197
0
        p->rc.qp = atoi(value);
1198
0
        p->rc.rateControlMode = X265_RC_CQP;
1199
0
    }
1200
654
    OPT("rc-grain") p->rc.bEnableGrain = atobool(value);
1201
654
    OPT("zones")
1202
0
    {
1203
0
        p->rc.zoneCount = 1;
1204
0
        const char* c;
1205
1206
0
        for (c = value; *c; c++)
1207
0
            p->rc.zoneCount += (*c == '/');
1208
1209
0
        p->rc.zones = X265_MALLOC(x265_zone, p->rc.zoneCount);
1210
0
        c = value;
1211
0
        for (int i = 0; i < p->rc.zoneCount; i++ )
1212
0
        {
1213
0
            int len;
1214
0
            if (3 == sscanf(c, "%d,%d,q=%d%n", &p->rc.zones[i].startFrame, &p->rc.zones[i].endFrame, &p->rc.zones[i].qp, &len))
1215
0
                p->rc.zones[i].bForceQp = 1;
1216
0
            else if (3 == sscanf(c, "%d,%d,b=%f%n", &p->rc.zones[i].startFrame, &p->rc.zones[i].endFrame, &p->rc.zones[i].bitrateFactor, &len))
1217
0
                p->rc.zones[i].bForceQp = 0;
1218
0
            else
1219
0
            {
1220
0
                bError = true;
1221
0
                break;
1222
0
            }
1223
0
            c += len + 1;
1224
0
        }
1225
0
    }
1226
654
    OPT("input-res") bError |= sscanf(value, "%dx%d", &p->sourceWidth, &p->sourceHeight) != 2;
1227
654
    OPT("input-csp") p->internalCsp = parseName(value, x265_source_csp_names, bError);
1228
654
    OPT("me")        p->searchMethod = parseName(value, x265_motion_est_names, bError);
1229
654
    OPT("cutree")    p->rc.cuTree = atobool(value);
1230
654
    OPT("slow-firstpass") p->rc.bEnableSlowFirstPass = atobool(value);
1231
654
    OPT("strict-cbr")
1232
0
    {
1233
0
        p->rc.bStrictCbr = atobool(value);
1234
0
        p->rc.pbFactor = 1.0;
1235
0
    }
1236
654
    OPT("analysis-reuse-mode") p->analysisReuseMode = parseName(value, x265_analysis_names, bError); /*DEPRECATED*/
1237
654
    OPT("sar")
1238
0
    {
1239
0
        p->vui.aspectRatioIdc = parseName(value, x265_sar_names, bError);
1240
0
        if (bError)
1241
0
        {
1242
0
            p->vui.aspectRatioIdc = X265_EXTENDED_SAR;
1243
0
            bError = sscanf(value, "%d:%d", &p->vui.sarWidth, &p->vui.sarHeight) != 2;
1244
0
        }
1245
0
    }
1246
654
    OPT("overscan")
1247
0
    {
1248
0
        if (!strcmp(value, "show"))
1249
0
            p->vui.bEnableOverscanInfoPresentFlag = 1;
1250
0
        else if (!strcmp(value, "crop"))
1251
0
        {
1252
0
            p->vui.bEnableOverscanInfoPresentFlag = 1;
1253
0
            p->vui.bEnableOverscanAppropriateFlag = 1;
1254
0
        }
1255
0
        else if (!strcmp(value, "unknown"))
1256
0
            p->vui.bEnableOverscanInfoPresentFlag = 0;
1257
0
        else
1258
0
            bError = true;
1259
0
    }
1260
654
    OPT("videoformat")
1261
0
    {
1262
0
        p->vui.bEnableVideoSignalTypePresentFlag = 1;
1263
0
        p->vui.videoFormat = parseName(value, x265_video_format_names, bError);
1264
0
    }
1265
654
    OPT("range")
1266
654
    {
1267
654
        p->vui.bEnableVideoSignalTypePresentFlag = 1;
1268
654
        p->vui.bEnableVideoFullRangeFlag = parseName(value, x265_fullrange_names, bError);
1269
654
    }
1270
654
    OPT("colorprim")
1271
0
    {
1272
0
        p->vui.bEnableVideoSignalTypePresentFlag = 1;
1273
0
        p->vui.bEnableColorDescriptionPresentFlag = 1;
1274
0
        p->vui.colorPrimaries = parseName(value, x265_colorprim_names, bError);
1275
0
    }
1276
0
    OPT("transfer")
1277
0
    {
1278
0
        p->vui.bEnableVideoSignalTypePresentFlag = 1;
1279
0
        p->vui.bEnableColorDescriptionPresentFlag = 1;
1280
0
        p->vui.transferCharacteristics = parseName(value, x265_transfer_names, bError);
1281
0
    }
1282
0
    OPT("colormatrix")
1283
0
    {
1284
0
        p->vui.bEnableVideoSignalTypePresentFlag = 1;
1285
0
        p->vui.bEnableColorDescriptionPresentFlag = 1;
1286
0
        p->vui.matrixCoeffs = parseName(value, x265_colmatrix_names, bError);
1287
0
    }
1288
0
    OPT("chromaloc")
1289
0
    {
1290
0
        p->vui.bEnableChromaLocInfoPresentFlag = 1;
1291
0
        p->vui.chromaSampleLocTypeTopField = atoi(value);
1292
0
        p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;
1293
0
    }
1294
0
    OPT2("display-window", "crop-rect")
1295
0
    {
1296
0
        p->vui.bEnableDefaultDisplayWindowFlag = 1;
1297
0
        bError |= sscanf(value, "%d,%d,%d,%d",
1298
0
                         &p->vui.defDispWinLeftOffset,
1299
0
                         &p->vui.defDispWinTopOffset,
1300
0
                         &p->vui.defDispWinRightOffset,
1301
0
                         &p->vui.defDispWinBottomOffset) != 4;
1302
0
    }
1303
0
    OPT("nr-intra") p->noiseReductionIntra = atoi(value);
1304
0
    OPT("nr-inter") p->noiseReductionInter = atoi(value);
1305
0
    OPT("pass")
1306
0
    {
1307
0
        int pass = x265_clip3(0, 3, atoi(value));
1308
0
        p->rc.bStatWrite = pass & 1;
1309
0
        p->rc.bStatRead = pass & 2;
1310
0
        p->rc.dataShareMode = X265_SHARE_MODE_FILE;
1311
0
    }
1312
0
    OPT("stats") snprintf(p->rc.statFileName, X265_MAX_STRING_SIZE, "%s", value);
1313
0
    OPT("scaling-list") snprintf(p->scalingLists, X265_MAX_STRING_SIZE, "%s", value);
1314
0
    OPT2("pools", "numa-pools") snprintf(p->numaPools, X265_MAX_STRING_SIZE, "%s", value);
1315
0
    OPT("lambda-file") snprintf(p->rc.lambdaFileName, X265_MAX_STRING_SIZE, "%s", value);
1316
0
    OPT("analysis-reuse-file") snprintf(p->analysisReuseFileName, X265_MAX_STRING_SIZE, "%s", value);
1317
0
    OPT("qg-size") p->rc.qgSize = atoi(value);
1318
0
    OPT("master-display") snprintf(p->masteringDisplayColorVolume, X265_MAX_STRING_SIZE, "%s", value);
1319
0
    OPT("max-cll") bError |= sscanf(value, "%hu,%hu", &p->maxCLL, &p->maxFALL) != 2;
1320
0
    OPT("min-luma") p->minLuma = (uint16_t)atoi(value);
1321
0
    OPT("max-luma") p->maxLuma = (uint16_t)atoi(value);
1322
0
    OPT("uhd-bd") p->uhdBluray = atobool(value);
1323
0
    else
1324
0
        bExtraParams = true;
1325
1326
    // solve "fatal error C1061: compiler limit : blocks nested too deeply"
1327
7.84k
    if (bExtraParams)
1328
0
    {
1329
0
        if (0) ;
1330
0
        OPT("csv") snprintf(p->csvfn, X265_MAX_STRING_SIZE, "%s", value);
1331
0
        OPT("csv-log-level") p->csvLogLevel = atoi(value);
1332
0
        OPT("qpmin") p->rc.qpMin = atoi(value);
1333
0
        OPT("analyze-src-pics") p->bSourceReferenceEstimation = atobool(value);
1334
0
        OPT("log2-max-poc-lsb") p->log2MaxPocLsb = atoi(value);
1335
0
        OPT("vui-timing-info") p->bEmitVUITimingInfo = atobool(value);
1336
0
        OPT("vui-hrd-info") p->bEmitVUIHRDInfo = atobool(value);
1337
0
        OPT("slices") p->maxSlices = atoi(value);
1338
0
        OPT("limit-tu") p->limitTU = atoi(value);
1339
0
        OPT("opt-qp-pps") p->bOptQpPPS = atobool(value);
1340
0
        OPT("opt-ref-list-length-pps") p->bOptRefListLengthPPS = atobool(value);
1341
0
        OPT("multi-pass-opt-rps") p->bMultiPassOptRPS = atobool(value);
1342
0
        OPT("scenecut-bias") p->scenecutBias = atof(value);
1343
0
        OPT("hist-scenecut") p->bHistBasedSceneCut = atobool(value);
1344
0
        OPT("rskip-edge-threshold") p->edgeVarThreshold = atoi(value)/100.0f;
1345
0
        OPT("lookahead-threads") p->lookaheadThreads = atoi(value);
1346
0
        OPT("opt-cu-delta-qp") p->bOptCUDeltaQP = atobool(value);
1347
0
        OPT("multi-pass-opt-analysis") p->analysisMultiPassRefine = atobool(value);
1348
0
        OPT("multi-pass-opt-distortion") p->analysisMultiPassDistortion = atobool(value);
1349
0
        OPT("aq-motion") p->bAQMotion = atobool(value);
1350
0
        OPT("dynamic-rd") p->dynamicRd = atof(value);
1351
0
    OPT("cra-nal") p->craNal = atobool(value);
1352
0
        OPT("analysis-reuse-level")
1353
0
        {
1354
0
            p->analysisReuseLevel = atoi(value);
1355
0
            p->analysisSaveReuseLevel = atoi(value);
1356
0
            p->analysisLoadReuseLevel = atoi(value);
1357
0
        }
1358
0
        OPT("analysis-save-reuse-level") p->analysisSaveReuseLevel = atoi(value);
1359
0
        OPT("analysis-load-reuse-level") p->analysisLoadReuseLevel = atoi(value);
1360
0
        OPT("ssim-rd")
1361
0
        {
1362
0
            int bval = atobool(value);
1363
0
            if (bError || bval)
1364
0
            {
1365
0
                bError = false;
1366
0
                p->psyRd = 0.0;
1367
0
                p->bSsimRd = atobool(value);
1368
0
            }
1369
0
        }
1370
0
        OPT("hdr") p->bEmitHDR10SEI = atobool(value);  /*DEPRECATED*/
1371
0
        OPT("hdr10") p->bEmitHDR10SEI = atobool(value);
1372
0
        OPT("hdr-opt") p->bHDR10Opt = atobool(value); /*DEPRECATED*/
1373
0
        OPT("hdr10-opt") p->bHDR10Opt = atobool(value);
1374
0
        OPT("limit-sao") p->bLimitSAO = atobool(value);
1375
0
        OPT("dhdr10-info") snprintf(p->toneMapFile, X265_MAX_STRING_SIZE, "%s", value);
1376
0
        OPT("dhdr10-opt") p->bDhdr10opt = atobool(value);
1377
0
        OPT("idr-recovery-sei") p->bEmitIDRRecoverySEI = atobool(value);
1378
0
        OPT("const-vbv") p->rc.bEnableConstVbv = atobool(value);
1379
0
        OPT("ctu-info") p->bCTUInfo = atoi(value);
1380
0
        OPT("scale-factor") p->scaleFactor = atoi(value);
1381
0
        OPT("refine-intra")p->intraRefine = atoi(value);
1382
0
        OPT("refine-inter")p->interRefine = atoi(value);
1383
0
        OPT("refine-mv")p->mvRefine = atoi(value);
1384
0
        OPT("force-flush")p->forceFlush = atoi(value);
1385
0
        OPT("splitrd-skip") p->bEnableSplitRdSkip = atobool(value);
1386
0
        OPT("lowpass-dct") p->bLowPassDct = atobool(value);
1387
0
        OPT("vbv-end") p->vbvBufferEnd = atof(value);
1388
0
        OPT("vbv-end-fr-adj") p->vbvEndFrameAdjust = atof(value);
1389
0
        OPT("copy-pic") p->bCopyPicToFrame = atobool(value);
1390
0
        OPT("refine-analysis-type")
1391
0
        {
1392
0
            if (strcmp((value), "avc") == 0)
1393
0
            {
1394
0
                p->bAnalysisType = AVC_INFO;
1395
0
            }
1396
0
            else if (strcmp((value), "hevc") == 0)
1397
0
            {
1398
0
                p->bAnalysisType = HEVC_INFO;
1399
0
            }
1400
0
            else if (strcmp((value), "off") == 0)
1401
0
            {
1402
0
                p->bAnalysisType = DEFAULT;
1403
0
            }
1404
0
            else
1405
0
            {
1406
0
                bError = true;
1407
0
            }
1408
0
        }
1409
0
        OPT("gop-lookahead") p->gopLookahead = atoi(value);
1410
0
        OPT("analysis-save") snprintf(p->analysisSave, X265_MAX_STRING_SIZE, "%s", value);
1411
0
        OPT("analysis-load") snprintf(p->analysisLoad, X265_MAX_STRING_SIZE, "%s", value);
1412
0
        OPT("radl") p->radl = atoi(value);
1413
0
        OPT("max-ausize-factor") p->maxAUSizeFactor = atof(value);
1414
0
        OPT("dynamic-refine") p->bDynamicRefine = atobool(value);
1415
0
        OPT("single-sei") p->bSingleSeiNal = atobool(value);
1416
0
        OPT("atc-sei") p->preferredTransferCharacteristics = atoi(value);
1417
0
        OPT("pic-struct") p->pictureStructure = atoi(value);
1418
0
        OPT("chunk-start") p->chunkStart = atoi(value);
1419
0
        OPT("chunk-end") p->chunkEnd = atoi(value);
1420
0
        OPT("nalu-file") snprintf(p->naluFile, X265_MAX_STRING_SIZE, "%s", value);
1421
0
        OPT("dolby-vision-profile")
1422
0
        {
1423
0
            if (atof(value) < 10)
1424
0
                p->dolbyProfile = (int)(10 * atof(value) + .5);
1425
0
            else if (atoi(value) < 100)
1426
0
                p->dolbyProfile = atoi(value);
1427
0
            else
1428
0
                bError = true;
1429
0
        }
1430
0
        OPT("hrd-concat") p->bEnableHRDConcatFlag = atobool(value);
1431
0
        OPT("refine-ctu-distortion") p->ctuDistortionRefine = atoi(value);
1432
0
        OPT("hevc-aq") p->rc.hevcAq = atobool(value);
1433
0
        OPT("qp-adaptation-range") p->rc.qpAdaptationRange = atof(value);
1434
#ifdef SVT_HEVC
1435
        OPT("svt")
1436
        {
1437
            p->bEnableSvtHevc = atobool(value);
1438
            if (count > 1 && p->bEnableSvtHevc)
1439
            {
1440
                x265_log(NULL, X265_LOG_ERROR, "Enable SVT should be the first call to x265_parse_parse \n");
1441
                bError = true;
1442
            }
1443
        }
1444
        OPT("svt-hme") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1445
        OPT("svt-search-width") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1446
        OPT("svt-search-height") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1447
        OPT("svt-compressed-ten-bit-format") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1448
        OPT("svt-speed-control") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1449
        OPT("input-depth") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1450
        OPT("svt-preset-tuner") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1451
        OPT("svt-hierarchical-level") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1452
        OPT("svt-base-layer-switch-mode") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1453
        OPT("svt-pred-struct") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1454
        OPT("svt-fps-in-vps") x265_log(p, X265_LOG_WARNING, "Option %s is SVT-HEVC Encoder specific; Disabling it here \n", name);
1455
#endif
1456
0
        OPT("selective-sao")
1457
0
        {
1458
0
            p->selectiveSAO = atoi(value);
1459
0
        }
1460
0
        OPT("fades") p->bEnableFades = atobool(value);
1461
0
        OPT("scenecut-aware-qp") p->bEnableSceneCutAwareQp = atoi(value);
1462
0
        OPT("masking-strength") bError |= parseMaskingStrength(p, value);
1463
0
        OPT("field") p->bField = atobool( value );
1464
0
        OPT("cll") p->bEmitCLL = atobool(value);
1465
0
        OPT("frame-dup") p->bEnableFrameDuplication = atobool(value);
1466
0
        OPT("dup-threshold") p->dupThreshold = atoi(value);
1467
0
        OPT("hme") p->bEnableHME = atobool(value);
1468
0
        OPT("hme-search")
1469
0
        {
1470
0
            char search[3][5];
1471
0
            memset(search, '\0', 15 * sizeof(char));
1472
0
            if(3 == sscanf(value, "%d,%d,%d", &p->hmeSearchMethod[0], &p->hmeSearchMethod[1], &p->hmeSearchMethod[2]) ||
1473
0
               3 == sscanf(value, "%4[^,],%4[^,],%4[^,]", search[0], search[1], search[2]))
1474
0
            {
1475
0
                if(search[0][0])
1476
0
                    for(int level = 0; level < 3; level++)
1477
0
                        p->hmeSearchMethod[level] = parseName(search[level], x265_motion_est_names, bError);
1478
0
            }
1479
0
            else if (sscanf(value, "%d", &p->hmeSearchMethod[0]) || sscanf(value, "%s", search[0]))
1480
0
            {
1481
0
                if (search[0][0]) {
1482
0
                    p->hmeSearchMethod[0] = parseName(search[0], x265_motion_est_names, bError);
1483
0
                    p->hmeSearchMethod[1] = p->hmeSearchMethod[2] = p->hmeSearchMethod[0];
1484
0
                }
1485
0
            }
1486
0
            p->bEnableHME = true;
1487
0
        }
1488
0
        OPT("hme-range")
1489
0
        {
1490
0
            sscanf(value, "%d,%d,%d", &p->hmeRange[0], &p->hmeRange[1], &p->hmeRange[2]);
1491
0
            p->bEnableHME = true;
1492
0
        }
1493
0
        OPT("vbv-live-multi-pass") p->bliveVBV2pass = atobool(value);
1494
0
        OPT("min-vbv-fullness") p->minVbvFullness = atof(value);
1495
0
        OPT("max-vbv-fullness") p->maxVbvFullness = atof(value);
1496
0
        OPT("video-signal-type-preset") snprintf(p->videoSignalTypePreset, X265_MAX_STRING_SIZE, "%s", value);
1497
0
        OPT("eob") p->bEnableEndOfBitstream = atobool(value);
1498
0
        OPT("eos") p->bEnableEndOfSequence = atobool(value);
1499
        /* Film grain characterstics model filename */
1500
0
        OPT("film-grain") p->filmGrain = (char* )value;
1501
0
        OPT("aom-film-grain") p->aomFilmGrain = (char*)value;
1502
0
        OPT("mcstf") p->bEnableTemporalFilter = atobool(value);
1503
0
        OPT("sbrc") p->bEnableSBRC = atobool(value);
1504
#if ENABLE_ALPHA
1505
        OPT("alpha")
1506
        {
1507
            if (atobool(value))
1508
            {
1509
                p->bEnableAlpha = 1;
1510
                p->numScalableLayers = 2;
1511
                p->numLayers = 2;
1512
            }
1513
        }
1514
#endif
1515
#if ENABLE_MULTIVIEW
1516
        OPT("format")
1517
            p->format = atoi(value);
1518
        OPT("num-views")
1519
        {
1520
            p->numViews = atoi(value);
1521
        }
1522
#endif
1523
#if ENABLE_SCC_EXT
1524
        OPT("scc")
1525
        {
1526
            p->bEnableSCC = atoi(value);
1527
        }
1528
#endif
1529
0
        OPT("frame-rc") p->bConfigRCFrame = atobool(value);
1530
0
        OPT("threaded-me") p->bThreadedME = atobool(value);
1531
0
        else
1532
0
            return X265_PARAM_BAD_NAME;
1533
0
    }
1534
7.84k
#undef OPT
1535
7.84k
#undef atobool
1536
7.84k
#undef atoi
1537
7.84k
#undef atof
1538
1539
7.84k
    bError |= bValueWasNull && !bNameWasBool;
1540
7.84k
    return bError ? X265_PARAM_BAD_VALUE : 0;
1541
7.84k
}
1542
1543
} /* end extern "C" or namespace */
1544
1545
namespace X265_NS {
1546
// internal encoder functions
1547
1548
int x265_atoi(const char* str, bool& bError)
1549
3.27k
{
1550
3.27k
    char *end;
1551
3.27k
    int v = strtol(str, &end, 0);
1552
1553
3.27k
    if (end == str || *end != '\0')
1554
0
        bError = true;
1555
3.27k
    return v;
1556
3.27k
}
1557
1558
double x265_atof(const char* str, bool& bError)
1559
1.30k
{
1560
1.30k
    char *end;
1561
1.30k
    double v = strtod(str, &end);
1562
1563
1.30k
    if (end == str || *end != '\0')
1564
0
        bError = true;
1565
1.30k
    return v;
1566
1.30k
}
1567
1568
/* cpu name can be:
1569
 *   auto || true - x265::cpu_detect()
1570
 *   false || no  - disabled
1571
 *   integer bitmap value
1572
 *   comma separated list of SIMD names, eg: SSE4.1,XOP */
1573
int parseCpuName(const char* value, bool& bError, bool bEnableavx512)
1574
0
{
1575
0
    if (!value)
1576
0
    {
1577
0
        bError = 1;
1578
0
        return 0;
1579
0
    }
1580
0
    int cpu;
1581
0
    if (isdigit(value[0]))
1582
0
        cpu = x265_atoi(value, bError);
1583
0
    else
1584
0
        cpu = !strcmp(value, "auto") || x265_atobool(value, bError) ? X265_NS::cpu_detect(bEnableavx512) : 0;
1585
1586
0
    if (bError)
1587
0
    {
1588
0
        char *buf = strdup(value);
1589
0
        char *tok, *saveptr = NULL, *init;
1590
0
        bError = 0;
1591
0
        cpu = 0;
1592
0
        for (init = buf; (tok = strtok_r(init, ",", &saveptr)); init = NULL)
1593
0
        {
1594
0
            int i;
1595
0
            for (i = 0; X265_NS::cpu_names[i].flags && strcasecmp(tok, X265_NS::cpu_names[i].name); i++)
1596
0
            {
1597
0
            }
1598
1599
0
            cpu |= X265_NS::cpu_names[i].flags;
1600
0
            if (!X265_NS::cpu_names[i].flags)
1601
0
                bError = 1;
1602
0
        }
1603
1604
0
        free(buf);
1605
0
#if X265_ARCH_X86
1606
0
        if ((cpu & X265_CPU_SSSE3) && !(cpu & X265_CPU_SSE2_IS_SLOW))
1607
0
            cpu |= X265_CPU_SSE2_IS_FAST;
1608
0
#endif
1609
0
    }
1610
1611
0
    return cpu;
1612
0
}
1613
1614
static const int fixedRatios[][2] =
1615
{
1616
    { 1,  1 },
1617
    { 12, 11 },
1618
    { 10, 11 },
1619
    { 16, 11 },
1620
    { 40, 33 },
1621
    { 24, 11 },
1622
    { 20, 11 },
1623
    { 32, 11 },
1624
    { 80, 33 },
1625
    { 18, 11 },
1626
    { 15, 11 },
1627
    { 64, 33 },
1628
    { 160, 99 },
1629
    { 4, 3 },
1630
    { 3, 2 },
1631
    { 2, 1 },
1632
};
1633
1634
void setParamAspectRatio(x265_param* p, int width, int height)
1635
0
{
1636
0
    p->vui.aspectRatioIdc = X265_EXTENDED_SAR;
1637
0
    p->vui.sarWidth = width;
1638
0
    p->vui.sarHeight = height;
1639
0
    for (size_t i = 0; i < sizeof(fixedRatios) / sizeof(fixedRatios[0]); i++)
1640
0
    {
1641
0
        if (width == fixedRatios[i][0] && height == fixedRatios[i][1])
1642
0
        {
1643
0
            p->vui.aspectRatioIdc = (int)i + 1;
1644
0
            return;
1645
0
        }
1646
0
    }
1647
0
}
1648
1649
void getParamAspectRatio(x265_param* p, int& width, int& height)
1650
0
{
1651
0
    if (!p->vui.aspectRatioIdc)
1652
0
        width = height = 0;
1653
0
    else if ((size_t)p->vui.aspectRatioIdc <= sizeof(fixedRatios) / sizeof(fixedRatios[0]))
1654
0
    {
1655
0
        width  = fixedRatios[p->vui.aspectRatioIdc - 1][0];
1656
0
        height = fixedRatios[p->vui.aspectRatioIdc - 1][1];
1657
0
    }
1658
0
    else if (p->vui.aspectRatioIdc == X265_EXTENDED_SAR)
1659
0
    {
1660
0
        width  = p->vui.sarWidth;
1661
0
        height = p->vui.sarHeight;
1662
0
    }
1663
0
    else
1664
0
        width = height = 0;
1665
0
}
1666
1667
static inline int _confirm(x265_param* param, bool bflag, const char* message)
1668
71.9k
{
1669
71.9k
    if (!bflag)
1670
71.9k
        return 0;
1671
1672
0
    x265_log(param, X265_LOG_ERROR, "%s\n", message);
1673
0
    return 1;
1674
71.9k
}
1675
1676
int x265_check_params(x265_param* param)
1677
654
{
1678
93.2k
#define CHECK(expr, msg) check_failed |= _confirm(param, expr, msg)
1679
654
    int check_failed = 0; /* abort if there is a fatal configuration problem */
1680
654
    CHECK((uint64_t)param->sourceWidth * param->sourceHeight > 142606336,
1681
654
          "Input video resolution exceeds the maximum supported luma samples 142,606,336 (16384x8704) of Level 7.2.");
1682
654
    CHECK(param->uhdBluray == 1 && (X265_DEPTH != 10 || param->internalCsp != 1 || param->interlaceMode != 0),
1683
654
        "uhd-bd: bit depth, chroma subsample, source picture type must be 10, 4:2:0, progressive");
1684
654
    CHECK(param->maxCUSize != 64 && param->maxCUSize != 32 && param->maxCUSize != 16,
1685
654
          "max cu size must be 16, 32, or 64");
1686
654
    if (check_failed == 1)
1687
0
        return check_failed;
1688
1689
654
    uint32_t maxLog2CUSize = (uint32_t)g_log2Size[param->maxCUSize];
1690
654
    uint32_t tuQTMaxLog2Size = X265_MIN(maxLog2CUSize, 5);
1691
654
    uint32_t tuQTMinLog2Size = 2; //log2(4)
1692
1693
654
    CHECK((param->maxSlices > 1) && !param->bEnableWavefront,
1694
654
        "Multiple-Slices mode must be enable Wavefront Parallel Processing (--wpp)");
1695
654
    CHECK(param->internalBitDepth != X265_DEPTH,
1696
654
          "internalBitDepth must match compiled bit depth");
1697
654
    CHECK(param->minCUSize != 32 && param->minCUSize != 16 && param->minCUSize != 8,
1698
654
          "minimim CU size must be 8, 16 or 32");
1699
654
    CHECK(param->minCUSize > param->maxCUSize,
1700
654
          "min CU size must be less than or equal to max CU size");
1701
654
    CHECK(param->rc.qp < -6 * (param->internalBitDepth - 8) || param->rc.qp > QP_MAX_SPEC,
1702
654
          "QP exceeds supported range (-QpBDOffsety to 51)");
1703
654
    CHECK(param->fpsNum == 0 || param->fpsDenom == 0,
1704
654
          "Frame rate numerator and denominator must be specified");
1705
654
    CHECK(param->interlaceMode < 0 || param->interlaceMode > 2,
1706
654
          "Interlace mode must be 0 (progressive) 1 (top-field first) or 2 (bottom field first)");
1707
654
    CHECK(param->searchMethod < 0 || param->searchMethod > X265_FULL_SEARCH,
1708
654
          "Search method is not supported value (0:DIA 1:HEX 2:UMH 3:HM 4:SEA 5:FULL)");
1709
654
    CHECK(param->searchRange < 0,
1710
654
          "Search Range must be more than 0");
1711
654
    CHECK(param->searchRange >= 32768,
1712
654
          "Search Range must be less than 32768");
1713
654
    CHECK(param->subpelRefine > X265_MAX_SUBPEL_LEVEL,
1714
654
          "subme must be less than or equal to X265_MAX_SUBPEL_LEVEL (7)");
1715
654
    CHECK(param->subpelRefine < 0,
1716
654
          "subme must be greater than or equal to 0");
1717
654
    CHECK(param->limitReferences > 3,
1718
654
          "limitReferences must be 0, 1, 2 or 3");
1719
654
    CHECK(param->limitModes > 1,
1720
654
          "limitRectAmp must be 0, 1");
1721
654
    CHECK(param->frameNumThreads < 0 || param->frameNumThreads > X265_MAX_FRAME_THREADS,
1722
654
          "frameNumThreads (--frame-threads) must be [0 .. X265_MAX_FRAME_THREADS)");
1723
654
    CHECK(param->cbQpOffset < -12, "Min. Chroma Cb QP Offset is -12");
1724
654
    CHECK(param->cbQpOffset >  12, "Max. Chroma Cb QP Offset is  12");
1725
654
    CHECK(param->crQpOffset < -12, "Min. Chroma Cr QP Offset is -12");
1726
654
    CHECK(param->crQpOffset >  12, "Max. Chroma Cr QP Offset is  12");
1727
1728
654
    CHECK(tuQTMaxLog2Size > maxLog2CUSize,
1729
654
          "QuadtreeTULog2MaxSize must be log2(maxCUSize) or smaller.");
1730
1731
654
    CHECK(param->tuQTMaxInterDepth < 1 || param->tuQTMaxInterDepth > 4,
1732
654
          "QuadtreeTUMaxDepthInter must be greater than 0 and less than 5");
1733
654
    CHECK(maxLog2CUSize < tuQTMinLog2Size + param->tuQTMaxInterDepth - 1,
1734
654
          "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
1735
654
    CHECK(param->tuQTMaxIntraDepth < 1 || param->tuQTMaxIntraDepth > 4,
1736
654
          "QuadtreeTUMaxDepthIntra must be greater 0 and less than 5");
1737
654
    CHECK(maxLog2CUSize < tuQTMinLog2Size + param->tuQTMaxIntraDepth - 1,
1738
654
          "QuadtreeTUMaxDepthInter must be less than or equal to the difference between log2(maxCUSize) and QuadtreeTULog2MinSize plus 1");
1739
654
    CHECK((param->maxTUSize != 32 && param->maxTUSize != 16 && param->maxTUSize != 8 && param->maxTUSize != 4),
1740
654
          "max TU size must be 4, 8, 16, or 32");
1741
654
    CHECK(param->limitTU > 4, "Invalid limit-tu option, limit-TU must be between 0 and 4");
1742
654
    CHECK(param->maxNumMergeCand < 1, "MaxNumMergeCand must be 1 or greater.");
1743
654
    CHECK(param->maxNumMergeCand > 5, "MaxNumMergeCand must be 5 or smaller.");
1744
1745
654
    CHECK(param->maxNumReferences < 1, "maxNumReferences must be 1 or greater.");
1746
654
    CHECK(param->maxNumReferences > MAX_NUM_REF, "maxNumReferences must be 16 or smaller.");
1747
1748
654
    CHECK(param->sourceWidth < (int)param->maxCUSize || param->sourceHeight < (int)param->maxCUSize,
1749
654
          "Picture size must be at least one CTU");
1750
654
    CHECK(param->internalCsp < X265_CSP_I400 || X265_CSP_I444 < param->internalCsp,
1751
654
          "chroma subsampling must be i400 (4:0:0 monochrome), i420 (4:2:0 default), i422 (4:2:0), i444 (4:4:4)");
1752
654
    CHECK(param->sourceWidth & !!CHROMA_H_SHIFT(param->internalCsp),
1753
654
          "Picture width must be an integer multiple of the specified chroma subsampling");
1754
654
    CHECK(param->sourceHeight & !!CHROMA_V_SHIFT(param->internalCsp),
1755
654
          "Picture height must be an integer multiple of the specified chroma subsampling");
1756
1757
654
    CHECK(param->rc.rateControlMode > X265_RC_CRF || param->rc.rateControlMode < X265_RC_ABR,
1758
654
          "Rate control mode is out of range");
1759
654
    CHECK(param->rdLevel < 1 || param->rdLevel > 6,
1760
654
          "RD Level is out of range");
1761
654
    CHECK(param->rdoqLevel < 0 || param->rdoqLevel > 2,
1762
654
          "RDOQ Level is out of range");
1763
654
    CHECK(param->dynamicRd < 0 || param->dynamicRd > x265_ADAPT_RD_STRENGTH,
1764
654
          "Dynamic RD strength must be between 0 and 4");
1765
654
    CHECK(param->recursionSkipMode > 2 || param->recursionSkipMode < 0,
1766
654
          "Invalid Recursion skip mode. Valid modes 0,1,2");
1767
654
    if (param->recursionSkipMode == EDGE_BASED_RSKIP)
1768
0
    {
1769
0
        CHECK(param->edgeVarThreshold < 0.0f || param->edgeVarThreshold > 1.0f,
1770
0
              "Minimum edge density percentage for a CU should be an integer between 0 to 100");
1771
0
    }
1772
654
    CHECK(param->bframes && (param->bEnableTemporalFilter ? (param->bframes > param->lookaheadDepth) : (param->bframes >= param->lookaheadDepth)) && !param->rc.bStatRead,
1773
654
          "Lookahead depth must be greater than the max consecutive bframe count");
1774
654
    CHECK(param->bframes < 0,
1775
654
          "bframe count should be greater than zero");
1776
654
    CHECK(param->bframes > X265_BFRAME_MAX,
1777
654
          "max consecutive bframe count must be 16 or smaller");
1778
654
    CHECK(param->lookaheadDepth > X265_LOOKAHEAD_MAX,
1779
654
          "Lookahead depth must be less than 256");
1780
654
    CHECK(param->lookaheadSlices > 16 || param->lookaheadSlices < 0,
1781
654
          "Lookahead slices must between 0 and 16");
1782
654
    CHECK(param->rc.aqMode < X265_AQ_NONE || X265_AQ_EDGE < param->rc.aqMode,
1783
654
          "Aq-Mode is out of range");
1784
654
    CHECK(param->rc.aqStrength < 0 || param->rc.aqStrength > 3,
1785
654
          "Aq-Strength is out of range");
1786
654
    CHECK(param->rc.qpAdaptationRange < 1.0f || param->rc.qpAdaptationRange > 6.0f,
1787
654
        "qp adaptation range is out of range");
1788
654
    CHECK(param->deblockingFilterTCOffset < -6 || param->deblockingFilterTCOffset > 6,
1789
654
          "deblocking filter tC offset must be in the range of -6 to +6");
1790
654
    CHECK(param->deblockingFilterBetaOffset < -6 || param->deblockingFilterBetaOffset > 6,
1791
654
          "deblocking filter Beta offset must be in the range of -6 to +6");
1792
654
    CHECK(param->psyRd < 0 || 5.0 < param->psyRd, "Psy-rd strength must be between 0 and 5.0");
1793
654
    CHECK(param->psyRdoq < 0 || 50.0 < param->psyRdoq, "Psy-rdoq strength must be between 0 and 50.0");
1794
654
    CHECK(param->bEnableWavefront < 0, "WaveFrontSynchro cannot be negative");
1795
654
    CHECK((param->vui.aspectRatioIdc < 0
1796
654
           || param->vui.aspectRatioIdc > 16)
1797
654
          && param->vui.aspectRatioIdc != X265_EXTENDED_SAR,
1798
654
          "Sample Aspect Ratio must be 0-16 or 255");
1799
654
    CHECK(param->vui.aspectRatioIdc == X265_EXTENDED_SAR && param->vui.sarWidth <= 0,
1800
654
          "Sample Aspect Ratio width must be greater than 0");
1801
654
    CHECK(param->vui.aspectRatioIdc == X265_EXTENDED_SAR && param->vui.sarHeight <= 0,
1802
654
          "Sample Aspect Ratio height must be greater than 0");
1803
654
    CHECK(param->vui.videoFormat < 0 || param->vui.videoFormat > 5,
1804
654
          "Video Format must be component,"
1805
654
          " pal, ntsc, secam, mac or unknown");
1806
654
    CHECK(param->vui.colorPrimaries < 0
1807
654
          || param->vui.colorPrimaries > 12
1808
654
          || param->vui.colorPrimaries == 3,
1809
654
          "Color Primaries must be unknown, bt709, bt470m,"
1810
654
          " bt470bg, smpte170m, smpte240m, film, bt2020, smpte-st-428, smpte-rp-431 or smpte-eg-432");
1811
654
    CHECK(param->vui.transferCharacteristics < 0
1812
654
          || param->vui.transferCharacteristics > 18
1813
654
          || param->vui.transferCharacteristics == 3,
1814
654
          "Transfer Characteristics must be unknown, bt709, bt470m, bt470bg,"
1815
654
          " smpte170m, smpte240m, linear, log100, log316, iec61966-2-4, bt1361e,"
1816
654
          " iec61966-2-1, bt2020-10, bt2020-12, smpte-st-2084, smpte-st-428 or arib-std-b67");
1817
654
    CHECK(param->vui.matrixCoeffs < 0
1818
654
          || param->vui.matrixCoeffs > 15
1819
654
          || param->vui.matrixCoeffs == 3,
1820
654
          "Matrix Coefficients must be unknown, bt709, fcc, bt470bg, smpte170m,"
1821
654
          " smpte240m, gbr, ycgco, bt2020nc, bt2020c, smpte-st-2085, chroma-nc, chroma-c, ictcp or ipt-pq-c2");
1822
654
    CHECK(param->vui.chromaSampleLocTypeTopField < 0
1823
654
          || param->vui.chromaSampleLocTypeTopField > 5,
1824
654
          "Chroma Sample Location Type Top Field must be 0-5");
1825
654
    CHECK(param->vui.chromaSampleLocTypeBottomField < 0
1826
654
          || param->vui.chromaSampleLocTypeBottomField > 5,
1827
654
          "Chroma Sample Location Type Bottom Field must be 0-5");
1828
654
    CHECK(param->vui.defDispWinLeftOffset < 0,
1829
654
          "Default Display Window Left Offset must be 0 or greater");
1830
654
    CHECK(param->vui.defDispWinRightOffset < 0,
1831
654
          "Default Display Window Right Offset must be 0 or greater");
1832
654
    CHECK(param->vui.defDispWinTopOffset < 0,
1833
654
          "Default Display Window Top Offset must be 0 or greater");
1834
654
    CHECK(param->vui.defDispWinBottomOffset < 0,
1835
654
          "Default Display Window Bottom Offset must be 0 or greater");
1836
654
    CHECK(param->rc.rfConstant < -6 * (param->internalBitDepth - 8) || param->rc.rfConstant > 51,
1837
654
          "Valid quality based range: -qpBDOffsetY to 51");
1838
654
    CHECK(param->rc.rfConstantMax < -6 * (param->internalBitDepth - 8) || param->rc.rfConstantMax > 51,
1839
654
          "Valid quality based range: -qpBDOffsetY to 51");
1840
654
    CHECK(param->rc.rfConstantMin < -6 * (param->internalBitDepth - 8) || param->rc.rfConstantMin > 51,
1841
654
          "Valid quality based range: -qpBDOffsetY to 51");
1842
654
    CHECK(param->bFrameAdaptive < 0 || param->bFrameAdaptive > 2,
1843
654
          "Valid adaptive b scheduling values 0 - none, 1 - fast, 2 - full");
1844
654
    CHECK(param->logLevel<-1 || param->logLevel> X265_LOG_FULL,
1845
654
          "Valid Logging level -1:none 0:error 1:warning 2:info 3:debug 4:full");
1846
654
    CHECK(param->scenecutThreshold < 0,
1847
654
          "scenecutThreshold must be greater than 0");
1848
654
    CHECK(param->scenecutBias < 0 || 100 < param->scenecutBias,
1849
654
            "scenecut-bias must be between 0 and 100");
1850
654
    CHECK(param->radl < 0 || param->radl > param->bframes,
1851
654
          "radl must be between 0 and bframes");
1852
654
    CHECK(param->rdPenalty < 0 || param->rdPenalty > 2,
1853
654
          "Valid penalty for 32x32 intra TU in non-I slices. 0:disabled 1:RD-penalty 2:maximum");
1854
654
    CHECK(param->keyframeMax < -1,
1855
654
          "Invalid max IDR period in frames. value should be greater than -1");
1856
654
    CHECK(param->gopLookahead < -1,
1857
654
          "GOP lookahead must be greater than -1");
1858
654
    CHECK(param->decodedPictureHashSEI < 0 || param->decodedPictureHashSEI > 3,
1859
654
          "Invalid hash option. Decoded Picture Hash SEI 0: disabled, 1: MD5, 2: CRC, 3: Checksum");
1860
654
    CHECK(param->rc.vbvBufferSize < 0,
1861
654
          "Size of the vbv buffer can not be less than zero");
1862
654
    CHECK(param->rc.vbvMaxBitrate < 0,
1863
654
          "Maximum local bit rate can not be less than zero");
1864
654
    CHECK(param->rc.vbvBufferInit < 0,
1865
654
          "Valid initial VBV buffer occupancy must be a fraction 0 - 1, or size in kbits");
1866
654
    CHECK(param->vbvBufferEnd < 0,
1867
654
        "Valid final VBV buffer emptiness must be a fraction 0 - 1, or size in kbits");
1868
654
    CHECK(param->vbvEndFrameAdjust < 0,
1869
654
        "Valid vbv-end-fr-adj must be a fraction 0 - 1");
1870
654
    if ((param->rc.vbvBufferSize > 0 || param->rc.vbvMaxBitrate > 0) && param->bThreadedME)
1871
0
    {
1872
0
        param->bThreadedME = 0;
1873
0
        x265_log(param, X265_LOG_WARNING, "VBV and threaded-me both enabled. Disabling threaded-me\n");
1874
0
    }
1875
654
    CHECK(param->minVbvFullness < 0 && param->minVbvFullness > 100,
1876
654
        "min-vbv-fullness must be a fraction 0 - 100");
1877
654
    CHECK(param->maxVbvFullness < 0 && param->maxVbvFullness > 100,
1878
654
        "max-vbv-fullness must be a fraction 0 - 100");
1879
654
    CHECK(param->rc.bitrate < 0,
1880
654
          "Target bitrate can not be less than zero");
1881
654
    CHECK(param->rc.qCompress < 0.5 || param->rc.qCompress > 1.0,
1882
654
          "qCompress must be between 0.5 and 1.0");
1883
654
    if (param->noiseReductionIntra)
1884
0
        CHECK(0 > param->noiseReductionIntra || param->noiseReductionIntra > 2000, "Valid noise reduction range 0 - 2000");
1885
654
    if (param->noiseReductionInter)
1886
0
        CHECK(0 > param->noiseReductionInter || param->noiseReductionInter > 2000, "Valid noise reduction range 0 - 2000");
1887
654
    CHECK(param->rc.rateControlMode == X265_RC_CQP && param->rc.bStatRead,
1888
654
          "Constant QP is incompatible with 2pass");
1889
654
    CHECK(param->rc.bStrictCbr && (param->rc.bitrate <= 0 || param->rc.vbvBufferSize <=0),
1890
654
          "Strict-cbr cannot be applied without specifying both target bitrate and vbv bufsize");
1891
654
    CHECK(strlen(param->analysisSave) && (param->analysisSaveReuseLevel < 0 || param->analysisSaveReuseLevel > 10),
1892
654
        "Invalid analysis save refine level. Value must be between 1 and 10 (inclusive)");
1893
654
    CHECK(strlen(param->analysisLoad) && (param->analysisLoadReuseLevel < 0 || param->analysisLoadReuseLevel > 10),
1894
654
        "Invalid analysis load refine level. Value must be between 1 and 10 (inclusive)");
1895
654
    CHECK(strlen(param->analysisLoad) && (param->mvRefine < 1 || param->mvRefine > 3),
1896
654
        "Invalid mv refinement level. Value must be between 1 and 3 (inclusive)");
1897
654
    CHECK(param->scaleFactor > 2, "Invalid scale-factor. Supports factor <= 2");
1898
654
    CHECK(param->rc.qpMax < QP_MIN || param->rc.qpMax > QP_MAX_MAX,
1899
654
        "qpmax exceeds supported range (0 to 69)");
1900
654
    CHECK(param->rc.qpMin < QP_MIN || param->rc.qpMin > QP_MAX_MAX,
1901
654
        "qpmin exceeds supported range (0 to 69)");
1902
654
    CHECK(param->log2MaxPocLsb < 4 || param->log2MaxPocLsb > 16,
1903
654
        "Supported range for log2MaxPocLsb is 4 to 16");
1904
654
    CHECK(param->bCTUInfo < 0 || (param->bCTUInfo != 0 && param->bCTUInfo != 1 && param->bCTUInfo != 2 && param->bCTUInfo != 4 && param->bCTUInfo != 6) || param->bCTUInfo > 6,
1905
654
        "Supported values for bCTUInfo are 0, 1, 2, 4, 6");
1906
654
    CHECK(param->interRefine > 3 || param->interRefine < 0,
1907
654
        "Invalid refine-inter value, refine-inter levels 0 to 3 supported");
1908
654
    CHECK(param->intraRefine > 4 || param->intraRefine < 0,
1909
654
        "Invalid refine-intra value, refine-intra levels 0 to 3 supported");
1910
654
    CHECK(param->ctuDistortionRefine < 0 || param->ctuDistortionRefine > 1,
1911
654
        "Invalid refine-ctu-distortion value, must be either 0 or 1");
1912
654
    CHECK(param->maxAUSizeFactor < 0.5 || param->maxAUSizeFactor > 1.0,
1913
654
        "Supported factor for controlling max AU size is from 0.5 to 1");
1914
654
    CHECK((param->dolbyProfile != 0) && (param->dolbyProfile != 50) && (param->dolbyProfile != 81) && (param->dolbyProfile != 82) && (param->dolbyProfile != 84),
1915
654
        "Unsupported Dolby Vision profile, only profile 5, profile 8.1, profile 8.2 and profile 8.4 enabled");
1916
654
    CHECK(param->dupThreshold < 1 || 99 < param->dupThreshold,
1917
654
        "Invalid frame-duplication threshold. Value must be between 1 and 99.");
1918
654
    if (param->dolbyProfile)
1919
0
    {
1920
0
        CHECK((param->rc.vbvMaxBitrate <= 0 || param->rc.vbvBufferSize <= 0), "Dolby Vision requires VBV settings to enable HRD.\n");
1921
0
        CHECK((param->internalBitDepth != 10), "Dolby Vision profile - 5, profile - 8.1, profile - 8.2 and profile - 8.4 are Main10 only\n");
1922
0
        CHECK((param->internalCsp != X265_CSP_I420), "Dolby Vision profile - 5, profile - 8.1, profile - 8.2 and profile - 8.4 requires YCbCr 4:2:0 color space\n");
1923
0
        if (param->dolbyProfile == 81)
1924
0
            CHECK(param->masteringDisplayColorVolume[0] == 0, "Dolby Vision profile - 8.1 requires Mastering display color volume information\n");
1925
0
    }
1926
654
    if (param->bField && param->interlaceMode)
1927
0
    {
1928
0
        CHECK( (param->bFrameAdaptive==0), "Adaptive B-frame decision method should be closed for field feature.\n" );
1929
        // to do
1930
0
    }
1931
654
    CHECK(param->selectiveSAO < 0 || param->selectiveSAO > 4,
1932
654
        "Invalid SAO tune level. Value must be between 0 and 4 (inclusive)");
1933
654
    if (param->bEnableSceneCutAwareQp)
1934
0
    {
1935
0
        if (!param->rc.bStatRead)
1936
0
        {
1937
0
            param->bEnableSceneCutAwareQp = 0;
1938
0
            x265_log(param, X265_LOG_WARNING, "Disabling Scenecut Aware Frame Quantizer Selection since it works only in pass 2\n");
1939
0
        }
1940
0
        else
1941
0
        {
1942
0
            CHECK(param->bEnableSceneCutAwareQp < 0 || param->bEnableSceneCutAwareQp > 3,
1943
0
            "Invalid masking direction. Value must be between 0 and 3(inclusive)");
1944
0
            for (int i = 0; i < 6; i++)
1945
0
            {
1946
0
                CHECK(param->fwdScenecutWindow[i] < 0 || param->fwdScenecutWindow[i] > 1000,
1947
0
                    "Invalid forward scenecut Window duration. Value must be between 0 and 1000(inclusive)");
1948
0
                CHECK(param->fwdRefQpDelta[i] < 0 || param->fwdRefQpDelta[i] > 20,
1949
0
                    "Invalid fwdRefQpDelta value. Value must be between 0 and 20 (inclusive)");
1950
0
                CHECK(param->fwdNonRefQpDelta[i] < 0 || param->fwdNonRefQpDelta[i] > 20,
1951
0
                    "Invalid fwdNonRefQpDelta value. Value must be between 0 and 20 (inclusive)");
1952
1953
0
                CHECK(param->bwdScenecutWindow[i] < 0 || param->bwdScenecutWindow[i] > 1000,
1954
0
                    "Invalid backward scenecut Window duration. Value must be between 0 and 1000(inclusive)");
1955
0
                CHECK(param->bwdRefQpDelta[i] < -1 || param->bwdRefQpDelta[i] > 20,
1956
0
                    "Invalid bwdRefQpDelta value. Value must be between 0 and 20 (inclusive)");
1957
0
                CHECK(param->bwdNonRefQpDelta[i] < -1 || param->bwdNonRefQpDelta[i] > 20,
1958
0
                    "Invalid bwdNonRefQpDelta value. Value must be between 0 and 20 (inclusive)");
1959
0
            }
1960
0
        }
1961
0
    }
1962
654
    if (param->bEnableHME)
1963
0
    {
1964
0
        for (int level = 0; level < 3; level++)
1965
0
            CHECK(param->hmeRange[level] < 0 || param->hmeRange[level] >= 32768,
1966
0
                "Search Range for HME levels must be between 0 and 32768");
1967
0
    }
1968
#if !X86_64 && !X265_ARCH_ARM64 && !X265_ARCH_RISCV64
1969
    CHECK(param->searchMethod == X265_SEA && (param->sourceWidth > 840 || param->sourceHeight > 480),
1970
        "SEA motion search does not support resolutions greater than 480p in 32 bit build");
1971
#endif
1972
1973
654
    if (strlen(param->masteringDisplayColorVolume) || param->maxFALL || param->maxCLL)
1974
0
        param->bEmitHDR10SEI = 1;
1975
1976
654
    bool isSingleSEI = (param->bRepeatHeaders
1977
654
                     || param->bEmitHRDSEI
1978
654
                     || param->bEmitInfoSEI
1979
654
                     || param->bEmitHDR10SEI
1980
654
                     || param->bEmitIDRRecoverySEI
1981
654
                   || !!param->interlaceMode
1982
654
                     || param->preferredTransferCharacteristics > 1
1983
654
                     || strlen(param->toneMapFile)
1984
654
                     || strlen(param->naluFile));
1985
1986
654
    if (!isSingleSEI && param->bSingleSeiNal)
1987
0
    {
1988
0
        param->bSingleSeiNal = 0;
1989
0
        x265_log(param, X265_LOG_WARNING, "None of the SEI messages are enabled. Disabling Single SEI NAL\n");
1990
0
    }
1991
654
    CHECK(param->confWinRightOffset < 0, "Conformance Window Right Offset must be 0 or greater");
1992
654
    CHECK(param->confWinBottomOffset < 0, "Conformance Window Bottom Offset must be 0 or greater");
1993
654
    CHECK(param->decoderVbvMaxRate < 0, "Invalid Decoder Vbv Maxrate. Value can not be less than zero");
1994
654
    if (param->bliveVBV2pass)
1995
0
    {
1996
0
        CHECK((param->rc.bStatRead == 0), "Live VBV in multi pass option requires rate control 2 pass to be enabled");
1997
0
        if ((param->rc.vbvMaxBitrate <= 0 || param->rc.vbvBufferSize <= 0))
1998
0
        {
1999
0
            param->bliveVBV2pass = 0;
2000
0
            x265_log(param, X265_LOG_WARNING, "Live VBV enabled without VBV settings.Disabling live VBV in 2 pass\n");
2001
0
        }
2002
0
    }
2003
654
    CHECK(param->rc.dataShareMode != X265_SHARE_MODE_FILE && param->rc.dataShareMode != X265_SHARE_MODE_SHAREDMEM, "Invalid data share mode. It must be one of the X265_DATA_SHARE_MODES enum values\n" );
2004
#if ENABLE_ALPHA
2005
    if (param->bEnableAlpha)
2006
    {
2007
        CHECK((param->internalCsp != X265_CSP_I420), "Alpha encode supported only with i420a colorspace");
2008
        CHECK((param->internalBitDepth > 10), "BitDepthConstraint must be 8 and 10  for Scalable main profile");
2009
        CHECK((param->analysisMultiPassDistortion || param->analysisMultiPassRefine), "Alpha encode doesnot support multipass feature");
2010
        CHECK((strlen(param->analysisSave) || strlen(param->analysisLoad)), "Alpha encode doesnot support analysis save and load  feature");
2011
    }
2012
#endif
2013
#if ENABLE_MULTIVIEW
2014
    CHECK((param->numViews > 2), "Multi-View Encoding currently support only 2 views");
2015
    if (param->numViews > 1)
2016
    {
2017
        CHECK(param->internalBitDepth != 8, "BitDepthConstraint must be 8 for Multiview main profile");
2018
        CHECK(param->analysisMultiPassDistortion || param->analysisMultiPassRefine, "Multiview encode doesnot support multipass feature");
2019
        CHECK(strlen(param->analysisSave) || strlen(param->analysisLoad), "Multiview encode doesnot support analysis save and load feature");
2020
        CHECK(param->isAbrLadderEnable, "Multiview encode and Abr-Ladder feature can't be enabled together");
2021
    }
2022
#endif
2023
#if ENABLE_SCC_EXT
2024
    bool checkValid = false;
2025
2026
    if (!!param->bEnableSCC)
2027
    {
2028
        checkValid = param->keyframeMax <= 1 || param->totalFrames == 1;
2029
        if (checkValid)     x265_log(param, X265_LOG_WARNING, "intra constraint flag must be 0 for SCC profiles. Disabling SCC  \n");
2030
        checkValid = param->totalFrames == 1;
2031
        if (checkValid)     x265_log(param, X265_LOG_WARNING, "one-picture-only constraint flag shall be 0 for SCC profiles. Disabling SCC  \n");
2032
        const uint32_t bitDepthIdx = (param->internalBitDepth == 8 ? 0 : (param->internalBitDepth == 10 ? 1 : (param->internalBitDepth == 12 ? 2 : (param->internalBitDepth == 16 ? 3 : 4))));
2033
        const uint32_t chromaFormatIdx = uint32_t(param->internalCsp);
2034
        checkValid = !((bitDepthIdx > 2 || chromaFormatIdx > 3) ? false : (validSCCProfileNames[0][bitDepthIdx][chromaFormatIdx] != NONE));
2035
        if (checkValid)     x265_log(param, X265_LOG_WARNING, "Invalid intra constraint flag, bit depth constraint flag and chroma format constraint flag combination for a RExt profile. Disabling SCC \n");
2036
        if (checkValid)
2037
            param->bEnableSCC = 0;
2038
    }
2039
    if (!!param->bEnableSCC)
2040
    {
2041
        if (param->bEnableRdRefine && param->bDynamicRefine)
2042
        {
2043
            param->bEnableRdRefine = 0;
2044
            x265_log(param, X265_LOG_WARNING, "Disabling rd-refine as it can not be used with scc and dynamic-refine\n");
2045
        }
2046
        if (param->bEnableRdRefine && param->interRefine > 0)
2047
        {
2048
            param->bEnableRdRefine = 0;
2049
            x265_log(param, X265_LOG_WARNING, "Disabling rd-refine as it can not be used with scc and inter-refine\n");
2050
        }
2051
    }
2052
    CHECK(!!param->bEnableSCC&& param->rdLevel != 6, "Enabling scc extension in x265 requires rdlevel of 6 ");
2053
#endif
2054
2055
654
    return check_failed;
2056
654
}
2057
2058
void x265_param_apply_fastfirstpass(x265_param* param)
2059
0
{
2060
    /* Set faster options in case of turbo firstpass */
2061
0
    if (param->rc.bStatWrite && !param->rc.bStatRead)
2062
0
    {
2063
0
        param->maxNumReferences = 1;
2064
0
        param->maxNumMergeCand = 1;
2065
0
        param->bEnableRectInter = 0;
2066
0
        param->bEnableFastIntra = 1;
2067
0
        param->bEnableAMP = 0;
2068
0
        param->searchMethod = X265_DIA_SEARCH;
2069
0
        param->subpelRefine = X265_MIN(2, param->subpelRefine);
2070
0
        param->bEnableEarlySkip = 1;
2071
0
        param->rdLevel = X265_MIN(2, param->rdLevel);
2072
0
    }
2073
0
}
2074
2075
static void appendtool(x265_param* param, char* buf, size_t size, const char* toolstr)
2076
0
{
2077
0
    static const int overhead = (int)strlen("x265 [info]: tools: ");
2078
2079
0
    if (strlen(buf) + strlen(toolstr) + overhead >= size)
2080
0
    {
2081
0
        x265_log(param, X265_LOG_INFO, "tools:%s\n", buf);
2082
0
        snprintf(buf, size, " %s", toolstr);
2083
0
    }
2084
0
    else
2085
0
    {
2086
0
        strcat(buf, " ");
2087
0
        strcat(buf, toolstr);
2088
0
    }
2089
0
}
2090
2091
void x265_print_params(x265_param* param)
2092
654
{
2093
654
    if (param->logLevel < X265_LOG_INFO)
2094
654
        return;
2095
2096
0
    if (param->interlaceMode)
2097
0
        x265_log(param, X265_LOG_INFO, "Interlaced field inputs             : %s\n", x265_interlace_names[param->interlaceMode]);
2098
2099
0
    x265_log(param, X265_LOG_INFO, "Coding QT: max CU size, min CU size : %d / %d\n", param->maxCUSize, param->minCUSize);
2100
2101
0
    if (param->bThreadedME)
2102
0
        x265_log(param, X265_LOG_INFO, "ThreadedME: task block / buf rows   : %d / %d\n", param->tmeTaskBlockSize, param->tmeNumBufferRows);
2103
2104
0
    x265_log(param, X265_LOG_INFO, "Residual QT: max TU size, max depth : %d / %d inter / %d intra\n",
2105
0
             param->maxTUSize, param->tuQTMaxInterDepth, param->tuQTMaxIntraDepth);
2106
2107
0
    if (param->bEnableHME)
2108
0
        x265_log(param, X265_LOG_INFO, "HME L0,1,2 / range / subpel / merge : %s, %s, %s / %d / %d / %d\n",
2109
0
            x265_motion_est_names[param->hmeSearchMethod[0]], x265_motion_est_names[param->hmeSearchMethod[1]], x265_motion_est_names[param->hmeSearchMethod[2]], param->searchRange, param->subpelRefine, param->maxNumMergeCand);
2110
0
    else
2111
0
        x265_log(param, X265_LOG_INFO, "ME / range / subpel / merge         : %s / %d / %d / %d\n",
2112
0
            x265_motion_est_names[param->searchMethod], param->searchRange, param->subpelRefine, param->maxNumMergeCand);
2113
2114
0
    if (param->scenecutThreshold && param->keyframeMax != INT_MAX) 
2115
0
        x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut / bias  : %d / %d / %d / %.2lf \n",
2116
0
                 param->keyframeMin, param->keyframeMax, param->scenecutThreshold, param->scenecutBias * 100);
2117
0
    else if (param->bHistBasedSceneCut && param->keyframeMax != INT_MAX) 
2118
0
        x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut  : %d / %d / %d\n",
2119
0
                 param->keyframeMin, param->keyframeMax, param->bHistBasedSceneCut);
2120
0
    else if (param->keyframeMax == INT_MAX)
2121
0
        x265_log(param, X265_LOG_INFO, "Keyframe min / max / scenecut       : disabled\n");
2122
2123
0
    if (param->cbQpOffset || param->crQpOffset)
2124
0
        x265_log(param, X265_LOG_INFO, "Cb/Cr QP Offset                     : %d / %d\n", param->cbQpOffset, param->crQpOffset);
2125
2126
0
    if (param->rdPenalty)
2127
0
        x265_log(param, X265_LOG_INFO, "Intra 32x32 TU penalty type         : %d\n", param->rdPenalty);
2128
2129
0
    x265_log(param, X265_LOG_INFO, "Lookahead / bframes / badapt        : %d / %d / %d\n", param->lookaheadDepth, param->bframes, param->bFrameAdaptive);
2130
0
    x265_log(param, X265_LOG_INFO, "b-pyramid / weightp / weightb       : %d / %d / %d\n",
2131
0
             param->bBPyramid, param->bEnableWeightedPred, param->bEnableWeightedBiPred);
2132
0
    x265_log(param, X265_LOG_INFO, "References / ref-limit  cu / depth  : %d / %s / %s\n",
2133
0
             param->maxNumReferences, (param->limitReferences & X265_REF_LIMIT_CU) ? "on" : "off",
2134
0
             (param->limitReferences & X265_REF_LIMIT_DEPTH) ? "on" : "off");
2135
2136
0
    if (param->rc.aqMode)
2137
0
        x265_log(param, X265_LOG_INFO, "AQ: mode / str / qg-size / cu-tree  : %d / %0.1f / %d / %d\n", param->rc.aqMode,
2138
0
                 param->rc.aqStrength, param->rc.qgSize, param->rc.cuTree);
2139
2140
0
    if (param->bLossless)
2141
0
        x265_log(param, X265_LOG_INFO, "Rate Control                        : Lossless\n");
2142
0
    else switch (param->rc.rateControlMode)
2143
0
    {
2144
0
    case X265_RC_ABR:
2145
0
        x265_log(param, X265_LOG_INFO, "Rate Control / qCompress            : ABR-%d kbps / %0.2f\n", param->rc.bitrate, param->rc.qCompress); break;
2146
0
    case X265_RC_CQP:
2147
0
        x265_log(param, X265_LOG_INFO, "Rate Control                        : CQP-%d\n", param->rc.qp); break;
2148
0
    case X265_RC_CRF:
2149
0
        x265_log(param, X265_LOG_INFO, "Rate Control / qCompress            : CRF-%0.1f / %0.2f\n", param->rc.rfConstant, param->rc.qCompress); break;
2150
0
    }
2151
2152
0
    if (param->rc.vbvBufferSize)
2153
0
    {
2154
0
        if (param->vbvBufferEnd)
2155
0
            x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate / init / end / fr-adj: %d / %d / %.3f / %.3f / %.3f\n",
2156
0
            param->rc.vbvBufferSize, param->rc.vbvMaxBitrate, param->rc.vbvBufferInit, param->vbvBufferEnd, param->vbvEndFrameAdjust);
2157
0
        else
2158
0
            x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate / init    : %d / %d / %.3f\n",
2159
0
            param->rc.vbvBufferSize, param->rc.vbvMaxBitrate, param->rc.vbvBufferInit);
2160
0
    }
2161
    
2162
0
    char buf[80] = { 0 };
2163
0
    char tmp[40];
2164
0
#define TOOLOPT(FLAG, STR) if (FLAG) appendtool(param, buf, sizeof(buf), STR);
2165
0
#define TOOLVAL(VAL, STR)  if (VAL) { snprintf(tmp, sizeof(tmp), STR, VAL); appendtool(param, buf, sizeof(buf), tmp); }
2166
0
    TOOLOPT(param->bEnableRectInter, "rect");
2167
0
    TOOLOPT(param->bEnableAMP, "amp");
2168
0
    TOOLOPT(param->limitModes, "limit-modes");
2169
0
    TOOLVAL(param->rdLevel, "rd=%d");
2170
0
    TOOLVAL(param->dynamicRd, "dynamic-rd=%.2f");
2171
0
    TOOLOPT(param->bSsimRd, "ssim-rd");
2172
0
    TOOLVAL(param->psyRd, "psy-rd=%.2lf");
2173
0
    TOOLVAL(param->rdoqLevel, "rdoq=%d");
2174
0
    TOOLVAL(param->psyRdoq, "psy-rdoq=%.2lf");
2175
0
    TOOLOPT(param->bEnableRdRefine, "rd-refine");
2176
0
    TOOLOPT(param->bEnableEarlySkip, "early-skip");
2177
0
    TOOLVAL(param->recursionSkipMode, "rskip mode=%d");
2178
0
    if (param->recursionSkipMode == EDGE_BASED_RSKIP)
2179
0
        TOOLVAL(param->edgeVarThreshold, "rskip-edge-threshold=%.2f");
2180
0
    TOOLOPT(param->bEnableSplitRdSkip, "splitrd-skip");
2181
0
    TOOLVAL(param->noiseReductionIntra, "nr-intra=%d");
2182
0
    TOOLVAL(param->noiseReductionInter, "nr-inter=%d");
2183
0
    TOOLOPT(param->bEnableTSkipFast, "tskip-fast");
2184
0
    TOOLOPT(!param->bEnableTSkipFast && param->bEnableTransformSkip, "tskip");
2185
0
    TOOLVAL(param->limitTU , "limit-tu=%d");
2186
0
    TOOLOPT(param->bCULossless, "cu-lossless");
2187
0
    TOOLOPT(param->bEnableSignHiding, "signhide");
2188
0
    TOOLOPT(param->bEnableTemporalMvp, "tmvp");
2189
0
    TOOLOPT(param->bEnableConstrainedIntra, "cip");
2190
0
    TOOLOPT(param->bIntraInBFrames, "b-intra");
2191
0
    TOOLOPT(param->bEnableFastIntra, "fast-intra");
2192
0
    TOOLOPT(param->bEnableStrongIntraSmoothing, "strong-intra-smoothing");
2193
0
    TOOLVAL(param->lookaheadSlices, "lslices=%d");
2194
0
    TOOLVAL(param->lookaheadThreads, "lthreads=%d")
2195
0
    TOOLVAL(param->bCTUInfo, "ctu-info=%d");
2196
0
    if (param->bAnalysisType == AVC_INFO)
2197
0
    {
2198
0
        TOOLOPT(param->bAnalysisType, "refine-analysis-type=avc");
2199
0
    }
2200
0
    else if (param->bAnalysisType == HEVC_INFO)
2201
0
        TOOLOPT(param->bAnalysisType, "refine-analysis-type=hevc");
2202
0
    TOOLOPT(param->bDynamicRefine, "dynamic-refine");
2203
0
    if (param->maxSlices > 1)
2204
0
        TOOLVAL(param->maxSlices, "slices=%d");
2205
0
    if (param->bEnableLoopFilter)
2206
0
    {
2207
0
        if (param->deblockingFilterBetaOffset || param->deblockingFilterTCOffset)
2208
0
        {
2209
0
            snprintf(tmp, sizeof(tmp), "deblock(tC=%d:B=%d)", param->deblockingFilterTCOffset, param->deblockingFilterBetaOffset);
2210
0
            appendtool(param, buf, sizeof(buf), tmp);
2211
0
        }
2212
0
        else
2213
0
            TOOLOPT(param->bEnableLoopFilter, "deblock");
2214
0
    }
2215
0
    TOOLOPT(param->bSaoNonDeblocked, "sao-non-deblock");
2216
0
    TOOLOPT(!param->bSaoNonDeblocked && param->bEnableSAO, "sao");
2217
0
    if (param->selectiveSAO && param->selectiveSAO != 4)
2218
0
        TOOLOPT(param->selectiveSAO, "selective-sao");
2219
0
    TOOLOPT(param->rc.bStatWrite, "stats-write");
2220
0
    TOOLOPT(param->rc.bStatRead,  "stats-read");
2221
0
    TOOLOPT(param->bSingleSeiNal, "single-sei");
2222
#if ENABLE_ALPHA
2223
    TOOLOPT(param->numScalableLayers > 1, "alpha");
2224
#endif
2225
#if ENABLE_MULTIVIEW
2226
    TOOLOPT(param->numViews > 1, "multi-view");
2227
#endif
2228
#if ENABLE_HDR10_PLUS
2229
    TOOLOPT(param->toneMapFile != NULL, "dhdr10-info");
2230
#endif
2231
0
    if(param->bEnableTemporalFilter)
2232
0
        TOOLOPT(param->bEnableTemporalFilter, "mcstf");
2233
0
    x265_log(param, X265_LOG_INFO, "tools:%s\n", buf);
2234
0
    fflush(stderr);
2235
0
}
2236
2237
char *x265_param2string(x265_param* p, int padx, int pady)
2238
0
{
2239
0
    char *buf, *s;
2240
0
    size_t bufSize = 4000 + p->rc.zoneCount * 64;
2241
0
    if (strlen(p->numaPools))
2242
0
        bufSize += strlen(p->numaPools);
2243
0
    if (strlen(p->masteringDisplayColorVolume))
2244
0
        bufSize += strlen(p->masteringDisplayColorVolume);
2245
0
    if (strlen(p->videoSignalTypePreset))
2246
0
        bufSize += strlen(p->videoSignalTypePreset);
2247
2248
0
    buf = s = X265_MALLOC(char, bufSize);
2249
0
    if (!buf)
2250
0
        return NULL;
2251
0
#define BOOL(param, cliopt) \
2252
0
    s += snprintf(s, bufSize - (s - buf), " %s", (param) ? cliopt : "no-" cliopt);
2253
2254
0
    s += snprintf(s, bufSize - (s - buf), "cpuid=%d", p->cpuid);
2255
0
    s += snprintf(s, bufSize - (s - buf), " frame-threads=%d", p->frameNumThreads);
2256
0
    if (strlen(p->numaPools))
2257
0
        s += snprintf(s, bufSize - (s - buf), " numa-pools=%s", p->numaPools);
2258
0
    BOOL(p->bEnableWavefront, "wpp");
2259
0
    BOOL(p->bDistributeModeAnalysis, "pmode");
2260
0
    BOOL(p->bDistributeMotionEstimation, "pme");
2261
0
    BOOL(p->bEnablePsnr, "psnr");
2262
0
    BOOL(p->bEnableSsim, "ssim");
2263
0
    s += snprintf(s, bufSize - (s - buf), " log-level=%d", p->logLevel);
2264
0
    if (strlen(p->csvfn))
2265
0
        s += snprintf(s, bufSize - (s - buf), " csv csv-log-level=%d", p->csvLogLevel);
2266
0
    s += snprintf(s, bufSize - (s - buf), " bitdepth=%d", p->internalBitDepth);
2267
0
    s += snprintf(s, bufSize - (s - buf), " input-csp=%d", p->internalCsp);
2268
0
    s += snprintf(s, bufSize - (s - buf), " fps=%u/%u", p->fpsNum, p->fpsDenom);
2269
0
    s += snprintf(s, bufSize - (s - buf), " input-res=%dx%d", p->sourceWidth - padx, p->sourceHeight - pady);
2270
0
    s += snprintf(s, bufSize - (s - buf), " interlace=%d", p->interlaceMode);
2271
0
    s += snprintf(s, bufSize - (s - buf), " total-frames=%d", p->totalFrames);
2272
0
    if (p->chunkStart)
2273
0
        s += snprintf(s, bufSize - (s - buf), " chunk-start=%d", p->chunkStart);
2274
0
    if (p->chunkEnd)
2275
0
        s += snprintf(s, bufSize - (s - buf), " chunk-end=%d", p->chunkEnd);
2276
0
    s += snprintf(s, bufSize - (s - buf), " level-idc=%d", p->levelIdc);
2277
0
    s += snprintf(s, bufSize - (s - buf), " high-tier=%d", p->bHighTier);
2278
0
    s += snprintf(s, bufSize - (s - buf), " uhd-bd=%d", p->uhdBluray);
2279
0
    s += snprintf(s, bufSize - (s - buf), " ref=%d", p->maxNumReferences);
2280
0
    BOOL(p->bAllowNonConformance, "allow-non-conformance");
2281
0
    BOOL(p->bRepeatHeaders, "repeat-headers");
2282
0
    BOOL(p->bAnnexB, "annexb");
2283
0
    BOOL(p->bEnableAccessUnitDelimiters, "aud");
2284
0
    BOOL(p->bEnableEndOfBitstream, "eob");
2285
0
    BOOL(p->bEnableEndOfSequence, "eos");
2286
0
    BOOL(p->bEmitHRDSEI, "hrd");
2287
0
    BOOL(p->bEmitInfoSEI, "info");
2288
0
    s += snprintf(s, bufSize - (s - buf), " hash=%d", p->decodedPictureHashSEI);
2289
0
    s += snprintf(s, bufSize - (s - buf), " temporal-layers=%d", p->bEnableTemporalSubLayers);
2290
0
    BOOL(p->bOpenGOP, "open-gop");
2291
0
    s += snprintf(s, bufSize - (s - buf), " min-keyint=%d", p->keyframeMin);
2292
0
    s += snprintf(s, bufSize - (s - buf), " keyint=%d", p->keyframeMax);
2293
0
    s += snprintf(s, bufSize - (s - buf), " gop-lookahead=%d", p->gopLookahead);
2294
0
    s += snprintf(s, bufSize - (s - buf), " bframes=%d", p->bframes);
2295
0
    s += snprintf(s, bufSize - (s - buf), " b-adapt=%d", p->bFrameAdaptive);
2296
0
    BOOL(p->bBPyramid, "b-pyramid");
2297
0
    s += snprintf(s, bufSize - (s - buf), " bframe-bias=%d", p->bFrameBias);
2298
0
    s += snprintf(s, bufSize - (s - buf), " rc-lookahead=%d", p->lookaheadDepth);
2299
0
    s += snprintf(s, bufSize - (s - buf), " lookahead-slices=%d", p->lookaheadSlices);
2300
0
    s += snprintf(s, bufSize - (s - buf), " scenecut=%d", p->scenecutThreshold);
2301
0
    BOOL(p->bHistBasedSceneCut, "hist-scenecut");
2302
0
    s += snprintf(s, bufSize - (s - buf), " radl=%d", p->radl);
2303
0
    BOOL(p->bEnableHRDConcatFlag, "splice");
2304
0
    BOOL(p->bIntraRefresh, "intra-refresh");
2305
0
    s += snprintf(s, bufSize - (s - buf), " ctu=%d", p->maxCUSize);
2306
0
    s += snprintf(s, bufSize - (s - buf), " min-cu-size=%d", p->minCUSize);
2307
0
    BOOL(p->bEnableRectInter, "rect");
2308
0
    BOOL(p->bEnableAMP, "amp");
2309
0
    s += snprintf(s, bufSize - (s - buf), " max-tu-size=%d", p->maxTUSize);
2310
0
    s += snprintf(s, bufSize - (s - buf), " tu-inter-depth=%d", p->tuQTMaxInterDepth);
2311
0
    s += snprintf(s, bufSize - (s - buf), " tu-intra-depth=%d", p->tuQTMaxIntraDepth);
2312
0
    s += snprintf(s, bufSize - (s - buf), " limit-tu=%d", p->limitTU);
2313
0
    s += snprintf(s, bufSize - (s - buf), " rdoq-level=%d", p->rdoqLevel);
2314
0
    s += snprintf(s, bufSize - (s - buf), " dynamic-rd=%.2f", p->dynamicRd);
2315
0
    BOOL(p->bSsimRd, "ssim-rd");
2316
0
    BOOL(p->bEnableSignHiding, "signhide");
2317
0
    BOOL(p->bEnableTransformSkip, "tskip");
2318
0
    s += snprintf(s, bufSize - (s - buf), " nr-intra=%d", p->noiseReductionIntra);
2319
0
    s += snprintf(s, bufSize - (s - buf), " nr-inter=%d", p->noiseReductionInter);
2320
0
    BOOL(p->bEnableConstrainedIntra, "constrained-intra");
2321
0
    BOOL(p->bEnableStrongIntraSmoothing, "strong-intra-smoothing");
2322
0
    s += snprintf(s, bufSize - (s - buf), " max-merge=%d", p->maxNumMergeCand);
2323
0
    s += snprintf(s, bufSize - (s - buf), " limit-refs=%d", p->limitReferences);
2324
0
    BOOL(p->limitModes, "limit-modes");
2325
0
    s += snprintf(s, bufSize - (s - buf), " me=%d", p->searchMethod);
2326
0
    s += snprintf(s, bufSize - (s - buf), " subme=%d", p->subpelRefine);
2327
0
    s += snprintf(s, bufSize - (s - buf), " merange=%d", p->searchRange);
2328
0
    BOOL(p->bEnableTemporalMvp, "temporal-mvp");
2329
0
    BOOL(p->bEnableFrameDuplication, "frame-dup");
2330
0
    if(p->bEnableFrameDuplication)
2331
0
        s += snprintf(s, bufSize - (s - buf), " dup-threshold=%d", p->dupThreshold);
2332
0
    BOOL(p->bEnableHME, "hme");
2333
0
    if (p->bEnableHME)
2334
0
    {
2335
0
        s += snprintf(s, bufSize - (s - buf), " Level 0,1,2=%d,%d,%d", p->hmeSearchMethod[0], p->hmeSearchMethod[1], p->hmeSearchMethod[2]);
2336
0
        s += snprintf(s, bufSize - (s - buf), " merange L0,L1,L2=%d,%d,%d", p->hmeRange[0], p->hmeRange[1], p->hmeRange[2]);
2337
0
    }
2338
0
    BOOL(p->bEnableWeightedPred, "weightp");
2339
0
    BOOL(p->bEnableWeightedBiPred, "weightb");
2340
0
    BOOL(p->bSourceReferenceEstimation, "analyze-src-pics");
2341
0
    BOOL(p->bEnableLoopFilter, "deblock");
2342
0
    if (p->bEnableLoopFilter)
2343
0
        s += snprintf(s, bufSize - (s - buf), "=%d:%d", p->deblockingFilterTCOffset, p->deblockingFilterBetaOffset);
2344
0
    BOOL(p->bEnableSAO, "sao");
2345
0
    BOOL(p->bSaoNonDeblocked, "sao-non-deblock");
2346
0
    s += snprintf(s, bufSize - (s - buf), " rd=%d", p->rdLevel);
2347
0
    s += snprintf(s, bufSize - (s - buf), " selective-sao=%d", p->selectiveSAO);
2348
0
    BOOL(p->bEnableEarlySkip, "early-skip");
2349
0
    BOOL(p->recursionSkipMode, "rskip");
2350
0
    if (p->recursionSkipMode == EDGE_BASED_RSKIP)
2351
0
        s += snprintf(s, bufSize - (s - buf), " rskip-edge-threshold=%f", p->edgeVarThreshold);
2352
2353
0
    BOOL(p->bEnableFastIntra, "fast-intra");
2354
0
    BOOL(p->bEnableTSkipFast, "tskip-fast");
2355
0
    BOOL(p->bCULossless, "cu-lossless");
2356
0
    BOOL(p->bIntraInBFrames, "b-intra");
2357
0
    BOOL(p->bEnableSplitRdSkip, "splitrd-skip");
2358
0
    s += snprintf(s, bufSize - (s - buf), " rdpenalty=%d", p->rdPenalty);
2359
0
    s += snprintf(s, bufSize - (s - buf), " psy-rd=%.2f", p->psyRd);
2360
0
    s += snprintf(s, bufSize - (s - buf), " psy-rdoq=%.2f", p->psyRdoq);
2361
0
    BOOL(p->bEnableRdRefine, "rd-refine");
2362
0
    BOOL(p->bLossless, "lossless");
2363
0
    s += snprintf(s, bufSize - (s - buf), " cbqpoffs=%d", p->cbQpOffset);
2364
0
    s += snprintf(s, bufSize - (s - buf), " crqpoffs=%d", p->crQpOffset);
2365
0
    s += snprintf(s, bufSize - (s - buf), " rc=%s", p->rc.rateControlMode == X265_RC_ABR ? (
2366
0
         p->rc.bitrate == p->rc.vbvMaxBitrate ? "cbr" : "abr")
2367
0
         : p->rc.rateControlMode == X265_RC_CRF ? "crf" : "cqp");
2368
0
    if (p->rc.rateControlMode == X265_RC_ABR || p->rc.rateControlMode == X265_RC_CRF)
2369
0
    {
2370
0
        if (p->rc.rateControlMode == X265_RC_CRF)
2371
0
            s += snprintf(s, bufSize - (s - buf), " crf=%.1f", p->rc.rfConstant);
2372
0
        else
2373
0
            s += snprintf(s, bufSize - (s - buf), " bitrate=%d", p->rc.bitrate);
2374
0
        s += snprintf(s, bufSize - (s - buf), " qcomp=%.2f qpstep=%d", p->rc.qCompress, p->rc.qpStep);
2375
0
        s += snprintf(s, bufSize - (s - buf), " stats-write=%d", p->rc.bStatWrite);
2376
0
        s += snprintf(s, bufSize - (s - buf), " stats-read=%d", p->rc.bStatRead);
2377
0
        if (p->rc.bStatRead)
2378
0
            s += snprintf(s, bufSize - (s - buf), " cplxblur=%.1f qblur=%.1f",
2379
0
            p->rc.complexityBlur, p->rc.qblur);
2380
0
        if (p->rc.bStatWrite && !p->rc.bStatRead)
2381
0
            BOOL(p->rc.bEnableSlowFirstPass, "slow-firstpass");
2382
0
        if (p->rc.vbvBufferSize)
2383
0
        {
2384
0
            s += snprintf(s, bufSize - (s - buf), " vbv-maxrate=%d vbv-bufsize=%d vbv-init=%.1f min-vbv-fullness=%.1f max-vbv-fullness=%.1f",
2385
0
                p->rc.vbvMaxBitrate, p->rc.vbvBufferSize, p->rc.vbvBufferInit, p->minVbvFullness, p->maxVbvFullness);
2386
0
            if (p->vbvBufferEnd)
2387
0
                s += snprintf(s, bufSize - (s - buf), " vbv-end=%.1f vbv-end-fr-adj=%.1f", p->vbvBufferEnd, p->vbvEndFrameAdjust);
2388
0
            if (p->rc.rateControlMode == X265_RC_CRF)
2389
0
                s += snprintf(s, bufSize - (s - buf), " crf-max=%.1f crf-min=%.1f", p->rc.rfConstantMax, p->rc.rfConstantMin);
2390
0
        }
2391
0
    }
2392
0
    else if (p->rc.rateControlMode == X265_RC_CQP)
2393
0
        s += snprintf(s, bufSize - (s - buf), " qp=%d", p->rc.qp);
2394
0
    if (!(p->rc.rateControlMode == X265_RC_CQP && p->rc.qp == 0))
2395
0
    {
2396
0
        s += snprintf(s, bufSize - (s - buf), " ipratio=%.2f", p->rc.ipFactor);
2397
0
        if (p->bframes)
2398
0
            s += snprintf(s, bufSize - (s - buf), " pbratio=%.2f", p->rc.pbFactor);
2399
0
    }
2400
0
    s += snprintf(s, bufSize - (s - buf), " aq-mode=%d", p->rc.aqMode);
2401
0
    s += snprintf(s, bufSize - (s - buf), " aq-strength=%.2f", p->rc.aqStrength);
2402
0
    BOOL(p->rc.cuTree, "cutree");
2403
0
    s += snprintf(s, bufSize - (s - buf), " zone-count=%d", p->rc.zoneCount);
2404
0
    if (p->rc.zoneCount)
2405
0
    {
2406
0
        for (int i = 0; i < p->rc.zoneCount; ++i)
2407
0
        {
2408
0
            s += snprintf(s, bufSize - (s - buf), " zones: start-frame=%d end-frame=%d",
2409
0
                 p->rc.zones[i].startFrame, p->rc.zones[i].endFrame);
2410
0
            if (p->rc.zones[i].bForceQp)
2411
0
                s += snprintf(s, bufSize - (s - buf), " qp=%d", p->rc.zones[i].qp);
2412
0
            else
2413
0
                s += snprintf(s, bufSize - (s - buf), " bitrate-factor=%f", p->rc.zones[i].bitrateFactor);
2414
0
        }
2415
0
    }
2416
0
    BOOL(p->rc.bStrictCbr, "strict-cbr");
2417
0
    s += snprintf(s, bufSize - (s - buf), " qg-size=%d", p->rc.qgSize);
2418
0
    BOOL(p->rc.bEnableGrain, "rc-grain");
2419
0
    s += snprintf(s, bufSize - (s - buf), " qpmax=%d qpmin=%d", p->rc.qpMax, p->rc.qpMin);
2420
0
    BOOL(p->rc.bEnableConstVbv, "const-vbv");
2421
0
    s += snprintf(s, bufSize - (s - buf), " sar=%d", p->vui.aspectRatioIdc);
2422
0
    if (p->vui.aspectRatioIdc == X265_EXTENDED_SAR)
2423
0
        s += snprintf(s, bufSize - (s - buf), " sar-width : sar-height=%d:%d", p->vui.sarWidth, p->vui.sarHeight);
2424
0
    s += snprintf(s, bufSize - (s - buf), " overscan=%d", p->vui.bEnableOverscanInfoPresentFlag);
2425
0
    if (p->vui.bEnableOverscanInfoPresentFlag)
2426
0
        s += snprintf(s, bufSize - (s - buf), " overscan-crop=%d", p->vui.bEnableOverscanAppropriateFlag);
2427
0
    s += snprintf(s, bufSize - (s - buf), " videoformat=%d", p->vui.videoFormat);
2428
0
    s += snprintf(s, bufSize - (s - buf), " range=%d", p->vui.bEnableVideoFullRangeFlag);
2429
0
    s += snprintf(s, bufSize - (s - buf), " colorprim=%d", p->vui.colorPrimaries);
2430
0
    s += snprintf(s, bufSize - (s - buf), " transfer=%d", p->vui.transferCharacteristics);
2431
0
    s += snprintf(s, bufSize - (s - buf), " colormatrix=%d", p->vui.matrixCoeffs);
2432
0
    s += snprintf(s, bufSize - (s - buf), " chromaloc=%d", p->vui.bEnableChromaLocInfoPresentFlag);
2433
0
    if (p->vui.bEnableChromaLocInfoPresentFlag)
2434
0
        s += snprintf(s, bufSize - (s - buf), " chromaloc-top=%d chromaloc-bottom=%d",
2435
0
        p->vui.chromaSampleLocTypeTopField, p->vui.chromaSampleLocTypeBottomField);
2436
0
    s += snprintf(s, bufSize - (s - buf), " display-window=%d", p->vui.bEnableDefaultDisplayWindowFlag);
2437
0
    if (p->vui.bEnableDefaultDisplayWindowFlag)
2438
0
        s += snprintf(s, bufSize - (s - buf), " left=%d top=%d right=%d bottom=%d",
2439
0
        p->vui.defDispWinLeftOffset, p->vui.defDispWinTopOffset,
2440
0
        p->vui.defDispWinRightOffset, p->vui.defDispWinBottomOffset);
2441
0
    if (strlen(p->masteringDisplayColorVolume))
2442
0
        s += snprintf(s, bufSize - (s - buf), " master-display=%s", p->masteringDisplayColorVolume);
2443
0
    if (p->bEmitCLL)
2444
0
        s += snprintf(s, bufSize - (s - buf), " cll=%hu,%hu", p->maxCLL, p->maxFALL);
2445
0
    s += snprintf(s, bufSize - (s - buf), " min-luma=%hu", p->minLuma);
2446
0
    s += snprintf(s, bufSize - (s - buf), " max-luma=%hu", p->maxLuma);
2447
0
    s += snprintf(s, bufSize - (s - buf), " log2-max-poc-lsb=%d", p->log2MaxPocLsb);
2448
0
    BOOL(p->bEmitVUITimingInfo, "vui-timing-info");
2449
0
    BOOL(p->bEmitVUIHRDInfo, "vui-hrd-info");
2450
0
    s += snprintf(s, bufSize - (s - buf), " slices=%d", p->maxSlices);
2451
0
    BOOL(p->bOptQpPPS, "opt-qp-pps");
2452
0
    BOOL(p->bOptRefListLengthPPS, "opt-ref-list-length-pps");
2453
0
    BOOL(p->bMultiPassOptRPS, "multi-pass-opt-rps");
2454
0
    s += snprintf(s, bufSize - (s - buf), " scenecut-bias=%.2f", p->scenecutBias);
2455
0
    BOOL(p->bOptCUDeltaQP, "opt-cu-delta-qp");
2456
0
    BOOL(p->bAQMotion, "aq-motion");
2457
0
    BOOL(p->bEmitHDR10SEI, "hdr10");
2458
0
    BOOL(p->bHDR10Opt, "hdr10-opt");
2459
0
    BOOL(p->bDhdr10opt, "dhdr10-opt");
2460
0
    BOOL(p->bEmitIDRRecoverySEI, "idr-recovery-sei");
2461
0
    if (strlen(p->analysisSave))
2462
0
        s += snprintf(s, bufSize - (s - buf), " analysis-save");
2463
0
    if (strlen(p->analysisLoad))
2464
0
        s += snprintf(s, bufSize - (s - buf), " analysis-load");
2465
0
    s += snprintf(s, bufSize - (s - buf), " analysis-reuse-level=%d", p->analysisReuseLevel);
2466
0
    s += snprintf(s, bufSize - (s - buf), " analysis-save-reuse-level=%d", p->analysisSaveReuseLevel);
2467
0
    s += snprintf(s, bufSize - (s - buf), " analysis-load-reuse-level=%d", p->analysisLoadReuseLevel);
2468
0
    s += snprintf(s, bufSize - (s - buf), " scale-factor=%d", p->scaleFactor);
2469
0
    s += snprintf(s, bufSize - (s - buf), " refine-intra=%d", p->intraRefine);
2470
0
    s += snprintf(s, bufSize - (s - buf), " refine-inter=%d", p->interRefine);
2471
0
    s += snprintf(s, bufSize - (s - buf), " refine-mv=%d", p->mvRefine);
2472
0
    s += snprintf(s, bufSize - (s - buf), " refine-ctu-distortion=%d", p->ctuDistortionRefine);
2473
0
    BOOL(p->bLimitSAO, "limit-sao");
2474
0
    s += snprintf(s, bufSize - (s - buf), " ctu-info=%d", p->bCTUInfo);
2475
0
    BOOL(p->bLowPassDct, "lowpass-dct");
2476
0
    s += snprintf(s, bufSize - (s - buf), " refine-analysis-type=%d", p->bAnalysisType);
2477
0
    s += snprintf(s, bufSize - (s - buf), " copy-pic=%d", p->bCopyPicToFrame);
2478
0
    s += snprintf(s, bufSize - (s - buf), " max-ausize-factor=%.1f", p->maxAUSizeFactor);
2479
0
    BOOL(p->bDynamicRefine, "dynamic-refine");
2480
0
    BOOL(p->bSingleSeiNal, "single-sei");
2481
0
    BOOL(p->rc.hevcAq, "hevc-aq");
2482
0
    BOOL(p->bEnableSvtHevc, "svt");
2483
0
    BOOL(p->bField, "field");
2484
0
    s += snprintf(s, bufSize - (s - buf), " qp-adaptation-range=%.2f", p->rc.qpAdaptationRange);
2485
0
    s += snprintf(s, bufSize - (s - buf), " scenecut-aware-qp=%d", p->bEnableSceneCutAwareQp);
2486
0
    if (p->bEnableSceneCutAwareQp)
2487
0
        s += snprintf(s, bufSize - (s - buf), " fwd-scenecut-window=%d fwd-ref-qp-delta=%f fwd-nonref-qp-delta=%f bwd-scenecut-window=%d bwd-ref-qp-delta=%f bwd-nonref-qp-delta=%f", p->fwdMaxScenecutWindow, p->fwdRefQpDelta[0], p->fwdNonRefQpDelta[0], p->bwdMaxScenecutWindow, p->bwdRefQpDelta[0], p->bwdNonRefQpDelta[0]);
2488
0
    s += snprintf(s, bufSize - (s - buf), "conformance-window-offsets right=%d bottom=%d", p->confWinRightOffset, p->confWinBottomOffset);
2489
0
    s += snprintf(s, bufSize - (s - buf), " decoder-max-rate=%d", p->decoderVbvMaxRate);
2490
0
    BOOL(p->bliveVBV2pass, "vbv-live-multi-pass");
2491
0
    if (p->filmGrain)
2492
0
        s += snprintf(s, bufSize - (s - buf), " film-grain=%s", p->filmGrain); // Film grain characteristics model filename
2493
0
    if (p->aomFilmGrain)
2494
0
        s += snprintf(s, bufSize - (s - buf), " aom-film-grain=%s", p->aomFilmGrain);
2495
0
    BOOL(p->bEnableTemporalFilter, "mcstf");
2496
#if ENABLE_ALPHA
2497
    BOOL(p->bEnableAlpha, "alpha");
2498
#endif
2499
#if ENABLE_MULTIVIEW
2500
    s += snprintf(s, bufSize - (s - buf), " num-views=%d", p->numViews);
2501
    s += snprintf(s, bufSize - (s - buf), " format=%d", p->format);
2502
#endif
2503
#if ENABLE_SCC_EXT
2504
    s += snprintf(s, bufSize - (s - buf), "scc=%d", p->bEnableSCC);
2505
#endif
2506
0
    BOOL(p->bEnableSBRC, "sbrc");
2507
0
    BOOL(p->bConfigRCFrame, "frame-rc");
2508
0
#undef BOOL
2509
0
    return buf;
2510
0
}
2511
2512
bool parseLambdaFile(x265_param* param)
2513
654
{
2514
654
    if (!strlen(param->rc.lambdaFileName))
2515
654
        return false;
2516
2517
0
    FILE *lfn = x265_fopen(param->rc.lambdaFileName, "r");
2518
0
    if (!lfn)
2519
0
    {
2520
0
        x265_log_file(param, X265_LOG_ERROR, "unable to read lambda file <%s>\n", param->rc.lambdaFileName);
2521
0
        return true;
2522
0
    }
2523
2524
0
    char line[2048];
2525
0
    char *toksave = NULL, *tok = NULL, *buf = NULL;
2526
2527
0
    for (int t = 0; t < 3; t++)
2528
0
    {
2529
0
        double *table = t ? x265_lambda2_tab : x265_lambda_tab;
2530
2531
0
        for (int i = 0; i < QP_MAX_MAX + 1; i++)
2532
0
        {
2533
0
            double value;
2534
2535
0
            do
2536
0
            {
2537
0
                if (!tok)
2538
0
                {
2539
                    /* consume a line of text file */
2540
0
                    if (!fgets(line, sizeof(line), lfn))
2541
0
                    {
2542
0
                        fclose(lfn);
2543
2544
0
                        if (t < 2)
2545
0
                        {
2546
0
                            x265_log(param, X265_LOG_ERROR, "lambda file is incomplete\n");
2547
0
                            return true;
2548
0
                        }
2549
0
                        else
2550
0
                            return false;
2551
0
                    }
2552
2553
                    /* truncate at first hash */
2554
0
                    char *hash = strchr(line, '#');
2555
0
                    if (hash) *hash = 0;
2556
0
                    buf = line;
2557
0
                }
2558
2559
0
                tok = strtok_r(buf, " ,", &toksave);
2560
0
                buf = NULL;
2561
0
                if (tok && sscanf(tok, "%lf", &value) == 1)
2562
0
                    break;
2563
0
            }
2564
0
            while (1);
2565
2566
0
            if (t == 2)
2567
0
            {
2568
0
                x265_log(param, X265_LOG_ERROR, "lambda file contains too many values\n");
2569
0
                fclose(lfn);
2570
0
                return true;
2571
0
            }
2572
0
            else
2573
0
                x265_log(param, X265_LOG_DEBUG, "lambda%c[%d] = %lf\n", t ? '2' : ' ', i, value);
2574
0
            table[i] = value;
2575
0
        }
2576
0
    }
2577
2578
0
    fclose(lfn);
2579
0
    return false;
2580
0
}
2581
2582
bool parseMaskingStrength(x265_param* p, const char* value)
2583
0
{
2584
0
    bool bError = false;
2585
0
    int window1[6];
2586
0
    double refQpDelta1[6], nonRefQpDelta1[6];
2587
0
    if (p->bEnableSceneCutAwareQp == FORWARD)
2588
0
    {
2589
0
        if (3 == sscanf(value, "%d,%lf,%lf", &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0]))
2590
0
        {
2591
0
            if (window1[0] > 0)
2592
0
                p->fwdMaxScenecutWindow = window1[0];
2593
0
            if (refQpDelta1[0] > 0)
2594
0
                p->fwdRefQpDelta[0] = refQpDelta1[0];
2595
0
            if (nonRefQpDelta1[0] > 0)
2596
0
                p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
2597
2598
0
            p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
2599
0
            for (int i = 1; i < 6; i++)
2600
0
            {
2601
0
                p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
2602
0
                p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15 * p->fwdRefQpDelta[i - 1]);
2603
0
                p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] - (0.15 * p->fwdNonRefQpDelta[i - 1]);
2604
0
            }
2605
0
        }
2606
0
        else if (18 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
2607
0
            , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0], &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
2608
0
            , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2], &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
2609
0
            , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4], &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
2610
0
        {
2611
0
            p->fwdMaxScenecutWindow = 0;
2612
0
            for (int i = 0; i < 6; i++)
2613
0
            {
2614
0
                p->fwdScenecutWindow[i] = window1[i];
2615
0
                p->fwdRefQpDelta[i] = refQpDelta1[i];
2616
0
                p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
2617
0
                p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
2618
0
            }
2619
0
        }
2620
0
        else
2621
0
        {
2622
0
            x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary offsets for masking-strength \n");
2623
0
            bError = true;
2624
0
        }
2625
0
    }
2626
0
    else if (p->bEnableSceneCutAwareQp == BACKWARD)
2627
0
    {
2628
0
        if (3 == sscanf(value, "%d,%lf,%lf", &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0]))
2629
0
        {
2630
0
            if (window1[0] > 0)
2631
0
                p->bwdMaxScenecutWindow = window1[0];
2632
0
            if (refQpDelta1[0] > 0)
2633
0
                p->bwdRefQpDelta[0] = refQpDelta1[0];
2634
0
            if (nonRefQpDelta1[0] > 0)
2635
0
                p->bwdNonRefQpDelta[0] = nonRefQpDelta1[0];
2636
2637
0
            p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
2638
0
            for (int i = 1; i < 6; i++)
2639
0
            {
2640
0
                p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
2641
0
                p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15 * p->bwdRefQpDelta[i - 1]);
2642
0
                p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] - (0.15 * p->bwdNonRefQpDelta[i - 1]);
2643
0
            }
2644
0
        }
2645
0
        else if (18 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
2646
0
            , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0], &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
2647
0
            , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2], &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
2648
0
            , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4], &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
2649
0
        {
2650
0
            p->bwdMaxScenecutWindow = 0;
2651
0
            for (int i = 0; i < 6; i++)
2652
0
            {
2653
0
                p->bwdScenecutWindow[i] = window1[i];
2654
0
                p->bwdRefQpDelta[i] = refQpDelta1[i];
2655
0
                p->bwdNonRefQpDelta[i] = nonRefQpDelta1[i];
2656
0
                p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
2657
0
            }
2658
0
        }
2659
0
        else
2660
0
        {
2661
0
            x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary offsets for masking-strength \n");
2662
0
            bError = true;
2663
0
        }
2664
0
    }
2665
0
    else if (p->bEnableSceneCutAwareQp == BI_DIRECTIONAL)
2666
0
    {
2667
0
        int window2[6];
2668
0
        double refQpDelta2[6], nonRefQpDelta2[6];
2669
0
        if (6 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf", &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0], &window2[0], &refQpDelta2[0], &nonRefQpDelta2[0]))
2670
0
        {
2671
0
            if (window1[0] > 0)
2672
0
                p->fwdMaxScenecutWindow = window1[0];
2673
0
            if (refQpDelta1[0] > 0)
2674
0
                p->fwdRefQpDelta[0] = refQpDelta1[0];
2675
0
            if (nonRefQpDelta1[0] > 0)
2676
0
                p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
2677
0
            if (window2[0] > 0)
2678
0
                p->bwdMaxScenecutWindow = window2[0];
2679
0
            if (refQpDelta2[0] > 0)
2680
0
                p->bwdRefQpDelta[0] = refQpDelta2[0];
2681
0
            if (nonRefQpDelta2[0] > 0)
2682
0
                p->bwdNonRefQpDelta[0] = nonRefQpDelta2[0];
2683
2684
0
            p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
2685
0
            p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
2686
0
            for (int i = 1; i < 6; i++)
2687
0
            {
2688
0
                p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
2689
0
                p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
2690
0
                p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15 * p->fwdRefQpDelta[i - 1]);
2691
0
                p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] - (0.15 * p->fwdNonRefQpDelta[i - 1]);
2692
0
                p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15 * p->bwdRefQpDelta[i - 1]);
2693
0
                p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] - (0.15 * p->bwdNonRefQpDelta[i - 1]);
2694
0
            }
2695
0
        }
2696
0
        else if (36 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
2697
0
            , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0], &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
2698
0
            , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2], &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
2699
0
            , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4], &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]
2700
0
            , &window2[0], &refQpDelta2[0], &nonRefQpDelta2[0], &window2[1], &refQpDelta2[1], &nonRefQpDelta2[1]
2701
0
            , &window2[2], &refQpDelta2[2], &nonRefQpDelta2[2], &window2[3], &refQpDelta2[3], &nonRefQpDelta2[3]
2702
0
            , &window2[4], &refQpDelta2[4], &nonRefQpDelta2[4], &window2[5], &refQpDelta2[5], &nonRefQpDelta2[5]))
2703
0
        {
2704
0
            p->fwdMaxScenecutWindow = 0;
2705
0
            p->bwdMaxScenecutWindow = 0;
2706
0
            for (int i = 0; i < 6; i++)
2707
0
            {
2708
0
                p->fwdScenecutWindow[i] = window1[i];
2709
0
                p->fwdRefQpDelta[i] = refQpDelta1[i];
2710
0
                p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
2711
0
                p->bwdScenecutWindow[i] = window2[i];
2712
0
                p->bwdRefQpDelta[i] = refQpDelta2[i];
2713
0
                p->bwdNonRefQpDelta[i] = nonRefQpDelta2[i];
2714
0
                p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
2715
0
                p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
2716
0
            }
2717
0
        }
2718
0
        else
2719
0
        {
2720
0
            x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary offsets for masking-strength \n");
2721
0
            bError = true;
2722
0
        }
2723
0
    }
2724
0
    return bError;
2725
0
}
2726
2727
void x265_copy_params(x265_param* dst, x265_param* src)
2728
3.27k
{
2729
3.27k
    dst->mcstfFrameRange = src->mcstfFrameRange;
2730
3.27k
    dst->cpuid = src->cpuid;
2731
3.27k
    dst->frameNumThreads = src->frameNumThreads;
2732
3.27k
    if (strlen(src->numaPools)) snprintf(dst->numaPools, X265_MAX_STRING_SIZE, "%s", src->numaPools);
2733
3.27k
    else dst->numaPools[0] = 0;
2734
2735
3.27k
    dst->tune = src->tune;
2736
3.27k
    dst->bEnableWavefront = src->bEnableWavefront;
2737
3.27k
    dst->bDistributeModeAnalysis = src->bDistributeModeAnalysis;
2738
3.27k
    dst->bDistributeMotionEstimation = src->bDistributeMotionEstimation;
2739
3.27k
    dst->bLogCuStats = src->bLogCuStats;
2740
3.27k
    dst->bEnablePsnr = src->bEnablePsnr;
2741
3.27k
    dst->bEnableSsim = src->bEnableSsim;
2742
3.27k
    dst->logLevel = src->logLevel;
2743
3.27k
    dst->csvLogLevel = src->csvLogLevel;
2744
3.27k
    if (strlen(src->csvfn)) snprintf(dst->csvfn, X265_MAX_STRING_SIZE, "%s", src->csvfn);
2745
3.27k
    else dst->csvfn[0] = 0;
2746
3.27k
    dst->internalBitDepth = src->internalBitDepth;
2747
3.27k
    dst->sourceBitDepth = src->sourceBitDepth;
2748
3.27k
    dst->internalCsp = src->internalCsp;
2749
3.27k
    dst->fpsNum = src->fpsNum;
2750
3.27k
    dst->fpsDenom = src->fpsDenom;
2751
3.27k
    dst->sourceHeight = src->sourceHeight;
2752
3.27k
    dst->sourceWidth = src->sourceWidth;
2753
3.27k
    dst->interlaceMode = src->interlaceMode;
2754
3.27k
    dst->totalFrames = src->totalFrames;
2755
3.27k
    dst->levelIdc = src->levelIdc;
2756
3.27k
    dst->bHighTier = src->bHighTier;
2757
3.27k
    dst->uhdBluray = src->uhdBluray;
2758
3.27k
    dst->maxNumReferences = src->maxNumReferences;
2759
3.27k
    dst->bAllowNonConformance = src->bAllowNonConformance;
2760
3.27k
    dst->bRepeatHeaders = src->bRepeatHeaders;
2761
3.27k
    dst->bAnnexB = src->bAnnexB;
2762
3.27k
    dst->bEnableAccessUnitDelimiters = src->bEnableAccessUnitDelimiters;
2763
3.27k
    dst->bEnableEndOfBitstream = src->bEnableEndOfBitstream;
2764
3.27k
    dst->bEnableEndOfSequence = src->bEnableEndOfSequence;
2765
3.27k
    dst->bEmitInfoSEI = src->bEmitInfoSEI;
2766
3.27k
    dst->decodedPictureHashSEI = src->decodedPictureHashSEI;
2767
3.27k
    dst->bEnableTemporalSubLayers = src->bEnableTemporalSubLayers;
2768
3.27k
    dst->bOpenGOP = src->bOpenGOP;
2769
3.27k
  dst->craNal = src->craNal;
2770
3.27k
    dst->keyframeMax = src->keyframeMax;
2771
3.27k
    dst->keyframeMin = src->keyframeMin;
2772
3.27k
    dst->bframes = src->bframes;
2773
3.27k
    dst->bFrameAdaptive = src->bFrameAdaptive;
2774
3.27k
    dst->bFrameBias = src->bFrameBias;
2775
3.27k
    dst->bBPyramid = src->bBPyramid;
2776
3.27k
    dst->lookaheadDepth = src->lookaheadDepth;
2777
3.27k
    dst->lookaheadSlices = src->lookaheadSlices;
2778
3.27k
    dst->lookaheadThreads = src->lookaheadThreads;
2779
3.27k
    dst->scenecutThreshold = src->scenecutThreshold;
2780
3.27k
    dst->bHistBasedSceneCut = src->bHistBasedSceneCut;
2781
3.27k
    dst->bIntraRefresh = src->bIntraRefresh;
2782
3.27k
    dst->maxCUSize = src->maxCUSize;
2783
3.27k
    dst->minCUSize = src->minCUSize;
2784
3.27k
    dst->bEnableRectInter = src->bEnableRectInter;
2785
3.27k
    dst->bEnableAMP = src->bEnableAMP;
2786
3.27k
    dst->maxTUSize = src->maxTUSize;
2787
3.27k
    dst->tuQTMaxInterDepth = src->tuQTMaxInterDepth;
2788
3.27k
    dst->tuQTMaxIntraDepth = src->tuQTMaxIntraDepth;
2789
3.27k
    dst->limitTU = src->limitTU;
2790
3.27k
    dst->rdoqLevel = src->rdoqLevel;
2791
3.27k
    dst->bEnableSignHiding = src->bEnableSignHiding;
2792
3.27k
    dst->bEnableTransformSkip = src->bEnableTransformSkip;
2793
3.27k
    dst->noiseReductionInter = src->noiseReductionInter;
2794
3.27k
    dst->noiseReductionIntra = src->noiseReductionIntra;
2795
3.27k
    if (strlen(src->scalingLists)) snprintf(dst->scalingLists, X265_MAX_STRING_SIZE, "%s", src->scalingLists);
2796
3.27k
    else dst->scalingLists[0] = 0;
2797
3.27k
    dst->bEnableStrongIntraSmoothing = src->bEnableStrongIntraSmoothing;
2798
3.27k
    dst->bEnableConstrainedIntra = src->bEnableConstrainedIntra;
2799
3.27k
    dst->maxNumMergeCand = src->maxNumMergeCand;
2800
3.27k
    dst->limitReferences = src->limitReferences;
2801
3.27k
    dst->limitModes = src->limitModes;
2802
3.27k
    dst->searchMethod = src->searchMethod;
2803
3.27k
    dst->subpelRefine = src->subpelRefine;
2804
3.27k
    dst->searchRange = src->searchRange;
2805
3.27k
    dst->bEnableTemporalMvp = src->bEnableTemporalMvp;
2806
3.27k
    dst->bEnableFrameDuplication = src->bEnableFrameDuplication;
2807
3.27k
    dst->dupThreshold = src->dupThreshold;
2808
3.27k
    dst->bEnableHME = src->bEnableHME;
2809
3.27k
    if (src->bEnableHME)
2810
0
    {
2811
0
        for (int level = 0; level < 3; level++)
2812
0
        {
2813
0
            dst->hmeSearchMethod[level] = src->hmeSearchMethod[level];
2814
0
            dst->hmeRange[level] = src->hmeRange[level];
2815
0
        }
2816
0
    }
2817
3.27k
    dst->bEnableWeightedBiPred = src->bEnableWeightedBiPred;
2818
3.27k
    dst->bEnableWeightedPred = src->bEnableWeightedPred;
2819
3.27k
    dst->bSourceReferenceEstimation = src->bSourceReferenceEstimation;
2820
3.27k
    dst->bEnableLoopFilter = src->bEnableLoopFilter;
2821
3.27k
    dst->deblockingFilterBetaOffset = src->deblockingFilterBetaOffset;
2822
3.27k
    dst->deblockingFilterTCOffset = src->deblockingFilterTCOffset;
2823
3.27k
    dst->bEnableSAO = src->bEnableSAO;
2824
3.27k
    dst->bSaoNonDeblocked = src->bSaoNonDeblocked;
2825
3.27k
    dst->rdLevel = src->rdLevel;
2826
3.27k
    dst->bEnableEarlySkip = src->bEnableEarlySkip;
2827
3.27k
    dst->recursionSkipMode = src->recursionSkipMode;
2828
3.27k
    dst->edgeVarThreshold = src->edgeVarThreshold;
2829
3.27k
    dst->bEnableFastIntra = src->bEnableFastIntra;
2830
3.27k
    dst->bEnableTSkipFast = src->bEnableTSkipFast;
2831
3.27k
    dst->bCULossless = src->bCULossless;
2832
3.27k
    dst->bIntraInBFrames = src->bIntraInBFrames;
2833
3.27k
    dst->rdPenalty = src->rdPenalty;
2834
3.27k
    dst->psyRd = src->psyRd;
2835
3.27k
    dst->psyRdoq = src->psyRdoq;
2836
3.27k
    dst->bEnableRdRefine = src->bEnableRdRefine;
2837
3.27k
    dst->analysisReuseMode = src->analysisReuseMode;
2838
3.27k
    if (strlen(src->analysisReuseFileName)) snprintf(dst->analysisReuseFileName, X265_MAX_STRING_SIZE, "%s", src->analysisReuseFileName);
2839
3.27k
    else dst->analysisReuseFileName[0] = 0;
2840
3.27k
    dst->bLossless = src->bLossless;
2841
3.27k
    dst->cbQpOffset = src->cbQpOffset;
2842
3.27k
    dst->crQpOffset = src->crQpOffset;
2843
3.27k
    dst->preferredTransferCharacteristics = src->preferredTransferCharacteristics;
2844
3.27k
    dst->pictureStructure = src->pictureStructure;
2845
2846
3.27k
    dst->rc.rateControlMode = src->rc.rateControlMode;
2847
3.27k
    dst->rc.qp = src->rc.qp;
2848
3.27k
    dst->rc.bitrate = src->rc.bitrate;
2849
3.27k
    dst->rc.qCompress = src->rc.qCompress;
2850
3.27k
    dst->rc.ipFactor = src->rc.ipFactor;
2851
3.27k
    dst->rc.pbFactor = src->rc.pbFactor;
2852
3.27k
    dst->rc.rfConstant = src->rc.rfConstant;
2853
3.27k
    dst->rc.qpStep = src->rc.qpStep;
2854
3.27k
    dst->rc.aqMode = src->rc.aqMode;
2855
3.27k
    dst->rc.aqStrength = src->rc.aqStrength;
2856
3.27k
    dst->rc.vbvBufferSize = src->rc.vbvBufferSize;
2857
3.27k
    dst->rc.vbvMaxBitrate = src->rc.vbvMaxBitrate;
2858
2859
3.27k
    dst->rc.vbvBufferInit = src->rc.vbvBufferInit;
2860
3.27k
    dst->minVbvFullness = src->minVbvFullness;
2861
3.27k
    dst->maxVbvFullness = src->maxVbvFullness;
2862
3.27k
    dst->rc.cuTree = src->rc.cuTree;
2863
3.27k
    dst->rc.rfConstantMax = src->rc.rfConstantMax;
2864
3.27k
    dst->rc.rfConstantMin = src->rc.rfConstantMin;
2865
3.27k
    dst->rc.bStatWrite = src->rc.bStatWrite;
2866
3.27k
    dst->rc.bStatRead = src->rc.bStatRead;
2867
3.27k
    dst->rc.dataShareMode = src->rc.dataShareMode;
2868
3.27k
    if (strlen(src->rc.statFileName)) snprintf(dst->rc.statFileName, X265_MAX_STRING_SIZE, "%s", src->rc.statFileName);
2869
3.27k
    else dst->rc.statFileName[0] = 0;
2870
3.27k
    if (strlen(src->rc.sharedMemName)) snprintf(dst->rc.sharedMemName, X265_MAX_STRING_SIZE, "%s", src->rc.sharedMemName);
2871
3.27k
    else dst->rc.sharedMemName[0] = 0;
2872
3.27k
    dst->rc.qblur = src->rc.qblur;
2873
3.27k
    dst->rc.complexityBlur = src->rc.complexityBlur;
2874
3.27k
    dst->rc.bEnableSlowFirstPass = src->rc.bEnableSlowFirstPass;
2875
3.27k
    dst->rc.zoneCount = src->rc.zoneCount;
2876
3.27k
    dst->rc.zonefileCount = src->rc.zonefileCount;
2877
3.27k
    dst->reconfigWindowSize = src->reconfigWindowSize;
2878
3.27k
    dst->bResetZoneConfig = src->bResetZoneConfig;
2879
3.27k
    dst->bNoResetZoneConfig = src->bNoResetZoneConfig;
2880
3.27k
    dst->decoderVbvMaxRate = src->decoderVbvMaxRate;
2881
2882
3.27k
    if (src->rc.zonefileCount && src->rc.zones && src->bResetZoneConfig)
2883
0
    {
2884
0
        for (int i = 0; i < src->rc.zonefileCount; i++)
2885
0
        {
2886
0
            dst->rc.zones[i].startFrame = src->rc.zones[i].startFrame;
2887
0
            dst->rc.zones[0].keyframeMax = src->rc.zones[0].keyframeMax;
2888
0
            memcpy(dst->rc.zones[i].zoneParam, src->rc.zones[i].zoneParam, sizeof(x265_param));
2889
0
        }
2890
0
    }
2891
3.27k
    else if (src->rc.zoneCount && src->rc.zones)
2892
0
    {
2893
0
        for (int i = 0; i < src->rc.zoneCount; i++)
2894
0
        {
2895
0
            dst->rc.zones[i].startFrame = src->rc.zones[i].startFrame;
2896
0
            dst->rc.zones[i].endFrame = src->rc.zones[i].endFrame;
2897
0
            dst->rc.zones[i].bForceQp = src->rc.zones[i].bForceQp;
2898
0
            dst->rc.zones[i].qp = src->rc.zones[i].qp;
2899
0
            dst->rc.zones[i].bitrateFactor = src->rc.zones[i].bitrateFactor;
2900
0
        }
2901
0
    }
2902
3.27k
    else
2903
3.27k
        dst->rc.zones = NULL;
2904
2905
3.27k
    if (strlen(src->rc.lambdaFileName)) snprintf(dst->rc.lambdaFileName, X265_MAX_STRING_SIZE, "%s", src->rc.lambdaFileName);
2906
3.27k
    else dst->rc.lambdaFileName[0] = 0;
2907
3.27k
    dst->rc.bStrictCbr = src->rc.bStrictCbr;
2908
3.27k
    dst->rc.qgSize = src->rc.qgSize;
2909
3.27k
    dst->rc.bEnableGrain = src->rc.bEnableGrain;
2910
3.27k
    dst->rc.qpMax = src->rc.qpMax;
2911
3.27k
    dst->rc.qpMin = src->rc.qpMin;
2912
3.27k
    dst->rc.bEnableConstVbv = src->rc.bEnableConstVbv;
2913
3.27k
    dst->rc.hevcAq = src->rc.hevcAq;
2914
3.27k
    dst->rc.qpAdaptationRange = src->rc.qpAdaptationRange;
2915
2916
3.27k
    dst->vui.aspectRatioIdc = src->vui.aspectRatioIdc;
2917
3.27k
    dst->vui.sarWidth = src->vui.sarWidth;
2918
3.27k
    dst->vui.sarHeight = src->vui.sarHeight;
2919
3.27k
    dst->vui.bEnableOverscanAppropriateFlag = src->vui.bEnableOverscanAppropriateFlag;
2920
3.27k
    dst->vui.bEnableOverscanInfoPresentFlag = src->vui.bEnableOverscanInfoPresentFlag;
2921
3.27k
    dst->vui.bEnableVideoSignalTypePresentFlag = src->vui.bEnableVideoSignalTypePresentFlag;
2922
3.27k
    dst->vui.videoFormat = src->vui.videoFormat;
2923
3.27k
    dst->vui.bEnableVideoFullRangeFlag = src->vui.bEnableVideoFullRangeFlag;
2924
3.27k
    dst->vui.bEnableColorDescriptionPresentFlag = src->vui.bEnableColorDescriptionPresentFlag;
2925
3.27k
    dst->vui.colorPrimaries = src->vui.colorPrimaries;
2926
3.27k
    dst->vui.transferCharacteristics = src->vui.transferCharacteristics;
2927
3.27k
    dst->vui.matrixCoeffs = src->vui.matrixCoeffs;
2928
3.27k
    dst->vui.bEnableChromaLocInfoPresentFlag = src->vui.bEnableChromaLocInfoPresentFlag;
2929
3.27k
    dst->vui.chromaSampleLocTypeTopField = src->vui.chromaSampleLocTypeTopField;
2930
3.27k
    dst->vui.chromaSampleLocTypeBottomField = src->vui.chromaSampleLocTypeBottomField;
2931
3.27k
    dst->vui.bEnableDefaultDisplayWindowFlag = src->vui.bEnableDefaultDisplayWindowFlag;
2932
3.27k
    dst->vui.defDispWinBottomOffset = src->vui.defDispWinBottomOffset;
2933
3.27k
    dst->vui.defDispWinLeftOffset = src->vui.defDispWinLeftOffset;
2934
3.27k
    dst->vui.defDispWinRightOffset = src->vui.defDispWinRightOffset;
2935
3.27k
    dst->vui.defDispWinTopOffset = src->vui.defDispWinTopOffset;
2936
2937
3.27k
    if (strlen(src->masteringDisplayColorVolume)) snprintf(dst->masteringDisplayColorVolume, X265_MAX_STRING_SIZE, "%s", src->masteringDisplayColorVolume);
2938
3.27k
    else dst->masteringDisplayColorVolume[0] = 0;
2939
3.27k
    dst->maxLuma = src->maxLuma;
2940
3.27k
    dst->minLuma = src->minLuma;
2941
3.27k
    dst->bEmitCLL = src->bEmitCLL;
2942
3.27k
    dst->maxCLL = src->maxCLL;
2943
3.27k
    dst->maxFALL = src->maxFALL;
2944
3.27k
    dst->log2MaxPocLsb = src->log2MaxPocLsb;
2945
3.27k
    dst->bEmitVUIHRDInfo = src->bEmitVUIHRDInfo;
2946
3.27k
    dst->bEmitVUITimingInfo = src->bEmitVUITimingInfo;
2947
3.27k
    dst->maxSlices = src->maxSlices;
2948
3.27k
    dst->bOptQpPPS = src->bOptQpPPS;
2949
3.27k
    dst->bOptRefListLengthPPS = src->bOptRefListLengthPPS;
2950
3.27k
    dst->bMultiPassOptRPS = src->bMultiPassOptRPS;
2951
3.27k
    dst->scenecutBias = src->scenecutBias;
2952
3.27k
    dst->gopLookahead = src->lookaheadDepth;
2953
3.27k
    dst->bOptCUDeltaQP = src->bOptCUDeltaQP;
2954
3.27k
    dst->analysisMultiPassDistortion = src->analysisMultiPassDistortion;
2955
3.27k
    dst->analysisMultiPassRefine = src->analysisMultiPassRefine;
2956
3.27k
    dst->bAQMotion = src->bAQMotion;
2957
3.27k
    dst->bSsimRd = src->bSsimRd;
2958
3.27k
    dst->dynamicRd = src->dynamicRd;
2959
3.27k
    dst->bEmitHDR10SEI = src->bEmitHDR10SEI;
2960
3.27k
    dst->bEmitHRDSEI = src->bEmitHRDSEI;
2961
3.27k
    dst->bHDROpt = src->bHDROpt; /*DEPRECATED*/
2962
3.27k
    dst->bHDR10Opt = src->bHDR10Opt;
2963
3.27k
    dst->analysisReuseLevel = src->analysisReuseLevel;
2964
3.27k
    dst->analysisSaveReuseLevel = src->analysisSaveReuseLevel;
2965
3.27k
    dst->analysisLoadReuseLevel = src->analysisLoadReuseLevel;
2966
3.27k
    dst->bLimitSAO = src->bLimitSAO;
2967
3.27k
    if (strlen(src->toneMapFile)) snprintf(dst->toneMapFile, X265_MAX_STRING_SIZE, "%s", src->toneMapFile);
2968
3.27k
    else dst->toneMapFile[0] = 0;
2969
3.27k
    dst->bDhdr10opt = src->bDhdr10opt;
2970
3.27k
    dst->bCTUInfo = src->bCTUInfo;
2971
3.27k
    dst->bUseRcStats = src->bUseRcStats;
2972
3.27k
    dst->interRefine = src->interRefine;
2973
3.27k
    dst->intraRefine = src->intraRefine;
2974
3.27k
    dst->mvRefine = src->mvRefine;
2975
3.27k
    dst->maxLog2CUSize = src->maxLog2CUSize;
2976
3.27k
    dst->maxCUDepth = src->maxCUDepth;
2977
3.27k
    dst->unitSizeDepth = src->unitSizeDepth;
2978
3.27k
    dst->num4x4Partitions = src->num4x4Partitions;
2979
2980
3.27k
    dst->csvfpt = src->csvfpt;
2981
3.27k
    dst->bEnableSplitRdSkip = src->bEnableSplitRdSkip;
2982
3.27k
    dst->bUseAnalysisFile = src->bUseAnalysisFile;
2983
3.27k
    dst->forceFlush = src->forceFlush;
2984
3.27k
    dst->bDisableLookahead = src->bDisableLookahead;
2985
3.27k
    dst->bLowPassDct = src->bLowPassDct;
2986
3.27k
    dst->vbvBufferEnd = src->vbvBufferEnd;
2987
3.27k
    dst->vbvEndFrameAdjust = src->vbvEndFrameAdjust;
2988
3.27k
    dst->bAnalysisType = src->bAnalysisType;
2989
3.27k
    dst->bCopyPicToFrame = src->bCopyPicToFrame;
2990
3.27k
    if (strlen(src->analysisSave)) snprintf(dst->analysisSave, X265_MAX_STRING_SIZE, "%s", src->analysisSave);
2991
3.27k
    else dst->analysisSave[0] = 0;
2992
3.27k
    if (strlen(src->analysisLoad)) snprintf(dst->analysisLoad, X265_MAX_STRING_SIZE, "%s", src->analysisLoad);
2993
3.27k
    else dst->analysisLoad[0] = 0;
2994
3.27k
    dst->gopLookahead = src->gopLookahead;
2995
3.27k
    dst->radl = src->radl;
2996
3.27k
    dst->selectiveSAO = src->selectiveSAO;
2997
3.27k
    dst->maxAUSizeFactor = src->maxAUSizeFactor;
2998
3.27k
    dst->bEmitIDRRecoverySEI = src->bEmitIDRRecoverySEI;
2999
3.27k
    dst->bDynamicRefine = src->bDynamicRefine;
3000
3.27k
    dst->bSingleSeiNal = src->bSingleSeiNal;
3001
3.27k
    dst->chunkStart = src->chunkStart;
3002
3.27k
    dst->chunkEnd = src->chunkEnd;
3003
3.27k
    if (src->naluFile[0]) snprintf(dst->naluFile, X265_MAX_STRING_SIZE, "%s", src->naluFile);
3004
3.27k
    else dst->naluFile[0] = 0;
3005
3.27k
    dst->scaleFactor = src->scaleFactor;
3006
3.27k
    dst->ctuDistortionRefine = src->ctuDistortionRefine;
3007
3.27k
    dst->bEnableHRDConcatFlag = src->bEnableHRDConcatFlag;
3008
3.27k
    dst->dolbyProfile = src->dolbyProfile;
3009
3.27k
    dst->bEnableSvtHevc = src->bEnableSvtHevc;
3010
3.27k
    dst->bThreadedME = src->bThreadedME;
3011
3.27k
    dst->tmeTaskBlockSize = src->tmeTaskBlockSize;
3012
3.27k
    dst->tmeNumBufferRows = src->tmeNumBufferRows;
3013
3.27k
    dst->bEnableFades = src->bEnableFades;
3014
3.27k
    dst->bEnableSceneCutAwareQp = src->bEnableSceneCutAwareQp;
3015
3.27k
    dst->fwdMaxScenecutWindow = src->fwdMaxScenecutWindow;
3016
3.27k
    dst->bwdMaxScenecutWindow = src->bwdMaxScenecutWindow;
3017
22.8k
    for (int i = 0; i < 6; i++)
3018
19.6k
    {
3019
19.6k
        dst->fwdScenecutWindow[i] = src->fwdScenecutWindow[i];
3020
19.6k
        dst->fwdRefQpDelta[i] = src->fwdRefQpDelta[i];
3021
19.6k
        dst->fwdNonRefQpDelta[i] = src->fwdNonRefQpDelta[i];
3022
19.6k
        dst->bwdScenecutWindow[i] = src->bwdScenecutWindow[i];
3023
19.6k
        dst->bwdRefQpDelta[i] = src->bwdRefQpDelta[i];
3024
19.6k
        dst->bwdNonRefQpDelta[i] = src->bwdNonRefQpDelta[i];
3025
19.6k
    }
3026
3.27k
    dst->bField = src->bField;
3027
3.27k
    dst->bEnableTemporalFilter = src->bEnableTemporalFilter;
3028
3.27k
    dst->temporalFilterStrength = src->temporalFilterStrength;
3029
3.27k
    dst->searchRangeForLayer0 = src->searchRangeForLayer0;
3030
3.27k
    dst->searchRangeForLayer1 = src->searchRangeForLayer1;
3031
3.27k
    dst->searchRangeForLayer2 = src->searchRangeForLayer2;
3032
3.27k
    dst->confWinRightOffset = src->confWinRightOffset;
3033
3.27k
    dst->confWinBottomOffset = src->confWinBottomOffset;
3034
3.27k
    dst->bliveVBV2pass = src->bliveVBV2pass;
3035
#if ENABLE_ALPHA
3036
    dst->bEnableAlpha = src->bEnableAlpha;
3037
    dst->numScalableLayers = src->numScalableLayers;
3038
#endif
3039
#if ENABLE_MULTIVIEW
3040
    dst->numViews = src->numViews;
3041
    dst->format = src->format;
3042
#endif
3043
3.27k
    dst->numLayers = src->numLayers;
3044
#if ENABLE_SCC_EXT
3045
    dst->bEnableSCC = src->bEnableSCC;
3046
#endif
3047
3048
3.27k
    if (strlen(src->videoSignalTypePreset)) snprintf(dst->videoSignalTypePreset, X265_MAX_STRING_SIZE, "%s", src->videoSignalTypePreset);
3049
3.27k
    else dst->videoSignalTypePreset[0] = 0;
3050
#ifdef SVT_HEVC
3051
    memcpy(dst->svtHevcParam, src->svtHevcParam, sizeof(EB_H265_ENC_CONFIGURATION));
3052
#endif
3053
    /* Film grain */
3054
3.27k
    dst->filmGrain = src->filmGrain;
3055
    /* Aom Film grain*/
3056
3.27k
    dst->aomFilmGrain = src->aomFilmGrain;
3057
3.27k
    dst->bEnableSBRC = src->bEnableSBRC;
3058
3.27k
    dst->bConfigRCFrame = src->bConfigRCFrame;
3059
3.27k
    dst->isAbrLadderEnable = src->isAbrLadderEnable;
3060
3.27k
}
3061
3062
#ifdef SVT_HEVC
3063
3064
void svt_param_default(x265_param* param)
3065
{
3066
    EB_H265_ENC_CONFIGURATION* svtHevcParam = (EB_H265_ENC_CONFIGURATION*)param->svtHevcParam;
3067
3068
    // Channel info
3069
    svtHevcParam->channelId = 0;
3070
    svtHevcParam->activeChannelCount = 0;
3071
3072
    // GOP Structure
3073
    svtHevcParam->intraPeriodLength = -2;
3074
    svtHevcParam->intraRefreshType = 1;
3075
    svtHevcParam->predStructure = 2;
3076
    svtHevcParam->baseLayerSwitchMode = 0;
3077
    svtHevcParam->hierarchicalLevels = 3;
3078
    svtHevcParam->sourceWidth = 0;
3079
    svtHevcParam->sourceHeight = 0;
3080
    svtHevcParam->latencyMode = 0;
3081
3082
    //Preset & Tune
3083
    svtHevcParam->encMode = 7;
3084
    svtHevcParam->tune = 1;
3085
3086
    // Interlaced Video 
3087
    svtHevcParam->interlacedVideo = 0;
3088
3089
    // Quantization
3090
    svtHevcParam->qp = 32;
3091
    svtHevcParam->useQpFile = 0;
3092
3093
    // Deblock Filter
3094
    svtHevcParam->disableDlfFlag = 0;
3095
3096
    // SAO
3097
    svtHevcParam->enableSaoFlag = 1;
3098
3099
    // ME Tools
3100
    svtHevcParam->useDefaultMeHme = 1;
3101
    svtHevcParam->enableHmeFlag = 1;
3102
3103
    // ME Parameters
3104
    svtHevcParam->searchAreaWidth = 16;
3105
    svtHevcParam->searchAreaHeight = 7;
3106
3107
    // MD Parameters
3108
    svtHevcParam->constrainedIntra = 0;
3109
3110
    // Rate Control
3111
    svtHevcParam->frameRate = 60;
3112
    svtHevcParam->frameRateNumerator = 0;
3113
    svtHevcParam->frameRateDenominator = 0;
3114
    svtHevcParam->encoderBitDepth = 8;
3115
    svtHevcParam->encoderColorFormat = EB_YUV420;
3116
    svtHevcParam->compressedTenBitFormat = 0;
3117
    svtHevcParam->rateControlMode = 0;
3118
    svtHevcParam->sceneChangeDetection = 1;
3119
    svtHevcParam->lookAheadDistance = (uint32_t)~0;
3120
    svtHevcParam->framesToBeEncoded = 0;
3121
    svtHevcParam->targetBitRate = 7000000;
3122
    svtHevcParam->maxQpAllowed = 48;
3123
    svtHevcParam->minQpAllowed = 10;
3124
    svtHevcParam->bitRateReduction = 0;
3125
3126
    // Thresholds
3127
    svtHevcParam->improveSharpness = 0;
3128
    svtHevcParam->videoUsabilityInfo = 0;
3129
    svtHevcParam->highDynamicRangeInput = 0;
3130
    svtHevcParam->accessUnitDelimiter = 0;
3131
    svtHevcParam->bufferingPeriodSEI = 0;
3132
    svtHevcParam->pictureTimingSEI = 0;
3133
    svtHevcParam->registeredUserDataSeiFlag = 0;
3134
    svtHevcParam->unregisteredUserDataSeiFlag = 0;
3135
    svtHevcParam->recoveryPointSeiFlag = 0;
3136
    svtHevcParam->enableTemporalId = 1;
3137
    svtHevcParam->profile = 1;
3138
    svtHevcParam->tier = 0;
3139
    svtHevcParam->level = 0;
3140
3141
    svtHevcParam->injectorFrameRate = 60 << 16;
3142
    svtHevcParam->speedControlFlag = 0;
3143
3144
    // ASM Type
3145
    svtHevcParam->asmType = 1;
3146
3147
    svtHevcParam->codeVpsSpsPps = 1;
3148
    svtHevcParam->codeEosNal = 0;
3149
    svtHevcParam->reconEnabled = 0;
3150
    svtHevcParam->maxCLL = 0;
3151
    svtHevcParam->maxFALL = 0;
3152
    svtHevcParam->useMasteringDisplayColorVolume = 0;
3153
    svtHevcParam->useNaluFile = 0;
3154
    svtHevcParam->whitePointX = 0;
3155
    svtHevcParam->whitePointY = 0;
3156
    svtHevcParam->maxDisplayMasteringLuminance = 0;
3157
    svtHevcParam->minDisplayMasteringLuminance = 0;
3158
    svtHevcParam->dolbyVisionProfile = 0;
3159
    svtHevcParam->targetSocket = -1;
3160
    svtHevcParam->logicalProcessors = 0;
3161
    svtHevcParam->switchThreadsToRtPriority = 1;
3162
    svtHevcParam->fpsInVps = 0;
3163
3164
    svtHevcParam->tileColumnCount = 1;
3165
    svtHevcParam->tileRowCount = 1;
3166
    svtHevcParam->tileSliceMode = 0;
3167
    svtHevcParam->unrestrictedMotionVector = 1;
3168
    svtHevcParam->threadCount = 0;
3169
3170
    // vbv
3171
    svtHevcParam->hrdFlag = 0;
3172
    svtHevcParam->vbvMaxrate = 0;
3173
    svtHevcParam->vbvBufsize = 0;
3174
    svtHevcParam->vbvBufInit = 90;
3175
}
3176
3177
int svt_set_preset(x265_param* param, const char* preset)
3178
{
3179
    EB_H265_ENC_CONFIGURATION* svtHevcParam = (EB_H265_ENC_CONFIGURATION*)param->svtHevcParam;
3180
    
3181
    if (preset)
3182
    {
3183
        if (!strcmp(preset, "ultrafast")) svtHevcParam->encMode = 11;
3184
        else if (!strcmp(preset, "superfast")) svtHevcParam->encMode = 10;
3185
        else if (!strcmp(preset, "veryfast")) svtHevcParam->encMode = 9;
3186
        else if (!strcmp(preset, "faster")) svtHevcParam->encMode = 8;
3187
        else if (!strcmp(preset, "fast")) svtHevcParam->encMode = 7;
3188
        else if (!strcmp(preset, "medium")) svtHevcParam->encMode = 6;
3189
        else if (!strcmp(preset, "slow")) svtHevcParam->encMode = 5;
3190
        else if (!strcmp(preset, "slower")) svtHevcParam->encMode =4;
3191
        else if (!strcmp(preset, "veryslow")) svtHevcParam->encMode = 3;
3192
        else if (!strcmp(preset, "placebo")) svtHevcParam->encMode = 2;
3193
        else  return -1;
3194
    }
3195
    return 0;
3196
}
3197
3198
int svt_param_parse(x265_param* param, const char* name, const char* value)
3199
{
3200
    bool bError = false;
3201
#define OPT(STR) else if (!strcmp(name, STR))
3202
3203
    EB_H265_ENC_CONFIGURATION* svtHevcParam = (EB_H265_ENC_CONFIGURATION*)param->svtHevcParam;
3204
    if (0);
3205
    OPT("input-res")  bError |= sscanf(value, "%dx%d", &svtHevcParam->sourceWidth, &svtHevcParam->sourceHeight) != 2;
3206
    OPT("input-depth") svtHevcParam->encoderBitDepth = atoi(value);
3207
    OPT("total-frames") svtHevcParam->framesToBeEncoded = atoi(value);
3208
    OPT("frames") svtHevcParam->framesToBeEncoded = atoi(value);
3209
    OPT("fps")
3210
    {
3211
        if (sscanf(value, "%u/%u", &svtHevcParam->frameRateNumerator, &svtHevcParam->frameRateDenominator) == 2)
3212
            ;
3213
        else
3214
        {
3215
            int fps = atoi(value);
3216
            svtHevcParam->frameRateDenominator = 1;
3217
3218
            if (fps < 1000)
3219
                svtHevcParam->frameRate = fps << 16;
3220
            else
3221
                svtHevcParam->frameRate = fps;
3222
        }
3223
    }
3224
    OPT2("level-idc", "level")
3225
    {
3226
        /* allow "5.1" or "51", both converted to integer 51 */
3227
        /* if level-idc specifies an obviously wrong value in either float or int,
3228
        throw error consistently. Stronger level checking will be done in encoder_open() */
3229
        if (atof(value) < 10)
3230
            svtHevcParam->level = (int)(10 * atof(value) + .5);
3231
        else if (atoi(value) < 100)
3232
            svtHevcParam->level = atoi(value);
3233
        else
3234
            bError = true;
3235
    }
3236
    OPT2("pools", "numa-pools")
3237
    {
3238
        char *pools = strdup(value);
3239
        char *temp1, *temp2;
3240
        int count = 0;
3241
3242
        for (temp1 = strstr(pools, ","); temp1 != NULL; temp1 = strstr(temp2, ","))
3243
        {
3244
            temp2 = ++temp1;
3245
            count++;
3246
        }
3247
3248
        if (count > 1)
3249
            x265_log(param, X265_LOG_WARNING, "SVT-HEVC Encoder supports pools option only upto 2 sockets \n");
3250
        else if (count == 1)
3251
        {
3252
            temp1 = strtok(pools, ",");
3253
            temp2 = strtok(NULL, ",");
3254
3255
            if (!strcmp(temp1, "+"))
3256
            {
3257
                if (!strcmp(temp2, "+")) svtHevcParam->targetSocket = -1;
3258
                else if (!strcmp(temp2, "-")) svtHevcParam->targetSocket = 0;
3259
                else svtHevcParam->targetSocket = -1;
3260
            }
3261
            else if (!strcmp(temp1, "-"))
3262
            {
3263
                if (!strcmp(temp2, "+")) svtHevcParam->targetSocket = 1;
3264
                else if (!strcmp(temp2, "-")) x265_log(param, X265_LOG_ERROR, "Shouldn't exclude both sockets for pools option %s \n", pools);
3265
                else if (!strcmp(temp2, "*")) svtHevcParam->targetSocket = 1;
3266
                else
3267
                {
3268
                    svtHevcParam->targetSocket = 1;
3269
                    svtHevcParam->logicalProcessors = atoi(temp2);
3270
                }
3271
            }
3272
            else svtHevcParam->targetSocket = -1;
3273
        }
3274
        else
3275
        {
3276
            if (!strcmp(temp1, "*")) svtHevcParam->targetSocket = -1;
3277
            else
3278
            {
3279
                svtHevcParam->targetSocket = 0;
3280
                svtHevcParam->logicalProcessors = atoi(temp1);
3281
            }
3282
        }
3283
        free(pools);
3284
    }
3285
    OPT("high-tier") svtHevcParam->tier = x265_atobool(value, bError);
3286
    OPT("qpmin") svtHevcParam->minQpAllowed = atoi(value);
3287
    OPT("qpmax") svtHevcParam->maxQpAllowed = atoi(value);
3288
    OPT("rc-lookahead") svtHevcParam->lookAheadDistance = atoi(value);
3289
    OPT("scenecut")
3290
    {
3291
        svtHevcParam->sceneChangeDetection = x265_atobool(value, bError);
3292
        if (bError || svtHevcParam->sceneChangeDetection)
3293
        {
3294
            bError = false;
3295
            svtHevcParam->sceneChangeDetection = 1;
3296
        }
3297
    }
3298
    OPT("open-gop")
3299
    {
3300
        if (x265_atobool(value, bError))
3301
            svtHevcParam->intraRefreshType = 1;
3302
        else
3303
            svtHevcParam->intraRefreshType = 2;
3304
    }
3305
    OPT("deblock")
3306
    {
3307
        if (strtol(value, NULL, 0))
3308
            svtHevcParam->disableDlfFlag = 0;
3309
        else if (x265_atobool(value, bError) == 0 && !bError)
3310
            svtHevcParam->disableDlfFlag = 1;
3311
    }
3312
    OPT("sao") svtHevcParam->enableSaoFlag = (uint8_t)x265_atobool(value, bError);
3313
    OPT("keyint") svtHevcParam->intraPeriodLength = atoi(value);
3314
    OPT2("constrained-intra", "cip") svtHevcParam->constrainedIntra = (uint8_t)x265_atobool(value, bError);
3315
    OPT("vui-timing-info") svtHevcParam->videoUsabilityInfo = x265_atobool(value, bError);
3316
    OPT("hdr") svtHevcParam->highDynamicRangeInput = x265_atobool(value, bError);
3317
    OPT("aud") svtHevcParam->accessUnitDelimiter = x265_atobool(value, bError);
3318
    OPT("qp")
3319
    {
3320
        svtHevcParam->rateControlMode = 0;
3321
        svtHevcParam->qp = atoi(value);
3322
    }
3323
    OPT("bitrate")
3324
    {
3325
        svtHevcParam->rateControlMode = 1;
3326
        svtHevcParam->targetBitRate = atoi(value);
3327
    }
3328
    OPT("interlace")
3329
    {
3330
        svtHevcParam->interlacedVideo = (uint8_t)x265_atobool(value, bError);
3331
        if (bError || svtHevcParam->interlacedVideo)
3332
        {
3333
            bError = false;
3334
            svtHevcParam->interlacedVideo = 1;
3335
        }
3336
    }
3337
    OPT("svt-hme")
3338
    {
3339
        svtHevcParam->enableHmeFlag = (uint8_t)x265_atobool(value, bError);
3340
        if (svtHevcParam->enableHmeFlag) svtHevcParam->useDefaultMeHme = 1;
3341
    }
3342
    OPT("svt-search-width") svtHevcParam->searchAreaWidth = atoi(value);
3343
    OPT("svt-search-height") svtHevcParam->searchAreaHeight = atoi(value);
3344
    OPT("svt-compressed-ten-bit-format") svtHevcParam->compressedTenBitFormat = x265_atobool(value, bError);
3345
    OPT("svt-speed-control") svtHevcParam->speedControlFlag = x265_atobool(value, bError);
3346
    OPT("svt-preset-tuner")
3347
    {
3348
        if (svtHevcParam->encMode == 2)
3349
        {
3350
            if (!strcmp(value, "0")) svtHevcParam->encMode = 0;
3351
            else if (!strcmp(value, "1")) svtHevcParam->encMode = 1;
3352
            else
3353
            {
3354
                x265_log(param, X265_LOG_ERROR, " Unsupported value=%s for svt-preset-tuner \n", value);
3355
                bError = true;
3356
            }
3357
        }
3358
        else
3359
            x265_log(param, X265_LOG_WARNING, " svt-preset-tuner should be used only with ultrafast preset; Ignoring it \n");
3360
    }
3361
    OPT("svt-hierarchical-level") svtHevcParam->hierarchicalLevels = atoi(value);
3362
    OPT("svt-base-layer-switch-mode") svtHevcParam->baseLayerSwitchMode = atoi(value);
3363
    OPT("svt-pred-struct") svtHevcParam->predStructure = (uint8_t)atoi(value);
3364
    OPT("svt-fps-in-vps") svtHevcParam->fpsInVps = (uint8_t)x265_atobool(value, bError);
3365
    OPT("master-display") svtHevcParam->useMasteringDisplayColorVolume = (uint8_t)atoi(value);
3366
    OPT("max-cll") bError |= sscanf(value, "%hu,%hu", &svtHevcParam->maxCLL, &svtHevcParam->maxFALL) != 2;
3367
    OPT("nalu-file") svtHevcParam->useNaluFile = (uint8_t)atoi(value);
3368
    OPT("dolby-vision-profile")
3369
    {
3370
        if (atof(value) < 10)
3371
            svtHevcParam->dolbyVisionProfile = (int)(10 * atof(value) + .5);
3372
        else if (atoi(value) < 100)
3373
            svtHevcParam->dolbyVisionProfile = atoi(value);
3374
        else
3375
            bError = true;
3376
    }
3377
    OPT("hrd")
3378
        svtHevcParam->hrdFlag = (uint32_t)x265_atobool(value, bError);
3379
    OPT("vbv-maxrate")
3380
        svtHevcParam->vbvMaxrate = (uint32_t)x265_atoi(value, bError);
3381
    OPT("vbv-bufsize")
3382
        svtHevcParam->vbvBufsize = (uint32_t)x265_atoi(value, bError);
3383
    OPT("vbv-init")
3384
        svtHevcParam->vbvBufInit = (uint64_t)x265_atof(value, bError);
3385
    OPT("frame-threads")
3386
        svtHevcParam->threadCount = (uint32_t)x265_atoi(value, bError);
3387
    else
3388
        x265_log(param, X265_LOG_INFO, "SVT doesn't support %s param; Disabling it \n", name);
3389
3390
3391
    return bError ? X265_PARAM_BAD_VALUE : 0;
3392
}
3393
3394
#endif //ifdef SVT_HEVC
3395
3396
}