x264.c 81 KB
Newer Older
Laurent Aimar's avatar
Laurent Aimar committed
1
/*****************************************************************************
Fiona Glaser's avatar
Fiona Glaser committed
2
 * x264: top-level x264cli functions
Laurent Aimar's avatar
Laurent Aimar committed
3
 *****************************************************************************
Sean McGovern's avatar
Sean McGovern committed
4
 * Copyright (C) 2003-2011 x264 project
Laurent Aimar's avatar
Laurent Aimar committed
5
 *
6
7
 * Authors: Loren Merritt <lorenm@u.washington.edu>
 *          Laurent Aimar <fenrir@via.ecp.fr>
8
 *          Steven Walters <kemuri9@gmail.com>
Fiona Glaser's avatar
Fiona Glaser committed
9
 *          Fiona Glaser <fiona@x264.com>
10
 *          Kieran Kunhya <kieran@kunhya.com>
Laurent Aimar's avatar
Laurent Aimar committed
11
12
13
14
15
16
17
18
19
20
21
22
23
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
24
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
Fiona Glaser's avatar
Fiona Glaser committed
25
26
27
 *
 * This program is also available under a commercial proprietary license.
 * For more information, contact us at licensing@x264.com.
Laurent Aimar's avatar
Laurent Aimar committed
28
29
30
31
32
 *****************************************************************************/

#include <signal.h>
#define _GNU_SOURCE
#include <getopt.h>
33
#include "common/common.h"
34
35
36
#include "x264cli.h"
#include "input/input.h"
#include "output/output.h"
37
#include "filters/filters.h"
38
39

#define FAIL_IF_ERROR( cond, ... ) FAIL_IF_ERR( cond, "x264", __VA_ARGS__ )
Loren Merritt's avatar
Loren Merritt committed
40

41
42
43
#ifdef _WIN32
#include <windows.h>
#else
44
#define GetConsoleTitle(t,n)
45
46
47
#define SetConsoleTitle(t)
#endif

48
#if HAVE_LAVF
49
50
#undef DECLARE_ALIGNED
#include <libavformat/avformat.h>
51
52
53
54
#include <libavutil/pixfmt.h>
#include <libavutil/pixdesc.h>
#endif

55
#if HAVE_SWSCALE
56
#undef DECLARE_ALIGNED
57
58
59
60
61
62
63
#include <libswscale/swscale.h>
#endif

#if HAVE_FFMS
#include <ffms.h>
#endif

Laurent Aimar's avatar
Laurent Aimar committed
64
/* Ctrl-C handler */
65
66
static volatile int b_ctrl_c = 0;
static int          b_exit_on_ctrl_c = 0;
Anton Mitrofanov's avatar
Anton Mitrofanov committed
67
static void sigint_handler( int a )
Laurent Aimar's avatar
Laurent Aimar committed
68
{
Loren Merritt's avatar
Loren Merritt committed
69
70
71
    if( b_exit_on_ctrl_c )
        exit(0);
    b_ctrl_c = 1;
Laurent Aimar's avatar
Laurent Aimar committed
72
73
}

74
75
static char UNUSED originalCTitle[200] = "";

Loren Merritt's avatar
Loren Merritt committed
76
77
78
79
80
typedef struct {
    int b_progress;
    int i_seek;
    hnd_t hin;
    hnd_t hout;
81
    FILE *qpfile;
Yusuke Nakamura's avatar
Yusuke Nakamura committed
82
83
    FILE *tcfile_out;
    double timebase_convert_multiplier;
84
    int i_pulldown;
Loren Merritt's avatar
Loren Merritt committed
85
86
} cli_opt_t;

87
/* file i/o operation structs */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
88
89
cli_input_t cli_input;
static cli_output_t cli_output;
Loren Merritt's avatar
Loren Merritt committed
90

91
92
93
/* video filter operation struct */
static cli_vid_filter_t filter;

94
95
96
static const char * const demuxer_names[] =
{
    "auto",
97
    "raw",
98
    "y4m",
Steven Walters's avatar
Steven Walters committed
99
#if HAVE_AVS
100
101
    "avs",
#endif
Steven Walters's avatar
Steven Walters committed
102
#if HAVE_LAVF
103
104
    "lavf",
#endif
Steven Walters's avatar
Steven Walters committed
105
#if HAVE_FFMS
106
107
108
109
110
111
112
113
114
115
116
    "ffms",
#endif
    0
};

static const char * const muxer_names[] =
{
    "auto",
    "raw",
    "mkv",
    "flv",
Steven Walters's avatar
Steven Walters committed
117
#if HAVE_GPAC
118
119
120
121
    "mp4",
#endif
    0
};
122

123
static const char * const pulldown_names[] = { "none", "22", "32", "64", "double", "triple", "euro", 0 };
124
static const char * const log_level_names[] = { "none", "error", "warning", "info", "debug", 0 };
125
126
127
128
129
130
131
132
133
134
135
136
137
static const char * const output_csp_names[] =
{
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I420
    "i420",
#endif
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I422
    "i422",
#endif
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I444
    "i444", "rgb",
#endif
    0
};
138

139
140
static const char * const range_names[] = { "auto", "tv", "pc", 0 };

141
142
typedef struct
{
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
    int mod;
    uint8_t pattern[24];
    float fps_factor;
} cli_pulldown_t;

enum pulldown_type_e
{
    X264_PULLDOWN_22 = 1,
    X264_PULLDOWN_32,
    X264_PULLDOWN_64,
    X264_PULLDOWN_DOUBLE,
    X264_PULLDOWN_TRIPLE,
    X264_PULLDOWN_EURO
};

#define TB  PIC_STRUCT_TOP_BOTTOM
#define BT  PIC_STRUCT_BOTTOM_TOP
#define TBT PIC_STRUCT_TOP_BOTTOM_TOP
#define BTB PIC_STRUCT_BOTTOM_TOP_BOTTOM

static const cli_pulldown_t pulldown_values[] =
{
Kieran Kunhya's avatar
Kieran Kunhya committed
165
    [X264_PULLDOWN_22]     = {1,  {TB},                                   1.0},
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    [X264_PULLDOWN_32]     = {4,  {TBT, BT, BTB, TB},                     1.25},
    [X264_PULLDOWN_64]     = {2,  {PIC_STRUCT_DOUBLE, PIC_STRUCT_TRIPLE}, 1.0},
    [X264_PULLDOWN_DOUBLE] = {1,  {PIC_STRUCT_DOUBLE},                    2.0},
    [X264_PULLDOWN_TRIPLE] = {1,  {PIC_STRUCT_TRIPLE},                    3.0},
    [X264_PULLDOWN_EURO]   = {24, {TBT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT, BT,
                                   BTB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB, TB}, 25.0/24.0}
};

#undef TB
#undef BT
#undef TBT
#undef BTB

// indexed by pic_struct enum
static const float pulldown_frame_duration[10] = { 0.0, 1, 0.5, 0.5, 1, 1, 1.5, 1.5, 2, 3 };

Anton Mitrofanov's avatar
Anton Mitrofanov committed
182
183
184
static void help( x264_param_t *defaults, int longhelp );
static int  parse( int argc, char **argv, x264_param_t *param, cli_opt_t *opt );
static int  encode( x264_param_t *param, cli_opt_t *opt );
Laurent Aimar's avatar
Laurent Aimar committed
185

