x264.c 87.8 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
 *****************************************************************************
Henrik Gramner's avatar
Henrik Gramner committed
4
 * Copyright (C) 2003-2018 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>
Henrik Gramner's avatar
Henrik Gramner committed
11
 *          Henrik Gramner <henrik@gramner.com>
Laurent Aimar's avatar
Laurent Aimar committed
12
13
14
15
16
17
18
19
20
21
22
23
24
 *
 * 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
25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
Fiona Glaser's avatar
Fiona Glaser committed
26
27
28
 *
 * 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
29
30
 *****************************************************************************/

Henrik Gramner's avatar
Henrik Gramner committed
31
32
33
34
35
36
37
38
39
#ifdef _WIN32
/* The following two defines must be located before the inclusion of any system header files. */
#define WINVER       0x0500
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <io.h>       /* _setmode() */
#include <fcntl.h>    /* _O_BINARY */
#endif

Laurent Aimar's avatar
Laurent Aimar committed
40
41
#include <signal.h>
#include <getopt.h>
42
43
44
#include "x264cli.h"
#include "input/input.h"
#include "output/output.h"
45
#include "filters/filters.h"
46

47
48
49
#define QP_MAX_SPEC (51+6*2)
#define QP_MAX (QP_MAX_SPEC+18)

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

52
#if HAVE_LAVF
53
54
#undef DECLARE_ALIGNED
#include <libavformat/avformat.h>
55
56
57
58
#include <libavutil/pixfmt.h>
#include <libavutil/pixdesc.h>
#endif

59
#if HAVE_SWSCALE
60
#undef DECLARE_ALIGNED
61
62
63
64
65
66
67
#include <libswscale/swscale.h>
#endif

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

Henrik Gramner's avatar
Henrik Gramner committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifdef _WIN32
#define CONSOLE_TITLE_SIZE 200
static wchar_t org_console_title[CONSOLE_TITLE_SIZE] = L"";

void x264_cli_set_console_title( const char *title )
{
    wchar_t title_utf16[CONSOLE_TITLE_SIZE];
    if( utf8_to_utf16( title, title_utf16 ) )
        SetConsoleTitleW( title_utf16 );
}

static int utf16_to_ansi( const wchar_t *utf16, char *ansi, int size )
{
    int invalid;
    return WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, utf16, -1, ansi, size, NULL, &invalid ) && !invalid;
}

/* Some external libraries doesn't support Unicode in filenames,
 * as a workaround we can try to get an ANSI filename instead. */
int x264_ansi_filename( const char *filename, char *ansi_filename, int size, int create_file )
{
    wchar_t filename_utf16[MAX_PATH];
    if( utf8_to_utf16( filename, filename_utf16 ) )
    {
        if( create_file )
        {
            /* Create the file using the Unicode filename if it doesn't already exist. */
            FILE *fh = _wfopen( filename_utf16, L"ab" );
            if( fh )
                fclose( fh );
        }

        /* Check if the filename already is valid ANSI. */
        if( utf16_to_ansi( filename_utf16, ansi_filename, size ) )
            return 1;

        /* Check for a legacy 8.3 short filename. */
        int short_length = GetShortPathNameW( filename_utf16, filename_utf16, MAX_PATH );
        if( short_length > 0 && short_length < MAX_PATH )
            if( utf16_to_ansi( filename_utf16, ansi_filename, size ) )
                return 1;
    }
    return 0;
}

/* Retrieve command line arguments as UTF-8. */
static int get_argv_utf8( int *argc_ptr, char ***argv_ptr )
{
    int ret = 0;
    wchar_t **argv_utf16 = CommandLineToArgvW( GetCommandLineW(), argc_ptr );
    if( argv_utf16 )
    {
        int argc = *argc_ptr;
        int offset = (argc+1) * sizeof(char*);
        int size = offset;

        for( int i = 0; i < argc; i++ )
            size += WideCharToMultiByte( CP_UTF8, 0, argv_utf16[i], -1, NULL, 0, NULL, NULL );

        char **argv = *argv_ptr = malloc( size );
        if( argv )
        {
            for( int i = 0; i < argc; i++ )
            {
                argv[i] = (char*)argv + offset;
                offset += WideCharToMultiByte( CP_UTF8, 0, argv_utf16[i], -1, argv[i], size-offset, NULL, NULL );
            }
            argv[argc] = NULL;
            ret = 1;
        }
        LocalFree( argv_utf16 );
    }
    return ret;
}
#endif

Laurent Aimar's avatar
Laurent Aimar committed
144
/* Ctrl-C handler */
145
static volatile int b_ctrl_c = 0;
Anton Mitrofanov's avatar
Anton Mitrofanov committed
146
static void sigint_handler( int a )
Laurent Aimar's avatar
Laurent Aimar committed
147
{
Loren Merritt's avatar
Loren Merritt committed
148
    b_ctrl_c = 1;
Laurent Aimar's avatar
Laurent Aimar committed
149
150
}

Loren Merritt's avatar
Loren Merritt committed
151
152
153
154
155
typedef struct {
    int b_progress;
    int i_seek;
    hnd_t hin;
    hnd_t hout;
156
    FILE *qpfile;
Yusuke Nakamura's avatar
Yusuke Nakamura committed
157
158
    FILE *tcfile_out;
    double timebase_convert_multiplier;
159
    int i_pulldown;
Loren Merritt's avatar
Loren Merritt committed
160
161
} cli_opt_t;

162
/* file i/o operation structs */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
163
164
cli_input_t cli_input;
static cli_output_t cli_output;
Loren Merritt's avatar
Loren Merritt committed
165

