x264.c 81.1 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
    for( enum PixelFormat i = PIX_FMT_NONE+1; i < PIX_FMT_NB; i++ )
    {
353
354
        const char *pfname = av_get_pix_fmt_name( i );
        if( pfname )
355
        {
356
357
358
359
360
361
362
363
364
365
366
367
368
            size_t name_len = strlen( pfname );
            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;
            }
369
370
371
372
373
374
        }
    }
#endif
    printf( "\n" );
}

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

    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" );
763
764
    H2( "      --crop-rect <string>    Add 'left,top,right,bottom' to the bitstream-level\n"
        "                              cropping rectangle\n" );
765

766
767
768
    H0( "\n" );
    H0( "Input/Output:\n" );
    H0( "\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
769
    H0( "  -o, --output <string>       Specify output file\n" );
770
771
772
773
    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 ) );
774
    H1( "      --input-fmt <string>    Specify input file format (requires lavf support)\n" );
775
776
    H1( "      --input-csp <string>    Specify input colorspace format for raw input\n" );
    print_csp_names( longhelp );
Fiona Glaser's avatar
Fiona Glaser committed
777
778
    H1( "      --output-csp <string>   Specify output colorspace [\"%s\"]\n"
        "                                  - %s\n", output_csp_names[0], stringify_names( buf, output_csp_names ) );
779
    H1( "      --input-depth <integer> Specify input bit depth for raw input\n" );
780
781
    H1( "      --input-range <string>  Specify input color range [\"%s\"]\n"
        "                                  - %s\n", range_names[0], stringify_names( buf, range_names ) );
782
    H1( "      --input-res <intxint>   Specify input resolution (width x height)\n" );
783
    H1( "      --index <string>        Filename for input index file\n" );
784
785
786
787
788
    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" );
789
    H1( "      --bluray-compat         Enable compatibility hacks for Blu-ray support\n" );
Fiona Glaser's avatar
Fiona Glaser committed
790
791
792
    H1( "\n" );
    H1( "  -v, --verbose               Print stats for each frame\n" );
    H1( "      --no-progress           Don't show the progress indicator while encoding\n" );
793
    H0( "      --quiet                 Quiet Mode\n" );
794
795
796
    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
797
798
799
    H1( "      --psnr                  Enable PSNR computation\n" );
    H1( "      --ssim                  Enable SSIM computation\n" );
    H1( "      --threads <integer>     Force a specific number of threads\n" );
800
    H2( "      --sliced-threads        Low-latency but lower-efficiency threading\n" );
Fiona Glaser's avatar
Fiona Glaser committed
801
802
803
    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" );
804
805
    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
806
807
808
809
810
811
    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" );
812
    H2( "      --force-cfr             Force constant framerate timestamp generation\n" );
Yusuke Nakamura's avatar
Yusuke Nakamura committed
813
814
815
816
817
    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" );
818
    H2( "      --dts-compress          Eliminate initial delay with container DTS hack\n" );
819
    H0( "\n" );
820
821
    H0( "Filtering:\n" );
    H0( "\n" );
822
823
824
825
    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" );
826
827
828
829
    H0( "      Available filters:\n" );
    x264_register_vid_filters();
    x264_vid_filter_help( longhelp );
    H0( "\n" );
Laurent Aimar's avatar
Laurent Aimar committed
830
831
}

Anton Mitrofanov's avatar
Anton Mitrofanov committed
832
typedef enum
Anton Mitrofanov's avatar
Anton Mitrofanov committed
833
{
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
    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,
856
857
    OPT_LOG_LEVEL,
    OPT_VIDEO_FILTER,
858
    OPT_INPUT_FMT,
859
    OPT_INPUT_RES,
860
    OPT_INPUT_CSP,
861
    OPT_INPUT_DEPTH,
Fiona Glaser's avatar
Fiona Glaser committed
862
    OPT_DTS_COMPRESSION,
863
864
865
    OPT_OUTPUT_CSP,
    OPT_INPUT_RANGE,
    OPT_RANGE
866
} OptionsOPT;
867
868
869
870
871
872

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
873
    { "fullhelp",          no_argument, NULL, OPT_FULLHELP },
