X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=x264.c;h=e584c0b4976656a9178780ce89b1138ca3776292;hb=898579cca8b0d2f7a63a4c3f0534226529e6e933;hp=ec342d4e4922ea0c106f396b4a0fa1a4dc6a3d6c;hpb=7ff23daa52db92d7fcc4633e8ad21f4f6a9107a5;p=x264 diff --git a/x264.c b/x264.c index ec342d4e..e584c0b4 100644 --- a/x264.c +++ b/x264.c @@ -1,11 +1,12 @@ /***************************************************************************** - * x264: h264 encoder testing program. + * x264: top-level x264cli functions ***************************************************************************** - * Copyright (C) 2003-2008 x264 project + * Copyright (C) 2003-2010 x264 project * * Authors: Loren Merritt * Laurent Aimar * Steven Walters + * Fiona Glaser * Kieran Kunhya * * This program is free software; you can redistribute it and/or modify @@ -21,6 +22,9 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. + * + * This program is also available under a commercial proprietary license. + * For more information, contact us at licensing@x264.com. *****************************************************************************/ #include @@ -31,9 +35,12 @@ #include #include "common/common.h" -#include "common/cpu.h" -#include "x264.h" -#include "muxers.h" +#include "x264cli.h" +#include "input/input.h" +#include "output/output.h" +#include "filters/filters.h" + +#define FAIL_IF_ERROR( cond, ... ) FAIL_IF_ERR( cond, "x264", __VA_ARGS__ ) #ifdef _WIN32 #include @@ -41,10 +48,25 @@ #define SetConsoleTitle(t) #endif +#if HAVE_LAVF +#undef DECLARE_ALIGNED +#include +#include +#include +#endif + +#if HAVE_SWSCALE +#include +#endif + +#if HAVE_FFMS +#include +#endif + /* Ctrl-C handler */ -static int b_ctrl_c = 0; -static int b_exit_on_ctrl_c = 0; -static void SigIntHandler( int a ) +static volatile int b_ctrl_c = 0; +static int b_exit_on_ctrl_c = 0; +static void sigint_handler( int a ) { if( b_exit_on_ctrl_c ) exit(0); @@ -62,22 +84,25 @@ typedef struct { int i_pulldown; } cli_opt_t; -/* i/o file operation function pointer structs */ +/* file i/o operation structs */ cli_input_t input; static cli_output_t output; +/* video filter operation struct */ +static cli_vid_filter_t filter; + static const char * const demuxer_names[] = { "auto", - "yuv", + "raw", "y4m", -#ifdef AVS_INPUT +#if HAVE_AVS "avs", #endif -#ifdef LAVF_INPUT +#if HAVE_LAVF "lavf", #endif -#ifdef FFMS_INPUT +#if HAVE_FFMS "ffms", #endif 0 @@ -89,13 +114,14 @@ static const char * const muxer_names[] = "raw", "mkv", "flv", -#ifdef MP4_OUTPUT +#if HAVE_GPAC "mp4", #endif 0 }; static const char * const pulldown_names[] = { "none", "22", "32", "64", "double", "triple", "euro", 0 }; +static const char * const log_level_names[] = { "none", "error", "warning", "info", "debug", 0 }; typedef struct{ int mod; @@ -120,7 +146,7 @@ enum pulldown_type_e static const cli_pulldown_t pulldown_values[] = { - [X264_PULLDOWN_22] = {1, {TB}, 2.0}, + [X264_PULLDOWN_22] = {1, {TB}, 1.0}, [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}, @@ -137,20 +163,98 @@ static const cli_pulldown_t pulldown_values[] = // 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 }; -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 ); +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 ); + +/* 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 ); +} + +static void print_version_info() +{ +#ifdef X264_POINTVER + printf( "x264 "X264_POINTVER"\n" ); +#else + printf( "x264 0.%d.X\n", X264_BUILD ); +#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 ); +#endif + printf( "built on " __DATE__ ", " ); +#ifdef __GNUC__ + printf( "gcc: " __VERSION__ "\n" ); +#else + printf( "using a non-gcc compiler\n" ); +#endif + printf( "configuration: --bit-depth=%d\n", x264_bit_depth ); + printf( "x264 license: " ); +#if HAVE_GPL + printf( "GPL version 2 or later\n" ); +#else + printf( "Non-GPL commercial\n" ); +#endif +#if HAVE_SWSCALE + const char *license = swscale_license(); + printf( "libswscale%s%s license: %s\n", HAVE_LAVF ? "/libavformat" : "", HAVE_FFMS ? "/ffmpegsource" : "" , license ); + 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 +} -/**************************************************************************** - * main: - ****************************************************************************/ int main( int argc, char **argv ) { x264_param_t param; cli_opt_t opt; int ret; -#ifdef PTW32_STATIC_LIB +#if PTW32_STATIC_LIB pthread_win32_process_attach_np(); pthread_win32_thread_attach_np(); #endif @@ -161,15 +265,15 @@ int main( int argc, char **argv ) #endif /* Parse command line */ - if( Parse( argc, argv, ¶m, &opt ) < 0 ) + if( parse( argc, argv, ¶m, &opt ) < 0 ) return -1; /* Control-C handler */ - signal( SIGINT, SigIntHandler ); + signal( SIGINT, sigint_handler ); - ret = Encode( ¶m, &opt ); + ret = encode( ¶m, &opt ); -#ifdef PTW32_STATIC_LIB +#if PTW32_STATIC_LIB pthread_win32_thread_detach_np(); pthread_win32_process_detach_np(); #endif @@ -177,10 +281,10 @@ int main( int argc, char **argv ) return ret; } -static char const *strtable_lookup( const char * const table[], int index ) +static char const *strtable_lookup( const char * const table[], int idx ) { int i = 0; while( table[i] ) i++; - return ( ( index >= 0 && index < i ) ? table[ index ] : "???" ); + return ( ( idx >= 0 && idx < i ) ? table[ idx ] : "???" ); } static char *stringify_names( char *buf, const char * const names[] ) @@ -196,20 +300,56 @@ static char *stringify_names( char *buf, const char * const names[] ) return buf; } -/***************************************************************************** - * Help: - *****************************************************************************/ -static void Help( x264_param_t *defaults, int longhelp ) +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 ); + int line_len = strlen( INDENT ); + for( enum PixelFormat i = PIX_FMT_NONE+1; i < PIX_FMT_NB; i++ ) + { + const char *pfname = av_pix_fmt_descriptors[i].name; + int 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; + } + } +#endif + printf( "\n" ); +} + +static void help( x264_param_t *defaults, int longhelp ) { char buf[50]; #define H0 printf #define H1 if(longhelp>=1) printf #define H2 if(longhelp==2) printf H0( "x264 core:%d%s\n" - "Syntax: x264 [options] -o outfile infile [widthxheight]\n" + "Syntax: x264 [options] -o outfile infile\n" "\n" - "Infile can be raw YUV 4:2:0 (in which case resolution is required),\n" - " or YUV4MPEG 4:2:0 (*.y4m),\n" + "Infile can be raw (in which case resolution is required),\n" + " or YUV4MPEG (*.y4m),\n" " or Avisynth if compiled with support (%s).\n" " or libav* formats if compiled with lavf support (%s) or ffms support (%s).\n" "Outfile type is selected by filename:\n" @@ -217,6 +357,7 @@ static void Help( x264_param_t *defaults, int longhelp ) " .mkv -> Matroska\n" " .flv -> Flash Video\n" " .mp4 -> MP4 if compiled with GPAC support (%s)\n" + "Output bit depth: %d (configured at compile time)\n" "\n" "Options:\n" "\n" @@ -225,26 +366,27 @@ static void Help( x264_param_t *defaults, int longhelp ) " --fullhelp List all options\n" "\n", X264_BUILD, X264_VERSION, -#ifdef AVS_INPUT +#if HAVE_AVS "yes", #else "no", #endif -#ifdef LAVF_INPUT +#if HAVE_LAVF "yes", #else "no", #endif -#ifdef FFMS_INPUT +#if HAVE_FFMS "yes", #else "no", #endif -#ifdef MP4_OUTPUT - "yes" +#if HAVE_GPAC + "yes", #else - "no" + "no", #endif + x264_bit_depth ); H0( "Example usage:\n" ); H0( "\n" ); @@ -256,7 +398,7 @@ static void Help( x264_param_t *defaults, int longhelp ) H0( " x264 --pass 2 --bitrate 1000 -o \n" ); H0( "\n" ); H0( " Lossless:\n" ); - H0( " x264 --crf 0 -o \n" ); + H0( " x264 --qp 0 -o \n" ); H0( "\n" ); H0( " Maximum PSNR at the cost of speed and visual quality:\n" ); H0( " x264 --preset placebo --tune psnr -o \n" ); @@ -266,35 +408,44 @@ static void Help( x264_param_t *defaults, int longhelp ) H0( "\n" ); H0( "Presets:\n" ); H0( "\n" ); - H0( " --profile Force the limits of an H.264 profile [high]\n" + H0( " --profile Force the limits of an H.264 profile\n" " Overrides all settings.\n" ); H2( " - baseline:\n" " --no-8x8dct --bframes 0 --no-cabac\n" - " --cqm flat --weightp 0 No interlaced\n" - " No lossless\n" + " --cqm flat --weightp 0\n" + " No interlaced.\n" + " No lossless.\n" " - main:\n" - " --no-8x8dct --cqm flat No lossless\n" + " --no-8x8dct --cqm flat\n" + " No lossless.\n" " - high:\n" - " No lossless\n" ); - else H0( " - baseline,main,high\n" ); + " No lossless.\n" + " - high10:\n" + " No lossless.\n" + " Support for bit depth 8-10.\n" ); + else H0( " - baseline,main,high,high10\n" ); H0( " --preset Use a preset to select encoding settings [medium]\n" " Overridden by user settings.\n" ); H2( " - ultrafast:\n" " --no-8x8dct --aq-mode 0 --b-adapt 0\n" " --bframes 0 --no-cabac --no-deblock\n" " --no-mbtree --me dia --no-mixed-refs\n" - " --partitions none --ref 1 --scenecut 0\n" - " --subme 0 --trellis 0 --no-weightb\n" - " --weightp 0\n" - " - veryfast:\n" + " --partitions none --rc-lookahead 0 --ref 1\n" + " --scenecut 0 --subme 0 --trellis 0\n" + " --no-weightb --weightp 0\n" + " - superfast:\n" " --no-mbtree --me dia --no-mixed-refs\n" - " --partitions i8x8,i4x4 --ref 1\n" - " --subme 1 --trellis 0 --weightp 0\n" + " --partitions i8x8,i4x4 --rc-lookahead 0\n" + " --ref 1 --subme 1 --trellis 0 --weightp 1\n" + " - veryfast:\n" + " --no-mixed-refs --rc-lookahead 10\n" + " --ref 1 --subme 2 --trellis 0 --weightp 1\n" " - faster:\n" - " --no-mbtree --no-mixed-refs --ref 2\n" - " --subme 4 --weightp 1\n" + " --no-mixed-refs --rc-lookahead 20\n" + " --ref 2 --subme 4 --weightp 1\n" " - fast:\n" " --rc-lookahead 30 --ref 2 --subme 6\n" + " --weightp 1\n" " - medium:\n" " Default settings apply.\n" " - slow:\n" @@ -315,8 +466,8 @@ static void Help( x264_param_t *defaults, int longhelp ) " --me tesa --merange 24 --partitions all\n" " --rc-lookahead 60 --ref 16 --subme 10\n" " --trellis 2\n" ); - else H0( " - ultrafast,veryfast,faster,fast,medium\n" - " - slow,slower,veryslow,placebo\n" ); + else H0( " - ultrafast,superfast,veryfast,faster,fast\n" + " - medium,slow,slower,veryslow,placebo\n" ); H0( " --tune Tune the settings for a particular type of source\n" " or situation\n" " Overridden by user settings.\n" @@ -334,6 +485,9 @@ static void Help( x264_param_t *defaults, int longhelp ) " --deblock -2:-2 --ipratio 1.1 \n" " --pbratio 1.1 --psy-rd :0.25\n" " --qcomp 0.8\n" + " - stillimage (psy tuning):\n" + " --aq-strength 1.2 --deblock -3:-3\n" + " --psy-rd 2.0:0.7\n" " - psnr (psy tuning):\n" " --aq-mode 0 --no-psy\n" " - ssim (psy tuning):\n" @@ -342,16 +496,22 @@ static void Help( x264_param_t *defaults, int longhelp ) " --no-cabac --no-deblock --no-weightb\n" " --weightp 0\n" " - zerolatency:\n" - " --bframes 0 --force-cfr --rc-lookahead 0\n" - " --sync-lookahead 0 --sliced-threads\n" ); - else H0( " - psy tunings: film,animation,grain,psnr,ssim\n" + " --bframes 0 --force-cfr --no-mbtree\n" + " --sync-lookahead 0 --sliced-threads\n" + " --rc-lookahead 0\n" ); + else H0( " - psy tunings: film,animation,grain,\n" + " stillimage,psnr,ssim\n" " - other tunings: fastdecode,zerolatency\n" ); - H1( " --slow-firstpass Don't use faster settings with --pass 1\n" ); + H2( " --slow-firstpass Don't force these faster settings with --pass 1:\n" + " --no-8x8dct --me dia --partitions none\n" + " --ref 1 --subme {2 if >2 else unchanged}\n" + " --trellis 0 --fast-pskip\n" ); + else H1( " --slow-firstpass Don't force faster settings with --pass 1\n" ); H0( "\n" ); H0( "Frame-type options:\n" ); H0( "\n" ); - H0( " -I, --keyint Maximum GOP size [%d]\n", defaults->i_keyint_max ); - H2( " -i, --min-keyint Minimum GOP size [%d]\n", defaults->i_keyint_min ); + H0( " -I, --keyint Maximum GOP size [%d]\n", defaults->i_keyint_max ); + H2( " -i, --min-keyint Minimum GOP size [auto]\n" ); H2( " --no-scenecut Disable adaptive I-frame decision\n" ); H2( " --scenecut How aggressively to insert extra I-frames [%d]\n", defaults->i_scenecut_threshold ); H2( " --intra-refresh Use Periodic Intra Refresh instead of IDR frames\n" ); @@ -367,6 +527,12 @@ static void Help( x264_param_t *defaults, int longhelp ) " - strict: Strictly hierarchical pyramid\n" " - normal: Non-strict (not Blu-ray compatible)\n", strtable_lookup( x264_b_pyramid_names, defaults->i_bframe_pyramid ) ); + H1( " --open-gop Use recovery points to close GOPs [none]\n" + " - none: closed GOPs only\n" + " - normal: standard open GOPs\n" + " (not Blu-ray compatible)\n" + " - bluray: Blu-ray-compatible open GOPs\n" + " Only available with b-frames\n" ); H1( " --no-cabac Disable CABAC\n" ); H1( " -r, --ref Number of reference frames [%d]\n", defaults->i_frame_reference ); H1( " --no-deblock Disable loop filter\n" ); @@ -380,12 +546,24 @@ static void Help( x264_param_t *defaults, int longhelp ) H0( " --tff Enable interlaced mode (top field first)\n" ); H0( " --bff Enable interlaced mode (bottom field first)\n" ); H2( " --constrained-intra Enable constrained intra prediction.\n" ); + H0( " --pulldown 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" ); + H2( " --frame-packing 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" ); H0( "\n" ); H0( "Ratecontrol:\n" ); H0( "\n" ); - H1( " -q, --qp Force constant QP (0-51, 0=lossless)\n" ); + H1( " -q, --qp Force constant QP (0-%d, 0=lossless)\n", QP_MAX ); H0( " -B, --bitrate Set bitrate (kbit/s)\n" ); - H0( " --crf Quality-based VBR (0-51, 0=lossless) [%.1f]\n", defaults->rc.f_rf_constant ); + H0( " --crf Quality-based VBR (%d-51) [%.1f]\n", 51 - QP_MAX, defaults->rc.f_rf_constant ); H1( " --rc-lookahead Number of frames for frametype lookahead [%d]\n", defaults->rc.i_lookahead ); H0( " --vbv-maxrate Max local bitrate (kbit/s) [%d]\n", defaults->rc.i_vbv_max_bitrate ); H0( " --vbv-bufsize Set size of the VBV buffer (kbit) [%d]\n", defaults->rc.i_vbv_buffer_size ); @@ -423,7 +601,8 @@ static void Help( x264_param_t *defaults, int longhelp ) " or b= (bitrate multiplier)\n" ); H2( " --qpfile Force frametypes and QPs for some or all frames\n" " Format of each line: framenumber frametype QP\n" - " QP of -1 lets x264 choose. Frametypes: I,i,P,B,b.\n" + " QP is optional (none lets x264 choose). Frametypes: I,i,K,P,B,b.\n" + " K= depending on open-gop setting\n" " QPs are restricted by qpmin/qpmax.\n" ); H1( "\n" ); H1( "Analysis:\n" ); @@ -438,8 +617,8 @@ static void Help( x264_param_t *defaults, int longhelp ) H2( " --no-weightb Disable weighted prediction for B-frames\n" ); H1( " --weightp Weighted prediction for P-frames [%d]\n" " - 0: Disabled\n" - " - 1: Blind offset\n" - " - 2: Smart analysis\n", defaults->analyse.i_weighted_pred ); + " - 1: Weighted refs\n" + " - 2: Weighted refs + Duplicates\n", defaults->analyse.i_weighted_pred ); H1( " --me Integer pixel motion estimation method [\"%s\"]\n", strtable_lookup( x264_motion_est_names, defaults->analyse.i_me_method ) ); H2( " - dia: diamond search, radius 1 (fast)\n" @@ -471,7 +650,7 @@ static void Help( x264_param_t *defaults, int longhelp ) 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" ); - H1( " -t, --trellis Trellis RD quantization. Requires CABAC. [%d]\n" + H1( " -t, --trellis Trellis RD quantization. [%d]\n" " - 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 ); @@ -526,6 +705,8 @@ static void Help( x264_param_t *defaults, int longhelp ) H2( " --nal-hrd 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" ); + H2( " --crop-rect Add 'left,top,right,bottom' to the bitstream-level\n" + " cropping rectangle\n" ); H0( "\n" ); H0( "Input/Output:\n" ); @@ -535,6 +716,10 @@ static void Help( x264_param_t *defaults, int longhelp ) " - %s\n", muxer_names[0], stringify_names( buf, muxer_names ) ); H1( " --demuxer Specify input container format [\"%s\"]\n" " - %s\n", demuxer_names[0], stringify_names( buf, demuxer_names ) ); + H1( " --input-csp Specify input colorspace format for raw input\n" ); + print_csp_names( longhelp ); + H1( " --input-depth Specify input bit depth for raw input\n" ); + H1( " --input-res Specify input resolution (width x height)\n" ); H1( " --index Filename for input index file\n" ); H0( " --sar width:height Specify Sample Aspect Ratio\n" ); H0( " --fps Specify framerate\n" ); @@ -545,6 +730,9 @@ static void Help( x264_param_t *defaults, int longhelp ) H1( " -v, --verbose Print stats for each frame\n" ); H1( " --no-progress Don't show the progress indicator while encoding\n" ); H0( " --quiet Quiet Mode\n" ); + H1( " --log-level 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 ) ); H1( " --psnr Enable PSNR computation\n" ); H1( " --ssim Enable SSIM computation\n" ); H1( " --threads Force a specific number of threads\n" ); @@ -564,33 +752,51 @@ static void Help( x264_param_t *defaults, int longhelp ) H2( " --timebase Specify timebase numerator and denominator\n" " Specify timebase numerator for input timecode file\n" " or specify timebase denominator for other input\n" ); - H0( " --pulldown Use soft pulldown to change frame rate\n" - " - none, 22, 32, 64, double, triple, euro (requires cfr input)\n" ); + H2( " --dts-compress Eliminate initial delay with container DTS hack\n" ); + H0( "\n" ); + H0( "Filtering:\n" ); + H0( "\n" ); + H0( " --vf, --video-filter //... Apply video filtering to the input file\n" ); + H0( "\n" ); + H0( " Filter options may be specified in :