166
167
168
/* video filter operation struct */
static cli_vid_filter_t filter;

169
170
171
static const char * const demuxer_names[] =
{
    "auto",
172
    "raw",
173
    "y4m",
Steven Walters's avatar
Steven Walters committed
174
#if HAVE_AVS
175
176
    "avs",
#endif
Steven Walters's avatar
Steven Walters committed
177
#if HAVE_LAVF
178
179
    "lavf",
#endif
Steven Walters's avatar
Steven Walters committed
180
#if HAVE_FFMS
181
182
183
184
185
186
187
188
189
190
191
    "ffms",
#endif
    0
};

static const char * const muxer_names[] =
{
    "auto",
    "raw",
    "mkv",
    "flv",
192
#if HAVE_GPAC || HAVE_LSMASH
193
194
195
196
    "mp4",
#endif
    0
};
197

198
static const char * const pulldown_names[] = { "none", "22", "32", "64", "double", "triple", "euro", 0 };
199
static const char * const log_level_names[] = { "none", "error", "warning", "info", "debug", 0 };
200
201
202
203
204
205
206
207
208
209
210
211
212
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
};
213
214
215
216
217
218
219
static const char * const chroma_format_names[] =
{
    [0] = "all",
    [X264_CSP_I420] = "i420",
    [X264_CSP_I422] = "i422",
    [X264_CSP_I444] = "i444"
};
220

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

223
224
typedef struct
{
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
    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
247
    [X264_PULLDOWN_22]     = {1,  {TB},                                   1.0},
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
    [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
264
265
266
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
267

268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
/* 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 );
Henrik Gramner's avatar
Henrik Gramner committed
296
    x264_vfprintf( stderr, fmt, arg );
297
298
299
300
301
302
303
304
305
    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 );
Henrik Gramner's avatar
Henrik Gramner committed
306
    x264_vfprintf( stderr, fmt, arg );
307
308
309
    va_end( arg );
}

310
static void print_version_info( void )
311
312
313
314
315
{
#ifdef X264_POINTVER
    printf( "x264 "X264_POINTVER"\n" );
#else
    printf( "x264 0.%d.X\n", X264_BUILD );
316
317
318
319
320
321
322
323
324
#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 );
325
326
#endif
    printf( "built on " __DATE__ ", " );
Steven Walters's avatar
Steven Walters committed
327
328
329
#ifdef __INTEL_COMPILER
    printf( "intel: %.2f (%d)\n", __INTEL_COMPILER / 100.f, __INTEL_COMPILER_BUILD_DATE );
#elif defined(__GNUC__)
330
    printf( "gcc: " __VERSION__ "\n" );
Steven Walters's avatar
Steven Walters committed
331
332
#elif defined(_MSC_FULL_VER)
    printf( "msvc: %.2f (%u)\n", _MSC_VER / 100.f, _MSC_FULL_VER );
333
#else
Steven Walters's avatar
Steven Walters committed
334
    printf( "using an unknown compiler\n" );
335
#endif
336
337
    printf( "x264 configuration: --chroma-format=%s\n", chroma_format_names[X264_CHROMA_FORMAT] );
    printf( "libx264 configuration: --chroma-format=%s\n", chroma_format_names[x264_chroma_format] );
338
339
340
341
342
343
    printf( "x264 license: " );
#if HAVE_GPL
    printf( "GPL version 2 or later\n" );
#else
    printf( "Non-GPL commercial\n" );
#endif
344
345
346
#if HAVE_SWSCALE
    const char *license = swscale_license();
    printf( "libswscale%s%s license: %s\n", HAVE_LAVF ? "/libavformat" : "", HAVE_FFMS ? "/ffmpegsource" : "" , license );
347
348
349
350
351
352
353
    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
}

354
static int main_internal( int argc, char **argv )
Laurent Aimar's avatar
Laurent Aimar committed
355
356
{
    x264_param_t param;
357
358
    cli_opt_t opt = {0};
    int ret = 0;
359

360
    FAIL_IF_ERROR( x264_threading_init(), "unable to initialize threading\n" );
Laurent Aimar's avatar
Laurent Aimar committed
361

362
#ifdef _WIN32
363
    FAIL_IF_ERROR( !get_argv_utf8( &argc, &argv ), "unable to convert command line to UTF-8\n" );
Laurent Aimar's avatar
Laurent Aimar committed
364

Henrik Gramner's avatar
Henrik Gramner committed
365
366
367
368
369
    GetConsoleTitleW( org_console_title, CONSOLE_TITLE_SIZE );
    _setmode( _fileno( stdin ),  _O_BINARY );
    _setmode( _fileno( stdout ), _O_BINARY );
    _setmode( _fileno( stderr ), _O_BINARY );
#endif
370

Laurent Aimar's avatar
Laurent Aimar committed
371
    /* Parse command line */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
372
    if( parse( argc, argv, &param, &opt ) < 0 )
373
        ret = -1;
Laurent Aimar's avatar
Laurent Aimar committed
374

Henrik Gramner's avatar
Henrik Gramner committed
375
#ifdef _WIN32
376
    /* Restore title; it can be changed by input modules */
Henrik Gramner's avatar
Henrik Gramner committed
377
378
    SetConsoleTitleW( org_console_title );
#endif
379

Laurent Aimar's avatar
Laurent Aimar committed
380
    /* Control-C handler */
Anton Mitrofanov's avatar
Anton Mitrofanov committed
381
    signal( SIGINT, sigint_handler );
Laurent Aimar's avatar
Laurent Aimar committed
382

383
384
385
386
387
388
389
    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
390
        cli_input.close_file( opt.hin );
391
    if( opt.hout )
Anton Mitrofanov's avatar
Anton Mitrofanov committed
392
        cli_output.close_file( opt.hout, 0, 0 );
393
394
395
396
    if( opt.tcfile_out )
        fclose( opt.tcfile_out );
    if( opt.qpfile )
        fclose( opt.qpfile );
397

Henrik Gramner's avatar
Henrik Gramner committed
398
399
400
401
#ifdef _WIN32
    SetConsoleTitleW( org_console_title );
    free( argv );
#endif
402

403
    return ret;
Laurent Aimar's avatar
Laurent Aimar committed
404
405
}

406
407
408
409
410
int main( int argc, char **argv )
{
    return x264_stack_align( main_internal, argc, argv );
}

411
static char const *strtable_lookup( const char * const table[], int idx )
412
413
{
    int i = 0; while( table[i] ) i++;
414
    return ( ( idx >= 0 && idx < i ) ? table[ idx ] : "???" );
415
416
}

417
418
419
420
421
422
423
424
425
426
427
428
429
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;
}