874
875
876
877
878
879
880
881
882
883
    { "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
884
    { "b-pyramid",   required_argument, NULL, 0 },
885
886
    { "open-gop",          no_argument, NULL, 0 },
    { "bluray-compat",     no_argument, NULL, 0 },
887
888
    { "min-keyint",  required_argument, NULL, 'i' },
    { "keyint",      required_argument, NULL, 'I' },
Fiona Glaser's avatar
Fiona Glaser committed
889
    { "intra-refresh",     no_argument, NULL, 0 },
890
891
892
893
894
895
    { "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' },
896
    { "interlaced",        no_argument, NULL, OPT_INTERLACED },
897
898
    { "tff",               no_argument, NULL, OPT_INTERLACED },
    { "bff",               no_argument, NULL, OPT_INTERLACED },
899
    { "no-interlaced",     no_argument, NULL, OPT_INTERLACED },
900
    { "constrained-intra", no_argument, NULL, 0 },
901
902
903
904
905
906
907
    { "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
908
    { "rc-lookahead",required_argument, NULL, 0 },
909
910
911
912
    { "ref",         required_argument, NULL, 'r' },
    { "asm",         required_argument, NULL, 0 },
    { "no-asm",            no_argument, NULL, 0 },
    { "sar",         required_argument, NULL, 0 },
913
    { "fps",         required_argument, NULL, OPT_FPS },
914
915
916
    { "frames",      required_argument, NULL, OPT_FRAMES },
    { "seek",        required_argument, NULL, OPT_SEEK },
    { "output",      required_argument, NULL, 'o' },
917
918
919
920
921
    { "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 },
922
923
924
925
926
    { "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
927
    { "weightp",     required_argument, NULL, 0 },
928
929
930
931
932
933
    { "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
934
935
    { "no-psy",            no_argument, NULL, 0 },
    { "psy",               no_argument, NULL, 0 },
936
937
938
    { "mixed-refs",        no_argument, NULL, 0 },
    { "no-mixed-refs",     no_argument, NULL, 0 },
    { "no-chroma-me",      no_argument, NULL, 0 },
939
    { "8x8dct",            no_argument, NULL, '8' },
940
941
942
943
944
945
946
    { "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 },
947
948
    { "deadzone-inter", required_argument, NULL, 0 },
    { "deadzone-intra", required_argument, NULL, 0 },
949
950
951
952
    { "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
953
954
    { "vbv-init",    required_argument, NULL, 0 },
    { "crf-max",     required_argument, NULL, 0 },
955
956
957
958
959
960
    { "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
961
962
    { "mbtree",            no_argument, NULL, 0 },
    { "no-mbtree",         no_argument, NULL, 0 },
963
964
965
966
967
    { "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 },
968
969
    { "sliced-threads",    no_argument, NULL, 0 },
    { "no-sliced-threads", no_argument, NULL, 0 },
Fiona Glaser's avatar
Fiona Glaser committed
970
971
972
    { "slice-max-size",    required_argument, NULL, 0 },
    { "slice-max-mbs",     required_argument, NULL, 0 },
    { "slices",            required_argument, NULL, 0 },
973
    { "thread-input",      no_argument, NULL, OPT_THREAD_INPUT },
Steven Walters's avatar
Steven Walters committed
974
    { "sync-lookahead",    required_argument, NULL, 0 },
975
    { "non-deterministic", no_argument, NULL, 0 },
976
    { "cpu-independent",   no_argument, NULL, 0 },
977
978
979
980
    { "psnr",              no_argument, NULL, 0 },
    { "ssim",              no_argument, NULL, 0 },
    { "quiet",             no_argument, NULL, OPT_QUIET },
    { "verbose",           no_argument, NULL, 'v' },
981
    { "log-level",   required_argument, NULL, OPT_LOG_LEVEL },
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
    { "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 },
1002
    { "range",       required_argument, NULL, OPT_RANGE },
1003
1004
1005
1006
    { "colorprim",   required_argument, NULL, 0 },
    { "transfer",    required_argument, NULL, 0 },
    { "colormatrix", required_argument, NULL, 0 },
    { "chromaloc",   required_argument, NULL, 0 },
1007
    { "force-cfr",         no_argument, NULL, 0 },
Yusuke Nakamura's avatar
Yusuke Nakamura committed
1008
1009
1010
    { "tcfile-in",   required_argument, NULL, OPT_TCFILE_IN },
    { "tcfile-out",  required_argument, NULL, OPT_TCFILE_OUT },
    { "timebase",    required_argument, NULL, OPT_TIMEBASE },
1011
    { "pic-struct",        no_argument, NULL, 0 },
1012
    { "crop-rect",   required_argument, NULL, 0 },
1013
1014
    { "nal-hrd",     required_argument, NULL, 0 },
    { "pulldown",    required_argument, NULL, OPT_PULLDOWN },
Kieran Kunhya's avatar
Kieran Kunhya committed
1015
    { "fake-interlaced",   no_argument, NULL, 0 },
1016
    { "frame-packing",     required_argument, NULL, 0 },
1017
1018
    { "vf",          required_argument, NULL, OPT_VIDEO_FILTER },
    { "video-filter", required_argument, NULL, OPT_VIDEO_FILTER },
1019
    { "input-fmt",   required_argument, NULL, OPT_INPUT_FMT },
1020
1021
    { "input-res",   required_argument, NULL, OPT_INPUT_RES },
    { "input-csp",   required_argument, NULL, OPT_INPUT_CSP },