186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/* logging and printing for within the cli system */
static int cli_log_level;
void x264_cli_log( const char *name, int i_level, const char *fmt, ... )
{
    if( i_level > cli_log_level )
        return;
    char *s_level;
    switch( i_level )
    {
        case X264_LOG_ERROR:
            s_level = "error";
            break;
        case X264_LOG_WARNING:
            s_level = "warning";
            break;
        case X264_LOG_INFO:
            s_level = "info";
            break;
        case X264_LOG_DEBUG:
            s_level = "debug";
            break;
        default:
            s_level = "unknown";
            break;
    }
    fprintf( stderr, "%s [%s]: ", name, s_level );
    va_list arg;
    va_start( arg, fmt );
    vfprintf( stderr, fmt, arg );
    va_end( arg );
}

void x264_cli_printf( int i_level, const char *fmt, ... )
{
    if( i_level > cli_log_level )
        return;
    va_list arg;
    va_start( arg, fmt );
    vfprintf( stderr, fmt, arg );
    va_end( arg );
}

228
229
230
231
232
233
static void print_version_info()
{
#ifdef X264_POINTVER
    printf( "x264 "X264_POINTVER"\n" );
#else
    printf( "x264 0.%d.X\n", X264_BUILD );
234
235
236
237
238
239
240
241
242
#endif
#if HAVE_SWSCALE
    printf( "(libswscale %d.%d.%d)\n", LIBSWSCALE_VERSION_MAJOR, LIBSWSCALE_VERSION_MINOR, LIBSWSCALE_VERSION_MICRO );
#endif
#if HAVE_LAVF
    printf( "(libavformat %d.%d.%d)\n", LIBAVFORMAT_VERSION_MAJOR, LIBAVFORMAT_VERSION_MINOR, LIBAVFORMAT_VERSION_MICRO );
#endif
#if HAVE_FFMS
    printf( "(ffmpegsource %d.%d.%d.%d)\n", FFMS_VERSION >> 24, (FFMS_VERSION & 0xff0000) >> 16, (FFMS_VERSION & 0xff00) >> 8, FFMS_VERSION & 0xff );
243
244
#endif
    printf( "built on " __DATE__ ", " );
Steven Walters's avatar
Steven Walters committed
245
246
247
#ifdef __INTEL_COMPILER
    printf( "intel: %.2f (%d)\n", __INTEL_COMPILER / 100.f, __INTEL_COMPILER_BUILD_DATE );
#elif defined(__GNUC__)
248
249
    printf( "gcc: " __VERSION__ "\n" );
#else
Steven Walters's avatar
Steven Walters committed
250
    printf( "using an unknown compiler\n" );
251
#endif
252
    printf( "configuration: --bit-depth=%d --chroma-format=%s\n", x264_bit_depth, X264_CHROMA_FORMAT ? (output_csp_names[0]+1) : "all" );
253
254
255
256
257
258
    printf( "x264 license: " );
#if HAVE_GPL
    printf( "GPL version 2 or later\n" );
#else
    printf( "Non-GPL commercial\n" );
#endif
259
260
261
#if HAVE_SWSCALE
    const char *license = swscale_license();
    printf( "libswscale%s%s license: %s\n", HAVE_LAVF ? "/libavformat" : "", HAVE_FFMS ? "/ffmpegsource" : "" , license );
262
263
264
265
266
267
268
    if( !strcmp( license, "nonfree and unredistributable" ) ||
       (!HAVE_GPL && (!strcmp( license, "GPL version 2 or later" )
                  ||  !strcmp( license, "GPL version 3 or later" ))))
        printf( "WARNING: This binary is unredistributable!\n" );
#endif
}

Laurent Aimar's avatar
Laurent Aimar committed
269
270
271
int main( int argc, char **argv )
{
    x264_param_t param;
272
273
    cli_opt_t opt = {0};
    int ret = 0;
274

275
    FAIL_IF_ERROR( x264_threading_init(), "unable to initialize threading\n" )
Laurent Aimar's avatar
Laurent Aimar committed
276

277
#ifdef _WIN32
Loren Merritt's avatar
Loren Merritt committed
278
    _setmode(_fileno(stdin), _O_BINARY);
Laurent Aimar's avatar
Laurent Aimar committed
279
280
281
    _setmode(_fileno(stdout), _O_BINARY);
#endif

282
283
    GetConsoleTitle( originalCTitle, sizeof(originalCTitle) );

Laurent Aimar's avatar
Laurent Aimar committed
284
    /* Parse command line */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
285
    if( parse( argc, argv, &param, &opt ) < 0 )
286
        ret = -1;
Laurent Aimar's avatar
Laurent Aimar committed
287

288
289
290
    /* Restore title; it can be changed by input modules */
    SetConsoleTitle( originalCTitle );

Laurent Aimar's avatar
Laurent Aimar committed
291
    /* Control-C handler */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
292
    signal( SIGINT, sigint_handler );
Laurent Aimar's avatar
Laurent Aimar committed
293

294
295
296
297
298
299
300
    if( !ret )
        ret = encode( &param, &opt );

    /* clean up handles */
    if( filter.free )
        filter.free( opt.hin );
    else if( opt.hin )
Anton Mitrofanov's avatar
Anton Mitrofanov committed
301
        cli_input.close_file( opt.hin );
302
    if( opt.hout )
Anton Mitrofanov's avatar
Anton Mitrofanov committed
303
        cli_output.close_file( opt.hout, 0, 0 );
304
305
306
307
    if( opt.tcfile_out )
        fclose( opt.tcfile_out );
    if( opt.qpfile )
        fclose( opt.qpfile );
308

309
310
    SetConsoleTitle( originalCTitle );

311
    return ret;
Laurent Aimar's avatar
Laurent Aimar committed
312
313
}

314
static char const *strtable_lookup( const char * const table[], int idx )
315
316
{
    int i = 0; while( table[i] ) i++;
317
    return ( ( idx >= 0 && idx < i ) ? table[ idx ] : "???" );
318
319
}

320
321
322
323
324
325
326
327
328
329
330
331
332
static char *stringify_names( char *buf, const char * const names[] )
{
    int i = 0;
    char *p = buf;
    for( p[0] = 0; names[i]; i++ )
    {
        p += sprintf( p, "%s", names[i] );
        if( names[i+1] )
            p += sprintf( p, ", " );
    }
    return buf;
}

333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
static void print_csp_names( int longhelp )
{
    if( longhelp < 2 )
        return;
#   define INDENT "                                "
    printf( "                              - valid csps for `raw' demuxer:\n" );
    printf( INDENT );
    for( int i = X264_CSP_NONE+1; i < X264_CSP_CLI_MAX; i++ )
    {
        printf( "%s", x264_cli_csps[i].name );
        if( i+1 < X264_CSP_CLI_MAX )
            printf( ", " );
    }
#if HAVE_LAVF
    printf( "\n" );
    printf( "                              - valid csps for `lavf' demuxer:\n" );
    printf( INDENT );
350
    size_t line_len = strlen( INDENT );
351
352
353
    for( enum PixelFormat i = PIX_FMT_NONE+1; i < PIX_FMT_NB; i++ )
    {
        const char *pfname = av_pix_fmt_descriptors[i].name;
354
        size_t name_len = strlen( pfname );
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
        if( line_len + name_len > (80 - strlen( ", " )) )
        {
            printf( "\n" INDENT );
            line_len = strlen( INDENT );
        }
        printf( "%s", pfname );
        line_len += name_len;
        if( i+1 < PIX_FMT_NB )
        {
            printf( ", " );
            line_len += 2;
        }
    }
#endif
    printf( "\n" );
}