430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
#define INDENT "                                "
#define INDENT_LEN 32 // strlen( INDENT )
#define SEPARATOR ", "
#define SEPARATOR_LEN 2 // strlen( SEPARATOR )

static void print_csp_name_internal( const char *name, size_t *line_len, int last )
{
    if( name )
    {
        size_t name_len = strlen( name );
        if( *line_len + name_len > (80 - SEPARATOR_LEN) )
        {
            printf( "\n" INDENT );
            *line_len = INDENT_LEN;
        }
        printf( "%s", name );
        *line_len += name_len;
        if( !last )
        {
            printf( SEPARATOR );
            *line_len += SEPARATOR_LEN;
        }
    }
}

455
456
457
458
459
460
static void print_csp_names( int longhelp )
{
    if( longhelp < 2 )
        return;
    printf( "                              - valid csps for `raw' demuxer:\n" );
    printf( INDENT );
461
    size_t line_len = INDENT_LEN;
462
    for( int i = X264_CSP_NONE+1; i < X264_CSP_CLI_MAX; i++ )
463
        print_csp_name_internal( x264_cli_csps[i].name, &line_len, i == X264_CSP_CLI_MAX-1 );
464
465
466
467
#if HAVE_LAVF
    printf( "\n" );
    printf( "                              - valid csps for `lavf' demuxer:\n" );
    printf( INDENT );
468
    line_len = INDENT_LEN;
469
    for( enum AVPixelFormat i = AV_PIX_FMT_NONE+1; i < AV_PIX_FMT_NB; i++ )
470
        print_csp_name_internal( av_get_pix_fmt_name( i ), &line_len, i == AV_PIX_FMT_NB-1 );
471
472
473
474
#endif
    printf( "\n" );
}