Anton Mitrofanov's avatar
Anton Mitrofanov committed
372
static void help( x264_param_t *defaults, int longhelp )
Laurent Aimar's avatar
Laurent Aimar committed
373
{
374
    char buf[50];
375
#define H0 printf
Fiona Glaser's avatar
Fiona Glaser committed
376
377
#define H1 if(longhelp>=1) printf
#define H2 if(longhelp==2) printf
378
    H0( "x264 core:%d%s\n"
379
        "Syntax: x264 [options] -o outfile infile\n"
380
        "\n"
381
382
        "Infile can be raw (in which case resolution is required),\n"
        "  or YUV4MPEG (*.y4m),\n"
383
        "  or Avisynth if compiled with support (%s).\n"
384
        "  or libav* formats if compiled with lavf support (%s) or ffms support (%s).\n"
385
386
387
        "Outfile type is selected by filename:\n"
        " .264 -> Raw bytestream\n"
        " .mkv -> Matroska\n"
Kieran Kunhya's avatar
Kieran Kunhya committed
388
        " .flv -> Flash Video\n"
389
        " .mp4 -> MP4 if compiled with GPAC support (%s)\n"
390
        "Output bit depth: %d (configured at compile time)\n"
391
392
393
        "\n"
        "Options:\n"
        "\n"
Fiona Glaser's avatar
Fiona Glaser committed
394
395
396
        "  -h, --help                  List basic options\n"
        "      --longhelp              List more options\n"
        "      --fullhelp              List all options\n"
397
398
        "\n",
        X264_BUILD, X264_VERSION,
Steven Walters's avatar
Steven Walters committed
399
#if HAVE_AVS
400
401
402
403
        "yes",
#else
        "no",
#endif
Steven Walters's avatar
Steven Walters committed
404
#if HAVE_LAVF
405
406
407
408
        "yes",
#else
        "no",
#endif
Steven Walters's avatar
Steven Walters committed
409
#if HAVE_FFMS
410
        "yes",
Loren Merritt's avatar
Loren Merritt committed
411
#else
412
        "no",
Loren Merritt's avatar
Loren Merritt committed
413
#endif
Steven Walters's avatar
Steven Walters committed
414
#if HAVE_GPAC
415
        "yes",
Loren Merritt's avatar
Loren Merritt committed
416
#else
417
        "no",
Loren Merritt's avatar
Loren Merritt committed
418
#endif
419
        x264_bit_depth
420
      );
Fiona Glaser's avatar
Fiona Glaser committed
421
422
423
    H0( "Example usage:\n" );
    H0( "\n" );
    H0( "      Constant quality mode:\n" );
424
    H0( "            x264 --crf 24 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
425
426
    H0( "\n" );
    H0( "      Two-pass with a bitrate of 1000kbps:\n" );
427
428
    H0( "            x264 --pass 1 --bitrate 1000 -o <output> <input>\n" );
    H0( "            x264 --pass 2 --bitrate 1000 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
429
430
    H0( "\n" );
    H0( "      Lossless:\n" );
Fiona Glaser's avatar
Fiona Glaser committed
431
    H0( "            x264 --qp 0 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
432
433
    H0( "\n" );
    H0( "      Maximum PSNR at the cost of speed and visual quality:\n" );
434
    H0( "            x264 --preset placebo --tune psnr -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
435
436
    H0( "\n" );
    H0( "      Constant bitrate at 1000kbps with a 2 second-buffer:\n");
437
    H0( "            x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
438
    H0( "\n" );
439
440
    H0( "Presets:\n" );
    H0( "\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
441
    H0( "      --profile <string>      Force the limits of an H.264 profile\n"
442
        "                                  Overrides all settings.\n" );
Harfe Leier's avatar
Harfe Leier committed
443
    H2(
444
#if X264_CHROMA_FORMAT <= X264_CSP_I420
Harfe Leier's avatar
Harfe Leier committed
445
446
#if BIT_DEPTH==8
        "                                  - baseline:\n"
447
        "                                    --no-8x8dct --bframes 0 --no-cabac\n"
448
449
450
        "                                    --cqm flat --weightp 0\n"
        "                                    No interlaced.\n"
        "                                    No lossless.\n"
451
        "                                  - main:\n"
452
453
        "                                    --no-8x8dct --cqm flat\n"
        "                                    No lossless.\n"
454
        "                                  - high:\n"
455
        "                                    No lossless.\n"
Harfe Leier's avatar
Harfe Leier committed
456
#endif
457
458
        "                                  - high10:\n"
        "                                    No lossless.\n"
Harfe Leier's avatar
Harfe Leier committed
459
        "                                    Support for bit depth 8-10.\n"
460
461
#endif
#if X264_CHROMA_FORMAT <= X264_CSP_I422
Harfe Leier's avatar
Harfe Leier committed
462
463
464
465
        "                                  - high422:\n"
        "                                    No lossless.\n"
        "                                    Support for bit depth 8-10.\n"
        "                                    Support for 4:2:0/4:2:2 chroma subsampling.\n"
466
#endif
Harfe Leier's avatar
Harfe Leier committed
467
468
469
470
        "                                  - high444:\n"
        "                                    Support for bit depth 8-10.\n"
        "                                    Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.\n" );
        else H0(
471
472
        "                                  - "
#if X264_CHROMA_FORMAT <= X264_CSP_I420
Harfe Leier's avatar
Harfe Leier committed
473
#if BIT_DEPTH==8
474
475
476
        "baseline,main,high,"
#endif
        "high10,"
Harfe Leier's avatar
Harfe Leier committed
477
#endif
478
479
480
481
#if X264_CHROMA_FORMAT <= X264_CSP_I422
        "high422,"
#endif
        "high444\n"
Harfe Leier's avatar
Harfe Leier committed
482
               );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
483
    H0( "      --preset <string>       Use a preset to select encoding settings [medium]\n"
484
        "                                  Overridden by user settings.\n" );
485
    H2( "                                  - ultrafast:\n"
486
        "                                    --no-8x8dct --aq-mode 0 --b-adapt 0\n"
487
488
        "                                    --bframes 0 --no-cabac --no-deblock\n"
        "                                    --no-mbtree --me dia --no-mixed-refs\n"
Fiona Glaser's avatar
Fiona Glaser committed
489
490
491
        "                                    --partitions none --rc-lookahead 0 --ref 1\n"
        "                                    --scenecut 0 --subme 0 --trellis 0\n"
        "                                    --no-weightb --weightp 0\n"
492
        "                                  - superfast:\n"
493
        "                                    --no-mbtree --me dia --no-mixed-refs\n"
Fiona Glaser's avatar
Fiona Glaser committed
494
        "                                    --partitions i8x8,i4x4 --rc-lookahead 0\n"
495
        "                                    --ref 1 --subme 1 --trellis 0 --weightp 1\n"
496
        "                                  - veryfast:\n"
Fiona Glaser's avatar
Fiona Glaser committed
497
        "                                    --no-mixed-refs --rc-lookahead 10\n"
498
        "                                    --ref 1 --subme 2 --trellis 0 --weightp 1\n"
499
        "                                  - faster:\n"
500
501
        "                                    --no-mixed-refs --rc-lookahead 20\n"
        "                                    --ref 2 --subme 4 --weightp 1\n"
502
        "                                  - fast:\n"
503
        "                                    --rc-lookahead 30 --ref 2 --subme 6\n"
504
        "                                    --weightp 1\n"
505
        "                                  - medium:\n"
506
        "                                    Default settings apply.\n"
507
        "                                  - slow:\n"
508
509
        "                                    --b-adapt 2 --direct auto --me umh\n"
        "                                    --rc-lookahead 50 --ref 5 --subme 8\n"
510
        "                                  - slower:\n"
511
512
513
        "                                    --b-adapt 2 --direct auto --me umh\n"
        "                                    --partitions all --rc-lookahead 60\n"
        "                                    --ref 8 --subme 9 --trellis 2\n"
514
        "                                  - veryslow:\n"
515
        "                                    --b-adapt 2 --bframes 8 --direct auto\n"
Fiona Glaser's avatar
Fiona Glaser committed
516
        "                                    --me umh --merange 24 --partitions all\n"
517
518
        "                                    --ref 16 --subme 10 --trellis 2\n"
        "                                    --rc-lookahead 60\n"
519
        "                                  - placebo:\n"
520
521
        "                                    --bframes 16 --b-adapt 2 --direct auto\n"
        "                                    --slow-firstpass --no-fast-pskip\n"
Fiona Glaser's avatar
Fiona Glaser committed
522
        "                                    --me tesa --merange 24 --partitions all\n"
523
        "                                    --rc-lookahead 60 --ref 16 --subme 11\n"
524
        "                                    --trellis 2\n" );
525
526
    else H0( "                                  - ultrafast,superfast,veryfast,faster,fast\n"
             "                                  - medium,slow,slower,veryslow,placebo\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
527
    H0( "      --tune <string>         Tune the settings for a particular type of source\n"
528
529
530
531
532
        "                              or situation\n"
        "                                  Overridden by user settings.\n"
        "                                  Multiple tunings are separated by commas.\n"
        "                                  Only one psy tuning can be used at a time.\n" );
    H2( "                                  - film (psy tuning):\n"
533
        "                                    --deblock -1:-1 --psy-rd <unset>:0.15\n"
534
        "                                  - animation (psy tuning):\n"
535
        "                                    --bframes {+2} --deblock 1:1\n"
536
        "                                    --psy-rd 0.4:<unset> --aq-strength 0.6\n"
537
        "                                    --ref {Double if >1 else 1}\n"
538
        "                                  - grain (psy tuning):\n"
539
        "                                    --aq-strength 0.5 --no-dct-decimate\n"
540
        "                                    --deadzone-inter 6 --deadzone-intra 6\n"
541
542
543
        "                                    --deblock -2:-2 --ipratio 1.1 \n"
        "                                    --pbratio 1.1 --psy-rd <unset>:0.25\n"
        "                                    --qcomp 0.8\n"
544
545
546
        "                                  - stillimage (psy tuning):\n"
        "                                    --aq-strength 1.2 --deblock -3:-3\n"
        "                                    --psy-rd 2.0:0.7\n"
547
        "                                  - psnr (psy tuning):\n"
548
        "                                    --aq-mode 0 --no-psy\n"
549
        "                                  - ssim (psy tuning):\n"
550
551
552
553
        "                                    --aq-mode 2 --no-psy\n"
        "                                  - fastdecode:\n"
        "                                    --no-cabac --no-deblock --no-weightb\n"
        "                                    --weightp 0\n"
554
        "                                  - zerolatency:\n"
Fiona Glaser's avatar
Fiona Glaser committed
555
556
557
        "                                    --bframes 0 --force-cfr --no-mbtree\n"
        "                                    --sync-lookahead 0 --sliced-threads\n"
        "                                    --rc-lookahead 0\n" );
558
559
    else H0( "                                  - psy tunings: film,animation,grain,\n"
             "                                                 stillimage,psnr,ssim\n"
560
             "                                  - other tunings: fastdecode,zerolatency\n" );
561
    H2( "      --slow-firstpass        Don't force these faster settings with --pass 1:\n"
562
563
564
        "                                  --no-8x8dct --me dia --partitions none\n"
        "                                  --ref 1 --subme {2 if >2 else unchanged}\n"
        "                                  --trellis 0 --fast-pskip\n" );
565
    else H1( "      --slow-firstpass        Don't force faster settings with --pass 1\n" );
566
    H0( "\n" );
567
568
    H0( "Frame-type options:\n" );
    H0( "\n" );
569
    H0( "  -I, --keyint <integer or \"infinite\"> Maximum GOP size [%d]\n", defaults->i_keyint_max );
Fiona Glaser's avatar
Fiona Glaser committed
570
    H2( "  -i, --min-keyint <integer>  Minimum GOP size [auto]\n" );
Fiona Glaser's avatar
Fiona Glaser committed
571
572
    H2( "      --no-scenecut           Disable adaptive I-frame decision\n" );
    H2( "      --scenecut <integer>    How aggressively to insert extra I-frames [%d]\n", defaults->i_scenecut_threshold );
Fiona Glaser's avatar
Fiona Glaser committed
573
    H2( "      --intra-refresh         Use Periodic Intra Refresh instead of IDR frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
574
    H1( "  -b, --bframes <integer>     Number of B-frames between I and P [%d]\n", defaults->i_bframe );
Fiona Glaser's avatar
Fiona Glaser committed
575
    H1( "      --b-adapt <integer>     Adaptive B-frame decision method [%d]\n"
576
577
578
579
        "                                  Higher values may lower threading efficiency.\n"
        "                                  - 0: Disabled\n"
        "                                  - 1: Fast\n"
        "                                  - 2: Optimal (slow with high --bframes)\n", defaults->i_bframe_adaptive );
Fiona Glaser's avatar
Fiona Glaser committed
580
    H2( "      --b-bias <integer>      Influences how often B-frames are used [%d]\n", defaults->i_bframe_bias );
Lamont Alston's avatar
Lamont Alston committed
581
582
    H1( "      --b-pyramid <string>    Keep some B-frames as references [%s]\n"
        "                                  - none: Disabled\n"
Fiona Glaser's avatar
Fiona Glaser committed
583
        "                                  - strict: Strictly hierarchical pyramid\n"
Lamont Alston's avatar
Lamont Alston committed
584
585
        "                                  - normal: Non-strict (not Blu-ray compatible)\n",
        strtable_lookup( x264_b_pyramid_names, defaults->i_bframe_pyramid ) );
586
    H1( "      --open-gop              Use recovery points to close GOPs\n"
Lamont Alston's avatar
Lamont Alston committed
587
        "                              Only available with b-frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
588
589
    H1( "      --no-cabac              Disable CABAC\n" );
    H1( "  -r, --ref <integer>         Number of reference frames [%d]\n", defaults->i_frame_reference );
590
    H1( "      --no-deblock            Disable loop filter\n" );
Fiona Glaser's avatar
Fiona Glaser committed
591
    H1( "  -f, --deblock <alpha:beta>  Loop filter parameters [%d:%d]\n",
592
                                       defaults->i_deblocking_filter_alphac0, defaults->i_deblocking_filter_beta );
Fiona Glaser's avatar
Fiona Glaser committed
593
    H2( "      --slices <integer>      Number of slices per frame; forces rectangular\n"
Fiona Glaser's avatar
Fiona Glaser committed
594
        "                              slices and is overridden by other slicing options\n" );
Fiona Glaser's avatar
Fiona Glaser committed
595
596
597
    else H1( "      --slices <integer>      Number of slices per frame\n" );
    H2( "      --slice-max-size <integer> Limit the size of each slice in bytes\n");
    H2( "      --slice-max-mbs <integer> Limit the size of each slice in macroblocks\n");
598
599
    H0( "      --tff                   Enable interlaced mode (top field first)\n" );
    H0( "      --bff                   Enable interlaced mode (bottom field first)\n" );
600
    H2( "      --constrained-intra     Enable constrained intra prediction.\n" );
Kieran Kunhya's avatar
Kieran Kunhya committed
601
602
603
604
605
    H0( "      --pulldown <string>     Use soft pulldown to change frame rate\n"
        "                                  - none, 22, 32, 64, double, triple, euro (requires cfr input)\n" );
    H2( "      --fake-interlaced       Flag stream as interlaced but encode progressive.\n"
        "                              Makes it possible to encode 25p and 30p Blu-Ray\n"
        "                              streams. Ignored in interlaced mode.\n" );
606
607
608
609
610
611
612
    H2( "      --frame-packing <integer> For stereoscopic videos define frame arrangement\n"
        "                                  - 0: checkerboard - pixels are alternatively from L and R\n"
        "                                  - 1: column alternation - L and R are interlaced by column\n"
        "                                  - 2: row alternation - L and R are interlaced by row\n"
        "                                  - 3: side by side - L is on the left, R on the right\n"
        "                                  - 4: top bottom - L is on top, R on bottom\n"
        "                                  - 5: frame alternation - one view per frame\n" );
613
614
615
    H0( "\n" );
    H0( "Ratecontrol:\n" );
    H0( "\n" );
616
    H1( "  -q, --qp <integer>          Force constant QP (0-%d, 0=lossless)\n", QP_MAX );
617
    H0( "  -B, --bitrate <integer>     Set bitrate (kbit/s)\n" );
618
    H0( "      --crf <float>           Quality-based VBR (%d-51) [%.1f]\n", 51 - QP_MAX_SPEC, defaults->rc.f_rf_constant );
Fiona Glaser's avatar
Fiona Glaser committed
619
    H1( "      --rc-lookahead <integer> Number of frames for frametype lookahead [%d]\n", defaults->rc.i_lookahead );
620
621
    H0( "      --vbv-maxrate <integer> Max local bitrate (kbit/s) [%d]\n", defaults->rc.i_vbv_max_bitrate );
    H0( "      --vbv-bufsize <integer> Set size of the VBV buffer (kbit) [%d]\n", defaults->rc.i_vbv_buffer_size );
Fiona Glaser's avatar
Fiona Glaser committed
622
    H2( "      --vbv-init <float>      Initial VBV buffer occupancy [%.1f]\n", defaults->rc.f_vbv_buffer_init );
Fiona Glaser's avatar
Fiona Glaser committed
623
624
    H2( "      --crf-max <float>       With CRF+VBV, limit RF to this value\n"
        "                                  May cause VBV underflows!\n" );
Fiona Glaser's avatar
Fiona Glaser committed
625
626
627
    H2( "      --qpmin <integer>       Set min QP [%d]\n", defaults->rc.i_qp_min );
    H2( "      --qpmax <integer>       Set max QP [%d]\n", defaults->rc.i_qp_max );
    H2( "      --qpstep <integer>      Set max QP step [%d]\n", defaults->rc.i_qp_step );
628
    H2( "      --ratetol <float>       Tolerance of ABR ratecontrol and VBV [%.1f]\n", defaults->rc.f_rate_tolerance );
Fiona Glaser's avatar
Fiona Glaser committed
629
630
631
632
    H2( "      --ipratio <float>       QP factor between I and P [%.2f]\n", defaults->rc.f_ip_factor );
    H2( "      --pbratio <float>       QP factor between P and B [%.2f]\n", defaults->rc.f_pb_factor );
    H2( "      --chroma-qp-offset <integer>  QP difference between chroma and luma [%d]\n", defaults->analyse.i_chroma_qp_offset );
    H2( "      --aq-mode <integer>     AQ method [%d]\n"
633
        "                                  - 0: Disabled\n"
Anton Mitrofanov's avatar
Anton Mitrofanov committed
634
635
        "                                  - 1: Variance AQ (complexity mask)\n"
        "                                  - 2: Auto-variance AQ (experimental)\n", defaults->rc.i_aq_mode );
Fiona Glaser's avatar
Fiona Glaser committed
636
637
638
    H1( "      --aq-strength <float>   Reduces blocking and blurring in flat and\n"
        "                              textured areas. [%.1f]\n", defaults->rc.f_aq_strength );
    H1( "\n" );
Fiona Glaser's avatar
Fiona Glaser committed
639
640
    H0( "  -p, --pass <integer>        Enable multipass ratecontrol\n"
        "                                  - 1: First pass, creates stats file\n"
Fiona Glaser's avatar
Fiona Glaser committed
641
642
643
644
645
646
647
648
649
        "                                  - 2: Last pass, does not overwrite stats file\n" );
    H2( "                                  - 3: Nth pass, overwrites stats file\n" );
    H1( "      --stats <string>        Filename for 2 pass stats [\"%s\"]\n", defaults->rc.psz_stat_out );
    H2( "      --no-mbtree             Disable mb-tree ratecontrol.\n");
    H2( "      --qcomp <float>         QP curve compression [%.2f]\n", defaults->rc.f_qcompress );
    H2( "      --cplxblur <float>      Reduce fluctuations in QP (before curve compression) [%.1f]\n", defaults->rc.f_complexity_blur );
    H2( "      --qblur <float>         Reduce fluctuations in QP (after curve compression) [%.1f]\n", defaults->rc.f_qblur );
    H2( "      --zones <zone0>/<zone1>/...  Tweak the bitrate of regions of the video\n" );
    H2( "                              Each zone is of the form\n"
650
651
652
653
        "                                  <start frame>,<end frame>,<option>\n"
        "                                  where <option> is either\n"
        "                                      q=<integer> (force QP)\n"
        "                                  or  b=<float> (bitrate multiplier)\n" );
654
    H2( "      --qpfile <string>       Force frametypes and QPs for some or all frames\n"
655
        "                              Format of each line: framenumber frametype QP\n"
Fiona Glaser's avatar
Fiona Glaser committed
656
        "                              QP is optional (none lets x264 choose). Frametypes: I,i,K,P,B,b.\n"
Lamont Alston's avatar
Lamont Alston committed
657
        "                                  K=<I or i> depending on open-gop setting\n"
658
        "                              QPs are restricted by qpmin/qpmax.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
659
660
661
662
    H1( "\n" );
    H1( "Analysis:\n" );
    H1( "\n" );
    H1( "  -A, --partitions <string>   Partitions to consider [\"p8x8,b8x8,i8x8,i4x4\"]\n"
663
664
665
        "                                  - p8x8, p4x4, b8x8, i8x8, i4x4\n"
        "                                  - none, all\n"
        "                                  (p4x4 requires p8x8. i8x8 requires --8x8dct.)\n" );
Fiona Glaser's avatar
Fiona Glaser committed
666
    H1( "      --direct <string>       Direct MV prediction mode [\"%s\"]\n"
667
668
        "                                  - none, spatial, temporal, auto\n",
                                       strtable_lookup( x264_direct_pred_names, defaults->analyse.i_direct_mv_pred ) );
Fiona Glaser's avatar
Fiona Glaser committed
669
    H2( "      --no-weightb            Disable weighted prediction for B-frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
670
    H1( "      --weightp <integer>     Weighted prediction for P-frames [%d]\n"
Fiona Glaser's avatar
Fiona Glaser committed
671
        "                                  - 0: Disabled\n"
672
673
        "                                  - 1: Weighted refs\n"
        "                                  - 2: Weighted refs + Duplicates\n", defaults->analyse.i_weighted_pred );
Fiona Glaser's avatar
Fiona Glaser committed
674
    H1( "      --me <string>           Integer pixel motion estimation method [\"%s\"]\n",
675
                                       strtable_lookup( x264_motion_est_names, defaults->analyse.i_me_method ) );
Fiona Glaser's avatar
Fiona Glaser committed
676
    H2( "                                  - dia: diamond search, radius 1 (fast)\n"
677
678
        "                                  - hex: hexagonal search, radius 2\n"
        "                                  - umh: uneven multi-hexagon search\n"
679
680
        "                                  - esa: exhaustive search\n"
        "                                  - tesa: hadamard exhaustive search (slow)\n" );
Fiona Glaser's avatar
Fiona Glaser committed
681
682
683
684
685
686
    else H1( "                                  - dia, hex, umh\n" );
    H2( "      --merange <integer>     Maximum motion vector search range [%d]\n", defaults->analyse.i_me_range );
    H2( "      --mvrange <integer>     Maximum motion vector length [-1 (auto)]\n" );
    H2( "      --mvrange-thread <int>  Minimum buffer between threads [-1 (auto)]\n" );
    H1( "  -m, --subme <integer>       Subpixel motion estimation and mode decision [%d]\n", defaults->analyse.i_subpel_refine );
    H2( "                                  - 0: fullpel only (not recommended)\n"
687
        "                                  - 1: SAD mode decision, one qpel iteration\n"
688
689
690
691
692
        "                                  - 2: SATD mode decision\n"
        "                                  - 3-5: Progressively more qpel\n"
        "                                  - 6: RD mode decision for I/P-frames\n"
        "                                  - 7: RD mode decision for all frames\n"
        "                                  - 8: RD refinement for I/P-frames\n"
Fiona Glaser's avatar
Fiona Glaser committed
693
        "                                  - 9: RD refinement for all frames\n"
694
695
696
        "                                  - 10: QP-RD - requires trellis=2, aq-mode>0\n"
        "                                  - 11: Full RD: disable all early terminations\n" );
    else H1( "                                  decision quality: 1=fast, 11=best\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
697
    H1( "      --psy-rd <float:float>  Strength of psychovisual optimization [\"%.1f:%.1f\"]\n"
698
        "                                  #1: RD (requires subme>=6)\n"
699
        "                                  #2: Trellis (requires trellis, experimental)\n",
Loren Merritt's avatar
Loren Merritt committed
700
                                       defaults->analyse.f_psy_rd, defaults->analyse.f_psy_trellis );
Fiona Glaser's avatar
Fiona Glaser committed
701
    H2( "      --no-psy                Disable all visual optimizations that worsen\n"
Fiona Glaser's avatar
Fiona Glaser committed
702
        "                              both PSNR and SSIM.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
703
704
705
    H2( "      --no-mixed-refs         Don't decide references on a per partition basis\n" );
    H2( "      --no-chroma-me          Ignore chroma in motion estimation\n" );
    H1( "      --no-8x8dct             Disable adaptive spatial transform size\n" );
Fiona Glaser's avatar
Fiona Glaser committed
706
    H1( "  -t, --trellis <integer>     Trellis RD quantization. [%d]\n"
707
708
709
        "                                  - 0: disabled\n"
        "                                  - 1: enabled only on the final encode of a MB\n"
        "                                  - 2: enabled on all mode decisions\n", defaults->analyse.i_trellis );
Fiona Glaser's avatar
Fiona Glaser committed
710
711
712
713
714
715
716
717
    H2( "      --no-fast-pskip         Disables early SKIP detection on P-frames\n" );
    H2( "      --no-dct-decimate       Disables coefficient thresholding on P-frames\n" );
    H1( "      --nr <integer>          Noise reduction [%d]\n", defaults->analyse.i_noise_reduction );
    H2( "\n" );
    H2( "      --deadzone-inter <int>  Set the size of the inter luma quantization deadzone [%d]\n", defaults->analyse.i_luma_deadzone[0] );
    H2( "      --deadzone-intra <int>  Set the size of the intra luma quantization deadzone [%d]\n", defaults->analyse.i_luma_deadzone[1] );
    H2( "                                  Deadzones should be in the range 0 - 32.\n" );
    H2( "      --cqm <string>          Preset quant matrices [\"flat\"]\n"
718
        "                                  - jvt, flat\n" );
Fiona Glaser's avatar
Fiona Glaser committed
719
720
721
    H1( "      --cqmfile <string>      Read custom quant matrices from a JM-compatible file\n" );
    H2( "                                  Overrides any other --cqm* options.\n" );
    H2( "      --cqm4 <list>           Set all 4x4 quant matrices\n"
722
        "                                  Takes a comma-separated list of 16 integers.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
723
    H2( "      --cqm8 <list>           Set all 8x8 quant matrices\n"
724
        "                                  Takes a comma-separated list of 64 integers.\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
725
    H2( "      --cqm4i, --cqm4p, --cqm8i, --cqm8p <list>\n"
726
        "                              Set both luma and chroma quant matrices\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
727
    H2( "      --cqm4iy, --cqm4ic, --cqm4py, --cqm4pc <list>\n"
728
        "                              Set individual quant matrices\n" );
Fiona Glaser's avatar
Fiona Glaser committed
729
730
731
732
733
734
    H2( "\n" );
    H2( "Video Usability Info (Annex E):\n" );
    H2( "The VUI settings are not used by the encoder but are merely suggestions to\n" );
    H2( "the playback equipment. See doc/vui.txt for details. Use at your own risk.\n" );
    H2( "\n" );
    H2( "      --overscan <string>     Specify crop overscan setting [\"%s\"]\n"
735
736
        "                                  - undef, show, crop\n",
                                       strtable_lookup( x264_overscan_names, defaults->vui.i_overscan ) );
Fiona Glaser's avatar
Fiona Glaser committed
737
    H2( "      --videoformat <string>  Specify video format [\"%s\"]\n"
738
739
        "                                  - component, pal, ntsc, secam, mac, undef\n",
                                       strtable_lookup( x264_vidformat_names, defaults->vui.i_vidformat ) );
740
741
    H2( "      --range <string>        Specify color range [\"%s\"]\n"
        "                                  - %s\n", range_names[0], stringify_names( buf, range_names ) );
Fiona Glaser's avatar
Fiona Glaser committed
742
    H2( "      --colorprim <string>    Specify color primaries [\"%s\"]\n"
743
744
745
        "                                  - undef, bt709, bt470m, bt470bg\n"
        "                                    smpte170m, smpte240m, film\n",
                                       strtable_lookup( x264_colorprim_names, defaults->vui.i_colorprim ) );
Fiona Glaser's avatar
Fiona Glaser committed
746
    H2( "      --transfer <string>     Specify transfer characteristics [\"%s\"]\n"
747
748
749
        "                                  - undef, bt709, bt470m, bt470bg, linear,\n"
        "                                    log100, log316, smpte170m, smpte240m\n",
                                       strtable_lookup( x264_transfer_names, defaults->vui.i_transfer ) );
Fiona Glaser's avatar
Fiona Glaser committed
750
    H2( "      --colormatrix <string>  Specify color matrix setting [\"%s\"]\n"
751
752
753
        "                                  - undef, bt709, fcc, bt470bg\n"
        "                                    smpte170m, smpte240m, GBR, YCgCo\n",
                                       strtable_lookup( x264_colmatrix_names, defaults->vui.i_colmatrix ) );
Fiona Glaser's avatar
Fiona Glaser committed
754
    H2( "      --chromaloc <integer>   Specify chroma sample location (0 to 5) [%d]\n",
755
                                       defaults->vui.i_chroma_loc );
756
757
758
759

    H2( "      --nal-hrd <string>      Signal HRD information (requires vbv-bufsize)\n"
        "                                  - none, vbr, cbr (cbr not allowed in .mp4)\n" );
    H2( "      --pic-struct            Force pic_struct in Picture Timing SEI\n" );
760
761
    H2( "      --crop-rect <string>    Add 'left,top,right,bottom' to the bitstream-level\n"
        "                              cropping rectangle\n" );
762

763
764
765
    H0( "\n" );
    H0( "Input/Output:\n" );
    H0( "\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
766
    H0( "  -o, --output <string>       Specify output file\n" );
767
768
769
770
    H1( "      --muxer <string>        Specify output container format [\"%s\"]\n"
        "                                  - %s\n", muxer_names[0], stringify_names( buf, muxer_names ) );
    H1( "      --demuxer <string>      Specify input container format [\"%s\"]\n"
        "                                  - %s\n", demuxer_names[0], stringify_names( buf, demuxer_names ) );
771
    H1( "      --input-fmt <string>    Specify input file format (requires lavf support)\n" );
772
773
    H1( "      --input-csp <string>    Specify input colorspace format for raw input\n" );
    print_csp_names( longhelp );
Fiona Glaser's avatar
Fiona Glaser committed
774
775
    H1( "      --output-csp <string>   Specify output colorspace [\"%s\"]\n"
        "                                  - %s\n", output_csp_names[0], stringify_names( buf, output_csp_names ) );
776
    H1( "      --input-depth <integer> Specify input bit depth for raw input\n" );
777
778
    H1( "      --input-range <string>  Specify input color range [\"%s\"]\n"
        "                                  - %s\n", range_names[0], stringify_names( buf, range_names ) );
779
    H1( "      --input-res <intxint>   Specify input resolution (width x height)\n" );
780
    H1( "      --index <string>        Filename for input index file\n" );
781
782
783
784
785
    H0( "      --sar width:height      Specify Sample Aspect Ratio\n" );
    H0( "      --fps <float|rational>  Specify framerate\n" );
    H0( "      --seek <integer>        First frame to encode\n" );
    H0( "      --frames <integer>      Maximum number of frames to encode\n" );
    H0( "      --level <string>        Specify level (as defined by Annex A)\n" );
786
    H1( "      --bluray-compat         Enable compatibility hacks for Blu-ray support\n" );
Fiona Glaser's avatar
Fiona Glaser committed
787
788
789
    H1( "\n" );
    H1( "  -v, --verbose               Print stats for each frame\n" );
    H1( "      --no-progress           Don't show the progress indicator while encoding\n" );
790
    H0( "      --quiet                 Quiet Mode\n" );
791
792
793
    H1( "      --log-level <string>    Specify the maximum level of logging [\"%s\"]\n"
        "                                  - %s\n", strtable_lookup( log_level_names, cli_log_level - X264_LOG_NONE ),
                                       stringify_names( buf, log_level_names ) );
Fiona Glaser's avatar
Fiona Glaser committed
794
795
796
    H1( "      --psnr                  Enable PSNR computation\n" );
    H1( "      --ssim                  Enable SSIM computation\n" );
    H1( "      --threads <integer>     Force a specific number of threads\n" );
797
    H2( "      --sliced-threads        Low-latency but lower-efficiency threading\n" );
Fiona Glaser's avatar
Fiona Glaser committed
798
799
800
    H2( "      --thread-input          Run Avisynth in its own thread\n" );
    H2( "      --sync-lookahead <integer> Number of buffer frames for threaded lookahead\n" );
    H2( "      --non-deterministic     Slightly improve quality of SMP, at the cost of repeatability\n" );
801
802
    H2( "      --cpu-independent       Ensure exact reproducibility across different cpus,\n"
        "                                  as opposed to letting them select different algorithms\n" );
Fiona Glaser's avatar
Fiona Glaser committed
803
804
805
806
807
808
    H2( "      --asm <integer>         Override CPU detection\n" );
    H2( "      --no-asm                Disable all CPU optimizations\n" );
    H2( "      --visualize             Show MB types overlayed on the encoded video\n" );
    H2( "      --dump-yuv <string>     Save reconstructed frames\n" );
    H2( "      --sps-id <integer>      Set SPS and PPS id numbers [%d]\n", defaults->i_sps_id );
    H2( "      --aud                   Use access unit delimiters\n" );
809
    H2( "      --force-cfr             Force constant framerate timestamp generation\n" );
Yusuke Nakamura's avatar
Yusuke Nakamura committed
810
811
812
813
814
    H2( "      --tcfile-in <string>    Force timestamp generation with timecode file\n" );
    H2( "      --tcfile-out <string>   Output timecode v2 file from input timestamps\n" );
    H2( "      --timebase <int/int>    Specify timebase numerator and denominator\n"
        "                 <integer>    Specify timebase numerator for input timecode file\n"
        "                              or specify timebase denominator for other input\n" );
815
    H2( "      --dts-compress          Eliminate initial delay with container DTS hack\n" );
816
    H0( "\n" );
817
818
    H0( "Filtering:\n" );
    H0( "\n" );
819
820
821
822
    H0( "      --vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file\n" );
    H0( "\n" );
    H0( "      Filter options may be specified in <filter>:<option>=<value> format.\n" );
    H0( "\n" );
823
824
825
826
    H0( "      Available filters:\n" );
    x264_register_vid_filters();
    x264_vid_filter_help( longhelp );
    H0( "\n" );
Laurent Aimar's avatar
Laurent Aimar committed
827
828
}

Anton Mitrofanov's avatar
Anton Mitrofanov committed
829
typedef enum
Anton Mitrofanov's avatar
Anton Mitrofanov committed
830
{
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
    OPT_FRAMES = 256,
    OPT_SEEK,
    OPT_QPFILE,
    OPT_THREAD_INPUT,
    OPT_QUIET,
    OPT_NOPROGRESS,
    OPT_VISUALIZE,
    OPT_LONGHELP,
    OPT_PROFILE,
    OPT_PRESET,
    OPT_TUNE,
    OPT_SLOWFIRSTPASS,
    OPT_FULLHELP,
    OPT_FPS,
    OPT_MUXER,
    OPT_DEMUXER,
    OPT_INDEX,
    OPT_INTERLACED,
    OPT_TCFILE_IN,
    OPT_TCFILE_OUT,
    OPT_TIMEBASE,
    OPT_PULLDOWN,
853
854
    OPT_LOG_LEVEL,
    OPT_VIDEO_FILTER,
855
    OPT_INPUT_FMT,
856
    OPT_INPUT_RES,
857
    OPT_INPUT_CSP,
858
    OPT_INPUT_DEPTH,
Fiona Glaser's avatar
Fiona Glaser committed
859
    OPT_DTS_COMPRESSION,
860
861
862
    OPT_OUTPUT_CSP,
    OPT_INPUT_RANGE,
    OPT_RANGE
863
} OptionsOPT;
864
865
866
867
868
869

static char short_options[] = "8A:B:b:f:hI:i:m:o:p:q:r:t:Vvw";
static struct option long_options[] =
{
    { "help",              no_argument, NULL, 'h' },
    { "longhelp",          no_argument, NULL, OPT_LONGHELP },
Fiona Glaser's avatar
Fiona Glaser committed
870
    { "fullhelp",          no_argument, NULL, OPT_FULLHELP },
871
872
873
874
875
876
877
878
879
880
    { "version",           no_argument, NULL, 'V' },
    { "profile",     required_argument, NULL, OPT_PROFILE },
    { "preset",      required_argument, NULL, OPT_PRESET },
    { "tune",        required_argument, NULL, OPT_TUNE },
    { "slow-firstpass",    no_argument, NULL, OPT_SLOWFIRSTPASS },
    { "bitrate",     required_argument, NULL, 'B' },
    { "bframes",     required_argument, NULL, 'b' },
    { "b-adapt",     required_argument, NULL, 0 },
    { "no-b-adapt",        no_argument, NULL, 0 },
    { "b-bias",      required_argument, NULL, 0 },
Lamont Alston's avatar
Lamont Alston committed
881
    { "b-pyramid",   required_argument, NULL, 0 },
882
883
    { "open-gop",          no_argument, NULL, 0 },
    { "bluray-compat",     no_argument, NULL, 0 },
884
885
    { "min-keyint",  required_argument, NULL, 'i' },
    { "keyint",      required_argument, NULL, 'I' },
Fiona Glaser's avatar
Fiona Glaser committed
886
    { "intra-refresh",     no_argument, NULL, 0 },
887
888
889
890
891
892
    { "scenecut",    required_argument, NULL, 0 },
    { "no-scenecut",       no_argument, NULL, 0 },
    { "nf",                no_argument, NULL, 0 },
    { "no-deblock",        no_argument, NULL, 0 },
    { "filter",      required_argument, NULL, 0 },
    { "deblock",     required_argument, NULL, 'f' },
893
    { "interlaced",        no_argument, NULL, OPT_INTERLACED },
894
895
    { "tff",               no_argument, NULL, OPT_INTERLACED },
    { "bff",               no_argument, NULL, OPT_INTERLACED },
896
    { "no-interlaced",     no_argument, NULL, OPT_INTERLACED },
897
    { "constrained-intra", no_argument, NULL, 0 },
898
899
900
901
902
903
904
    { "cabac",             no_argument, NULL, 0 },
    { "no-cabac",          no_argument, NULL, 0 },
    { "qp",          required_argument, NULL, 'q' },
    { "qpmin",       required_argument, NULL, 0 },
    { "qpmax",       required_argument, NULL, 0 },
    { "qpstep",      required_argument, NULL, 0 },
    { "crf",         required_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
905
    { "rc-lookahead",required_argument, NULL, 0 },
906
907
908
909
    { "ref",         required_argument, NULL, 'r' },
    { "asm",         required_argument, NULL, 0 },
    { "no-asm",            no_argument, NULL, 0 },
    { "sar",         required_argument, NULL, 0 },
910
    { "fps",         required_argument, NULL, OPT_FPS },
911
912
913
    { "frames",      required_argument, NULL, OPT_FRAMES },
    { "seek",        required_argument, NULL, OPT_SEEK },
    { "output",      required_argument, NULL, 'o' },
914
915
916
917
918
    { "muxer",       required_argument, NULL, OPT_MUXER },
    { "demuxer",     required_argument, NULL, OPT_DEMUXER },
    { "stdout",      required_argument, NULL, OPT_MUXER },
    { "stdin",       required_argument, NULL, OPT_DEMUXER },
    { "index",       required_argument, NULL, OPT_INDEX },
919
920
921
922
923
    { "analyse",     required_argument, NULL, 0 },
    { "partitions",  required_argument, NULL, 'A' },
    { "direct",      required_argument, NULL, 0 },
    { "weightb",           no_argument, NULL, 'w' },
    { "no-weightb",        no_argument, NULL, 0 },
Dylan Yudaken's avatar
Dylan Yudaken committed
924
    { "weightp",     required_argument, NULL, 0 },
925
926
927
928
929
930
    { "me",          required_argument, NULL, 0 },
    { "merange",     required_argument, NULL, 0 },
    { "mvrange",     required_argument, NULL, 0 },
    { "mvrange-thread", required_argument, NULL, 0 },
    { "subme",       required_argument, NULL, 'm' },
    { "psy-rd",      required_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
931
932
    { "no-psy",            no_argument, NULL, 0 },
    { "psy",               no_argument, NULL, 0 },
933
934
935
    { "mixed-refs",        no_argument, NULL, 0 },
    { "no-mixed-refs",     no_argument, NULL, 0 },
    { "no-chroma-me",      no_argument, NULL, 0 },
936
    { "8x8dct",            no_argument, NULL, '8' },
937
938
939
940
941
942
943
    { "no-8x8dct",         no_argument, NULL, 0 },
    { "trellis",     required_argument, NULL, 't' },
    { "fast-pskip",        no_argument, NULL, 0 },
    { "no-fast-pskip",     no_argument, NULL, 0 },
    { "no-dct-decimate",   no_argument, NULL, 0 },
    { "aq-strength", required_argument, NULL, 0 },
    { "aq-mode",     required_argument, NULL, 0 },
944
945
    { "deadzone-inter", required_argument, NULL, 0 },
    { "deadzone-intra", required_argument, NULL, 0 },
946
947
948
949
    { "level",       required_argument, NULL, 0 },
    { "ratetol",     required_argument, NULL, 0 },
    { "vbv-maxrate", required_argument, NULL, 0 },
    { "vbv-bufsize", required_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
950
951
    { "vbv-init",    required_argument, NULL, 0 },
    { "crf-max",     required_argument, NULL, 0 },
952
953
954
955
956
957
    { "ipratio",     required_argument, NULL, 0 },
    { "pbratio",     required_argument, NULL, 0 },
    { "chroma-qp-offset", required_argument, NULL, 0 },
    { "pass",        required_argument, NULL, 'p' },
    { "stats",       required_argument, NULL, 0 },
    { "qcomp",       required_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
958
959
    { "mbtree",            no_argument, NULL, 0 },
    { "no-mbtree",         no_argument, NULL, 0 },
960
961
962
963
964
    { "qblur",       required_argument, NULL, 0 },
    { "cplxblur",    required_argument, NULL, 0 },
    { "zones",       required_argument, NULL, 0 },
    { "qpfile",      required_argument, NULL, OPT_QPFILE },
    { "threads",     required_argument, NULL, 0 },
965
966
    { "sliced-threads",    no_argument, NULL, 0 },
    { "no-sliced-threads", no_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
967
968
969
    { "slice-max-size",    required_argument, NULL, 0 },
    { "slice-max-mbs",     required_argument, NULL, 0 },
    { "slices",            required_argument, NULL, 0 },
970
    { "thread-input",      no_argument, NULL, OPT_THREAD_INPUT },
Steven Walters's avatar
Steven Walters committed
971
    { "sync-lookahead",    required_argument, NULL, 0 },
972
    { "non-deterministic", no_argument, NULL, 0 },
973
    { "cpu-independent",   no_argument, NULL, 0 },
974
975
976
977
    { "psnr",              no_argument, NULL, 0 },
    { "ssim",              no_argument, NULL, 0 },
    { "quiet",             no_argument, NULL, OPT_QUIET },
    { "verbose",           no_argument, NULL, 'v' },
978
    { "log-level",   required_argument, NULL, OPT_LOG_LEVEL },
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
    { "no-progress",       no_argument, NULL, OPT_NOPROGRESS },
    { "visualize",         no_argument, NULL, OPT_VISUALIZE },
    { "dump-yuv",    required_argument, NULL, 0 },
    { "sps-id",      required_argument, NULL, 0 },
    { "aud",               no_argument, NULL, 0 },
    { "nr",          required_argument, NULL, 0 },
    { "cqm",         required_argument, NULL, 0 },
    { "cqmfile",     required_argument, NULL, 0 },
    { "cqm4",        required_argument, NULL, 0 },
    { "cqm4i",       required_argument, NULL, 0 },
    { "cqm4iy",      required_argument, NULL, 0 },
    { "cqm4ic",      required_argument, NULL, 0 },
    { "cqm4p",       required_argument, NULL, 0 },
    { "cqm4py",      required_argument, NULL, 0 },
    { "cqm4pc",      required_argument, NULL, 0 },
    { "cqm8",        required_argument, NULL, 0 },
    { "cqm8i",       required_argument, NULL, 0 },
    { "cqm8p",       required_argument, NULL, 0 },
    { "overscan",    required_argument, NULL, 0 },
    { "videoformat", required_argument, NULL, 0 },