Anton Mitrofanov's avatar
Anton Mitrofanov committed
475
static void help( x264_param_t *defaults, int longhelp )
Laurent Aimar's avatar
Laurent Aimar committed
476
{
477
    char buf[50];
478
#define H0 printf
Anton Mitrofanov's avatar
Anton Mitrofanov committed
479
480
#define H1 if( longhelp >= 1 ) printf
#define H2 if( longhelp == 2 ) printf
481
    H0( "x264 core:%d%s\n"
482
        "Syntax: x264 [options] -o outfile infile\n"
483
        "\n"
484
485
        "Infile can be raw (in which case resolution is required),\n"
        "  or YUV4MPEG (*.y4m),\n"
486
        "  or Avisynth if compiled with support (%s).\n"
487
        "  or libav* formats if compiled with lavf support (%s) or ffms support (%s).\n"
488
489
490
        "Outfile type is selected by filename:\n"
        " .264 -> Raw bytestream\n"
        " .mkv -> Matroska\n"
Kieran Kunhya's avatar
Kieran Kunhya committed
491
        " .flv -> Flash Video\n"
492
        " .mp4 -> MP4 if compiled with GPAC or L-SMASH support (%s)\n"
493
        "Output bit depth: %s\n."
494
495
496
        "\n"
        "Options:\n"
        "\n"
Fiona Glaser's avatar
Fiona Glaser committed
497
498
499
        "  -h, --help                  List basic options\n"
        "      --longhelp              List more options\n"
        "      --fullhelp              List all options\n"
500
501
        "\n",
        X264_BUILD, X264_VERSION,
Steven Walters's avatar
Steven Walters committed
502
#if HAVE_AVS
503
504
505
506
        "yes",
#else
        "no",
#endif
Steven Walters's avatar
Steven Walters committed
507
#if HAVE_LAVF
508
509
510
511
        "yes",
#else
        "no",
#endif
Steven Walters's avatar
Steven Walters committed
512
#if HAVE_FFMS
513
        "yes",
Loren Merritt's avatar
Loren Merritt committed
514
#else
515
        "no",
Loren Merritt's avatar
Loren Merritt committed
516
#endif
Steven Walters's avatar
Steven Walters committed
517
#if HAVE_GPAC
518
519
520
        "gpac",
#elif HAVE_LSMASH
        "lsmash",
Loren Merritt's avatar
Loren Merritt committed
521
#else
522
        "no",
Loren Merritt's avatar
Loren Merritt committed
523
#endif
524
525
526
527
528
529
530
531
532
#if HAVE_BITDEPTH8 && HAVE_BITDEPTH10
        "8/10"
#elif HAVE_BITDEPTH8
        "8"
#elif HAVE_BITDEPTH10
        "10"
#else
        "none"
#endif
533
      );
Fiona Glaser's avatar
Fiona Glaser committed
534
535
536
    H0( "Example usage:\n" );
    H0( "\n" );
    H0( "      Constant quality mode:\n" );
537
    H0( "            x264 --crf 24 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
538
539
    H0( "\n" );
    H0( "      Two-pass with a bitrate of 1000kbps:\n" );
540
541
    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
542
543
    H0( "\n" );
    H0( "      Lossless:\n" );
Fiona Glaser's avatar
Fiona Glaser committed
544
    H0( "            x264 --qp 0 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
545
546
    H0( "\n" );
    H0( "      Maximum PSNR at the cost of speed and visual quality:\n" );
547
    H0( "            x264 --preset placebo --tune psnr -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
548
549
    H0( "\n" );
    H0( "      Constant bitrate at 1000kbps with a 2 second-buffer:\n");
550
    H0( "            x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>\n" );
Fiona Glaser's avatar
Fiona Glaser committed
551
    H0( "\n" );
552
553
    H0( "Presets:\n" );
    H0( "\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
554
    H0( "      --profile <string>      Force the limits of an H.264 profile\n"
555
        "                                  Overrides all settings.\n" );
Harfe Leier's avatar
Harfe Leier committed
556
    H2(
Henrik Gramner's avatar
Henrik Gramner committed
557
558
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I420
#if HAVE_BITDEPTH8
Harfe Leier's avatar
Harfe Leier committed
559
        "                                  - baseline:\n"
560
        "                                    --no-8x8dct --bframes 0 --no-cabac\n"
561
562
563
        "                                    --cqm flat --weightp 0\n"
        "                                    No interlaced.\n"
        "                                    No lossless.\n"
564
        "                                  - main:\n"
565
566
        "                                    --no-8x8dct --cqm flat\n"
        "                                    No lossless.\n"
567
        "                                  - high:\n"
568
        "                                    No lossless.\n"
Henrik Gramner's avatar
Henrik Gramner committed
569
570
#endif
#if HAVE_BITDEPTH10
571
572
        "                                  - high10:\n"
        "                                    No lossless.\n"
Harfe Leier's avatar
Harfe Leier committed
573
        "                                    Support for bit depth 8-10.\n"
574
#endif
Henrik Gramner's avatar
Henrik Gramner committed
575
576
#endif
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I422
Harfe Leier's avatar
Harfe Leier committed
577
578
579
580
        "                                  - high422:\n"
        "                                    No lossless.\n"
        "                                    Support for bit depth 8-10.\n"
        "                                    Support for 4:2:0/4:2:2 chroma subsampling.\n"
581
#endif
Harfe Leier's avatar
Harfe Leier committed
582
583
584
585
        "                                  - 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(
586
        "                                  - "
Henrik Gramner's avatar
Henrik Gramner committed
587
588
589
590
591
592
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I420
#if HAVE_BITDEPTH8
        "baseline,main,high,"
#endif
#if HAVE_BITDEPTH10
        "high10,"
Harfe Leier's avatar
Harfe Leier committed
593
#endif
Henrik Gramner's avatar
Henrik Gramner committed
594
595
#endif
#if !X264_CHROMA_FORMAT || X264_CHROMA_FORMAT == X264_CSP_I422
596
597
        "high422,"
#endif
Henrik Gramner's avatar
Henrik Gramner committed
598
        "high444\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
599
    H0( "      --preset <string>       Use a preset to select encoding settings [medium]\n"
600
        "                                  Overridden by user settings.\n" );
601
    H2( "                                  - ultrafast:\n"
602
        "                                    --no-8x8dct --aq-mode 0 --b-adapt 0\n"
603
604
        "                                    --bframes 0 --no-cabac --no-deblock\n"
        "                                    --no-mbtree --me dia --no-mixed-refs\n"
Fiona Glaser's avatar
Fiona Glaser committed
605
606
607
        "                                    --partitions none --rc-lookahead 0 --ref 1\n"
        "                                    --scenecut 0 --subme 0 --trellis 0\n"
        "                                    --no-weightb --weightp 0\n"
608
        "                                  - superfast:\n"
609
        "                                    --no-mbtree --me dia --no-mixed-refs\n"
Fiona Glaser's avatar
Fiona Glaser committed
610
        "                                    --partitions i8x8,i4x4 --rc-lookahead 0\n"
611
        "                                    --ref 1 --subme 1 --trellis 0 --weightp 1\n"
612
        "                                  - veryfast:\n"
Fiona Glaser's avatar
Fiona Glaser committed
613
        "                                    --no-mixed-refs --rc-lookahead 10\n"
614
        "                                    --ref 1 --subme 2 --trellis 0 --weightp 1\n"
615
        "                                  - faster:\n"
616
617
        "                                    --no-mixed-refs --rc-lookahead 20\n"
        "                                    --ref 2 --subme 4 --weightp 1\n"
618
        "                                  - fast:\n"
619
        "                                    --rc-lookahead 30 --ref 2 --subme 6\n"
620
        "                                    --weightp 1\n"
621
        "                                  - medium:\n"
622
        "                                    Default settings apply.\n"
623
        "                                  - slow:\n"
624
625
        "                                    --direct auto --rc-lookahead 50 --ref 5\n"
        "                                    --subme 8 --trellis 2\n"
626
        "                                  - slower:\n"
627
628
629
        "                                    --b-adapt 2 --direct auto --me umh\n"
        "                                    --partitions all --rc-lookahead 60\n"
        "                                    --ref 8 --subme 9 --trellis 2\n"
630
        "                                  - veryslow:\n"
631
        "                                    --b-adapt 2 --bframes 8 --direct auto\n"
Fiona Glaser's avatar
Fiona Glaser committed
632
        "                                    --me umh --merange 24 --partitions all\n"
633
634
        "                                    --ref 16 --subme 10 --trellis 2\n"
        "                                    --rc-lookahead 60\n"
635
        "                                  - placebo:\n"
636
637
        "                                    --bframes 16 --b-adapt 2 --direct auto\n"
        "                                    --slow-firstpass --no-fast-pskip\n"
Fiona Glaser's avatar
Fiona Glaser committed
638
        "                                    --me tesa --merange 24 --partitions all\n"
639
        "                                    --rc-lookahead 60 --ref 16 --subme 11\n"
640
        "                                    --trellis 2\n" );
641
642
    else H0( "                                  - ultrafast,superfast,veryfast,faster,fast\n"
             "                                  - medium,slow,slower,veryslow,placebo\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
643
    H0( "      --tune <string>         Tune the settings for a particular type of source\n"
644
645
646
647
648
        "                              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"
649
        "                                    --deblock -1:-1 --psy-rd <unset>:0.15\n"
650
        "                                  - animation (psy tuning):\n"
651
        "                                    --bframes {+2} --deblock 1:1\n"
652
        "                                    --psy-rd 0.4:<unset> --aq-strength 0.6\n"
653
        "                                    --ref {Double if >1 else 1}\n"
654
        "                                  - grain (psy tuning):\n"
655
        "                                    --aq-strength 0.5 --no-dct-decimate\n"
656
        "                                    --deadzone-inter 6 --deadzone-intra 6\n"
657
        "                                    --deblock -2:-2 --ipratio 1.1\n"
658
659
        "                                    --pbratio 1.1 --psy-rd <unset>:0.25\n"
        "                                    --qcomp 0.8\n"
660
661
662
        "                                  - stillimage (psy tuning):\n"
        "                                    --aq-strength 1.2 --deblock -3:-3\n"
        "                                    --psy-rd 2.0:0.7\n"
663
        "                                  - psnr (psy tuning):\n"
664
        "                                    --aq-mode 0 --no-psy\n"
665
        "                                  - ssim (psy tuning):\n"
666
667
668
669
        "                                    --aq-mode 2 --no-psy\n"
        "                                  - fastdecode:\n"
        "                                    --no-cabac --no-deblock --no-weightb\n"
        "                                    --weightp 0\n"
670
        "                                  - zerolatency:\n"
Fiona Glaser's avatar
Fiona Glaser committed
671
672
673
        "                                    --bframes 0 --force-cfr --no-mbtree\n"
        "                                    --sync-lookahead 0 --sliced-threads\n"
        "                                    --rc-lookahead 0\n" );
674
675
    else H0( "                                  - psy tunings: film,animation,grain,\n"
             "                                                 stillimage,psnr,ssim\n"
676
             "                                  - other tunings: fastdecode,zerolatency\n" );
677
    H2( "      --slow-firstpass        Don't force these faster settings with --pass 1:\n"
678
679
680
        "                                  --no-8x8dct --me dia --partitions none\n"
        "                                  --ref 1 --subme {2 if >2 else unchanged}\n"
        "                                  --trellis 0 --fast-pskip\n" );
681
    else H1( "      --slow-firstpass        Don't force faster settings with --pass 1\n" );
682
    H0( "\n" );
683
684
    H0( "Frame-type options:\n" );
    H0( "\n" );
685
    H0( "  -I, --keyint <integer or \"infinite\"> Maximum GOP size [%d]\n", defaults->i_keyint_max );
Fiona Glaser's avatar
Fiona Glaser committed
686
    H2( "  -i, --min-keyint <integer>  Minimum GOP size [auto]\n" );
Fiona Glaser's avatar
Fiona Glaser committed
687
688
    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
689
    H2( "      --intra-refresh         Use Periodic Intra Refresh instead of IDR frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
690
    H1( "  -b, --bframes <integer>     Number of B-frames between I and P [%d]\n", defaults->i_bframe );
Fiona Glaser's avatar
Fiona Glaser committed
691
    H1( "      --b-adapt <integer>     Adaptive B-frame decision method [%d]\n"
692
693
694
695
        "                                  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
696
    H2( "      --b-bias <integer>      Influences how often B-frames are used [%d]\n", defaults->i_bframe_bias );
Lamont Alston's avatar
Lamont Alston committed
697
698
    H1( "      --b-pyramid <string>    Keep some B-frames as references [%s]\n"
        "                                  - none: Disabled\n"
Fiona Glaser's avatar
Fiona Glaser committed
699
        "                                  - strict: Strictly hierarchical pyramid\n"
Lamont Alston's avatar
Lamont Alston committed
700
701
        "                                  - normal: Non-strict (not Blu-ray compatible)\n",
        strtable_lookup( x264_b_pyramid_names, defaults->i_bframe_pyramid ) );
702
    H1( "      --open-gop              Use recovery points to close GOPs\n"
Lamont Alston's avatar
Lamont Alston committed
703
        "                              Only available with b-frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
704
705
    H1( "      --no-cabac              Disable CABAC\n" );
    H1( "  -r, --ref <integer>         Number of reference frames [%d]\n", defaults->i_frame_reference );
706
    H1( "      --no-deblock            Disable loop filter\n" );
Fiona Glaser's avatar
Fiona Glaser committed
707
    H1( "  -f, --deblock <alpha:beta>  Loop filter parameters [%d:%d]\n",
708
                                       defaults->i_deblocking_filter_alphac0, defaults->i_deblocking_filter_beta );
Fiona Glaser's avatar
Fiona Glaser committed
709
    H2( "      --slices <integer>      Number of slices per frame; forces rectangular\n"
Fiona Glaser's avatar
Fiona Glaser committed
710
        "                              slices and is overridden by other slicing options\n" );
Fiona Glaser's avatar
Fiona Glaser committed
711
    else H1( "      --slices <integer>      Number of slices per frame\n" );
Fiona Glaser's avatar
Fiona Glaser committed
712
713
    H2( "      --slices-max <integer>  Absolute maximum slices per frame; overrides\n"
        "                              slice-max-size/slice-max-mbs when necessary\n" );
Fiona Glaser's avatar
Fiona Glaser committed
714
    H2( "      --slice-max-size <integer> Limit the size of each slice in bytes\n");
Fiona Glaser's avatar
Fiona Glaser committed
715
716
    H2( "      --slice-max-mbs <integer> Limit the size of each slice in macroblocks (max)\n");
    H2( "      --slice-min-mbs <integer> Limit the size of each slice in macroblocks (min)\n");
717
718
    H0( "      --tff                   Enable interlaced mode (top field first)\n" );
    H0( "      --bff                   Enable interlaced mode (bottom field first)\n" );
719
    H2( "      --constrained-intra     Enable constrained intra prediction.\n" );
Kieran Kunhya's avatar
Kieran Kunhya committed
720
721
722
723
724
    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" );
725
726
727
728
729
730
    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"
731
        "                                  - 5: frame alternation - one view per frame\n"
732
733
        "                                  - 6: mono - 2D frame without any frame packing\n"
        "                                  - 7: tile format - L is on top-left, R split across\n" );
734
735
736
    H0( "\n" );
    H0( "Ratecontrol:\n" );
    H0( "\n" );
737
    H1( "  -q, --qp <integer>          Force constant QP (0-%d, 0=lossless)\n", QP_MAX );
738
    H0( "  -B, --bitrate <integer>     Set bitrate (kbit/s)\n" );
739
    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
740
    H1( "      --rc-lookahead <integer> Number of frames for frametype lookahead [%d]\n", defaults->rc.i_lookahead );
741
742
    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
743
    H2( "      --vbv-init <float>      Initial VBV buffer occupancy [%.1f]\n", defaults->rc.f_vbv_buffer_init );
Fiona Glaser's avatar
Fiona Glaser committed
744
745
    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
746
    H2( "      --qpmin <integer>       Set min QP [%d]\n", defaults->rc.i_qp_min );
747
    H2( "      --qpmax <integer>       Set max QP [%d]\n", X264_MIN( defaults->rc.i_qp_max, QP_MAX ) );
Fiona Glaser's avatar
Fiona Glaser committed
748
    H2( "      --qpstep <integer>      Set max QP step [%d]\n", defaults->rc.i_qp_step );
749
    H2( "      --ratetol <float>       Tolerance of ABR ratecontrol and VBV [%.1f]\n", defaults->rc.f_rate_tolerance );
Fiona Glaser's avatar
Fiona Glaser committed
750
751
752
753
    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"
754
        "                                  - 0: Disabled\n"
Anton Mitrofanov's avatar
Anton Mitrofanov committed
755
        "                                  - 1: Variance AQ (complexity mask)\n"
756
757
        "                                  - 2: Auto-variance AQ\n"
        "                                  - 3: Auto-variance AQ with bias to dark scenes\n", defaults->rc.i_aq_mode );
Fiona Glaser's avatar
Fiona Glaser committed
758
759
760
    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
761
762
    H0( "  -p, --pass <integer>        Enable multipass ratecontrol\n"
        "                                  - 1: First pass, creates stats file\n"
Fiona Glaser's avatar
Fiona Glaser committed
763
764
765
766
767
768
769
770
771
        "                                  - 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"
772
773
774
775
        "                                  <start frame>,<end frame>,<option>\n"
        "                                  where <option> is either\n"
        "                                      q=<integer> (force QP)\n"
        "                                  or  b=<float> (bitrate multiplier)\n" );
776
    H2( "      --qpfile <string>       Force frametypes and QPs for some or all frames\n"
777
        "                              Format of each line: framenumber frametype QP\n"
Fiona Glaser's avatar
Fiona Glaser committed
778
        "                              QP is optional (none lets x264 choose). Frametypes: I,i,K,P,B,b.\n"
Lamont Alston's avatar
Lamont Alston committed
779
        "                                  K=<I or i> depending on open-gop setting\n"
780
        "                              QPs are restricted by qpmin/qpmax.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
781
782
783
784
    H1( "\n" );
    H1( "Analysis:\n" );
    H1( "\n" );
    H1( "  -A, --partitions <string>   Partitions to consider [\"p8x8,b8x8,i8x8,i4x4\"]\n"
785
786
787
        "                                  - p8x8, p4x4, b8x8, i8x8, i4x4\n"
        "                                  - none, all\n"
        "                                  (p4x4 requires p8x8. i8x8 requires --8x8dct.)\n" );
Fiona Glaser's avatar
Fiona Glaser committed
788
    H1( "      --direct <string>       Direct MV prediction mode [\"%s\"]\n"
789
790
        "                                  - none, spatial, temporal, auto\n",
                                       strtable_lookup( x264_direct_pred_names, defaults->analyse.i_direct_mv_pred ) );
Fiona Glaser's avatar
Fiona Glaser committed
791
    H2( "      --no-weightb            Disable weighted prediction for B-frames\n" );
Fiona Glaser's avatar
Fiona Glaser committed
792
    H1( "      --weightp <integer>     Weighted prediction for P-frames [%d]\n"
Fiona Glaser's avatar
Fiona Glaser committed
793
        "                                  - 0: Disabled\n"
794
795
        "                                  - 1: Weighted refs\n"
        "                                  - 2: Weighted refs + Duplicates\n", defaults->analyse.i_weighted_pred );
Fiona Glaser's avatar
Fiona Glaser committed
796
    H1( "      --me <string>           Integer pixel motion estimation method [\"%s\"]\n",
797
                                       strtable_lookup( x264_motion_est_names, defaults->analyse.i_me_method ) );
Fiona Glaser's avatar
Fiona Glaser committed
798
    H2( "                                  - dia: diamond search, radius 1 (fast)\n"
799
800
        "                                  - hex: hexagonal search, radius 2\n"
        "                                  - umh: uneven multi-hexagon search\n"
801
802
        "                                  - esa: exhaustive search\n"
        "                                  - tesa: hadamard exhaustive search (slow)\n" );
Fiona Glaser's avatar
Fiona Glaser committed
803
804
805
806
807
808
    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"
809
        "                                  - 1: SAD mode decision, one qpel iteration\n"
810
811
812
813
814
        "                                  - 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
815
        "                                  - 9: RD refinement for all frames\n"
816
817
818
        "                                  - 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
819
    H1( "      --psy-rd <float:float>  Strength of psychovisual optimization [\"%.1f:%.1f\"]\n"
820
        "                                  #1: RD (requires subme>=6)\n"
821
        "                                  #2: Trellis (requires trellis, experimental)\n",
Loren Merritt's avatar
Loren Merritt committed
822
                                       defaults->analyse.f_psy_rd, defaults->analyse.f_psy_trellis );
Fiona Glaser's avatar
Fiona Glaser committed
823
    H2( "      --no-psy                Disable all visual optimizations that worsen\n"
Fiona Glaser's avatar
Fiona Glaser committed
824
        "                              both PSNR and SSIM.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
825
826
827
    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
828
    H1( "  -t, --trellis <integer>     Trellis RD quantization. [%d]\n"
829
830
831
        "                                  - 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
832
833
834
835
836
837
838
839
    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"
840
        "                                  - jvt, flat\n" );
Fiona Glaser's avatar
Fiona Glaser committed
841
842
843
    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"
844
        "                                  Takes a comma-separated list of 16 integers.\n" );
Fiona Glaser's avatar
Fiona Glaser committed
845
    H2( "      --cqm8 <list>           Set all 8x8 quant matrices\n"
846
        "                                  Takes a comma-separated list of 64 integers.\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
847
    H2( "      --cqm4i, --cqm4p, --cqm8i, --cqm8p <list>\n"
848
        "                              Set both luma and chroma quant matrices\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
849
    H2( "      --cqm4iy, --cqm4ic, --cqm4py, --cqm4pc <list>\n"
850
        "                              Set individual quant matrices\n" );
Fiona Glaser's avatar
Fiona Glaser committed
851
852
853
854
855
856
    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"
857
858
        "                                  - undef, show, crop\n",
                                       strtable_lookup( x264_overscan_names, defaults->vui.i_overscan ) );
Fiona Glaser's avatar
Fiona Glaser committed
859
    H2( "      --videoformat <string>  Specify video format [\"%s\"]\n"
860
861
        "                                  - component, pal, ntsc, secam, mac, undef\n",
                                       strtable_lookup( x264_vidformat_names, defaults->vui.i_vidformat ) );
862
863
    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
864
    H2( "      --colorprim <string>    Specify color primaries [\"%s\"]\n"
865
        "                                  - undef, bt709, bt470m, bt470bg, smpte170m,\n"
866
867
        "                                    smpte240m, film, bt2020, smpte428,\n"
        "                                    smpte431, smpte432\n",
868
                                       strtable_lookup( x264_colorprim_names, defaults->vui.i_colorprim ) );
Fiona Glaser's avatar
Fiona Glaser committed
869
    H2( "      --transfer <string>     Specify transfer characteristics [\"%s\"]\n"
870
871
872
        "                                  - undef, bt709, bt470m, bt470bg, smpte170m,\n"
        "                                    smpte240m, linear, log100, log316,\n"
        "                                    iec61966-2-4, bt1361e, iec61966-2-1,\n"
873
874
        "                                    bt2020-10, bt2020-12, smpte2084, smpte428,\n"
        "                                    arib-std-b67\n",
875
                                       strtable_lookup( x264_transfer_names, defaults->vui.i_transfer ) );
Fiona Glaser's avatar
Fiona Glaser committed
876
    H2( "      --colormatrix <string>  Specify color matrix setting [\"%s\"]\n"
877
        "                                  - undef, bt709, fcc, bt470bg, smpte170m,\n"
878
        "                                    smpte240m, GBR, YCgCo, bt2020nc, bt2020c,\n"
879
880
        "                                    smpte2085, chroma-derived-nc,\n"
        "                                    chroma-derived-c, ICtCp\n",
881
                                       strtable_lookup( x264_colmatrix_names, defaults->vui.i_colmatrix ) );
Fiona Glaser's avatar
Fiona Glaser committed
882
    H2( "      --chromaloc <integer>   Specify chroma sample location (0 to 5) [%d]\n",
883
                                       defaults->vui.i_chroma_loc );
884
885
886
887
    H2( "      --alternative-transfer <string> Specify an alternative transfer\n"
        "                              characteristics [\"%s\"]\n"
        "                                  - same values as --transfer\n",
                                       strtable_lookup( x264_transfer_names, defaults->i_alternative_transfer ) );
888
889
    H2( "      --nal-hrd <string>      Signal HRD information (requires vbv-bufsize)\n"
        "                                  - none, vbr, cbr (cbr not allowed in .mp4)\n" );
Fiona Glaser's avatar
Fiona Glaser committed
890
891
    H2( "      --filler                Force hard-CBR and generate filler (implied by\n"
        "                              --nal-hrd cbr)\n" );
892
    H2( "      --pic-struct            Force pic_struct in Picture Timing SEI\n" );
893
894
    H2( "      --crop-rect <string>    Add 'left,top,right,bottom' to the bitstream-level\n"
        "                              cropping rectangle\n" );
895

896
897
898
    H0( "\n" );
    H0( "Input/Output:\n" );
    H0( "\n" );
Anton Mitrofanov's avatar
Anton Mitrofanov committed
899
    H0( "  -o, --output <string>       Specify output file\n" );
900
901
902
903
    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 ) );
904
    H1( "      --input-fmt <string>    Specify input file format (requires lavf support)\n" );
905
906
    H1( "      --input-csp <string>    Specify input colorspace format for raw input\n" );
    print_csp_names( longhelp );
Fiona Glaser's avatar
Fiona Glaser committed
907
908
    H1( "      --output-csp <string>   Specify output colorspace [\"%s\"]\n"
        "                                  - %s\n", output_csp_names[0], stringify_names( buf, output_csp_names ) );
909
    H1( "      --input-depth <integer> Specify input bit depth for raw input\n" );
910
    H1( "      --output-depth <integer> Specify output bit depth\n" );
911
912
    H1( "      --input-range <string>  Specify input color range [\"%s\"]\n"
        "                                  - %s\n", range_names[0], stringify_names( buf, range_names ) );
913
    H1( "      --input-res <intxint>   Specify input resolution (width x height)\n" );
914
    H1( "      --index <string>        Filename for input index file\n" );
915
916
917
918
919
    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" );
920
    H1( "      --bluray-compat         Enable compatibility hacks for Blu-ray support\n" );
921
922
    H1( "      --avcintra-class <integer> Use compatibility hacks for AVC-Intra class\n"
        "                                  - 50, 100, 200\n" );
923
924
    H1( "      --stitchable            Don't optimize headers based on video content\n"
        "                              Ensures ability to recombine a segmented encode\n" );
Fiona Glaser's avatar
Fiona Glaser committed
925
926
927
    H1( "\n" );
    H1( "  -v, --verbose               Print stats for each frame\n" );
    H1( "      --no-progress           Don't show the progress indicator while encoding\n" );
928
    H0( "      --quiet                 Quiet Mode\n" );
929
930
931
    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
932
933
934
    H1( "      --psnr                  Enable PSNR computation\n" );
    H1( "      --ssim                  Enable SSIM computation\n" );
    H1( "      --threads <integer>     Force a specific number of threads\n" );
Fiona Glaser's avatar
Fiona Glaser committed
935
    H2( "      --lookahead-threads <integer> Force a specific number of lookahead threads\n" );
936
    H2( "      --sliced-threads        Low-latency but lower-efficiency threading\n" );
Fiona Glaser's avatar
Fiona Glaser committed
937
938
939
    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" );
940
941
    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
942
943
    H2( "      --asm <integer>         Override CPU detection\n" );
    H2( "      --no-asm                Disable all CPU optimizations\n" );
Steve Borho's avatar
Steve Borho committed
944
945
    H2( "      --opencl                Enable use of OpenCL\n" );
    H2( "      --opencl-clbin <string> Specify path of compiled OpenCL kernel cache\n" );
Kieran Kunhya's avatar
Kieran Kunhya committed
946
    H2( "      --opencl-device <integer> Specify OpenCL device ordinal\n" );
Fiona Glaser's avatar
Fiona Glaser committed
947
948
949
    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" );
950
    H2( "      --force-cfr             Force constant framerate timestamp generation\n" );
Yusuke Nakamura's avatar
Yusuke Nakamura committed
951
952
953
954
955
    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" );
956
    H2( "      --dts-compress          Eliminate initial delay with container DTS hack\n" );
957
    H0( "\n" );
958
959
    H0( "Filtering:\n" );
    H0( "\n" );
960
961
962
963
    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" );
964
965
966
967
    H0( "      Available filters:\n" );
    x264_register_vid_filters();
    x264_vid_filter_help( longhelp );
    H0( "\n" );
Laurent Aimar's avatar
Laurent Aimar committed
968
969
}

Anton Mitrofanov's avatar
Anton Mitrofanov committed
970
typedef enum
Anton Mitrofanov's avatar
Anton Mitrofanov committed
971
{
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
    OPT_FRAMES = 256,
    OPT_SEEK,
    OPT_QPFILE,
    OPT_THREAD_INPUT,
    OPT_QUIET,
    OPT_NOPROGRESS,
    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,
993
994
    OPT_LOG_LEVEL,
    OPT_VIDEO_FILTER,
995
    OPT_INPUT_FMT,
996
    OPT_INPUT_RES,
997
    OPT_INPUT_CSP,
998
    OPT_INPUT_DEPTH,
999
    OPT_OUTPUT_DEPTH,
Fiona Glaser's avatar
Fiona Glaser committed
1000
    OPT_DTS_COMPRESSION,
1001
1002
1003
    OPT_OUTPUT_CSP,
    OPT_INPUT_RANGE,
    OPT_RANGE
1004
} OptionsOPT;
1005
1006
1007