X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=test%2Ftest.c;h=106f7a2f992fd344fe28579ac6113ae19f26761b;hb=c525e3254df59306aad27c73b2134caf1a728df3;hp=4bdc87a9c2b1e0b3ef30e8a7d281a23549ae83dd;hpb=88cb83abbb1171d3d60d512eda10675c43f3a761;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/test/test.c b/test/test.c index 4bdc87a9..106f7a2f 100644 --- a/test/test.c +++ b/test/test.c @@ -22,6 +22,7 @@ static char * format = NULL; static int titleindex = 1; static int longest_title = 0; static int subtitle_scan = 0; +static int subtitle_force = 0; static char * native_language = NULL; static int twoPass = 0; static int deinterlace = 0; @@ -38,6 +39,7 @@ static int h264_13 = 0; static int h264_30 = 0; static char * audios = NULL; static int audio_mixdown = HB_AMIXDOWN_DOLBYPLII; +static float dynamic_range_compression = 0; static int sub = 0; static int width = 0; static int height = 0; @@ -52,18 +54,25 @@ static int abitrate = 0; static int mux = 0; static int acodec = 0; static int pixelratio = 0; +static int loosePixelratio = 0; +static int modulus = 0; static int chapter_start = 0; static int chapter_end = 0; static int chapter_markers = 0; static char * marker_file = NULL; -static int crf = 0; +static int crf = 1; static char *x264opts = NULL; static char *x264opts2 = NULL; static int maxHeight = 0; static int maxWidth = 0; static int turbo_opts_enabled = 0; -static char * turbo_opts = "ref=1:subme=1:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0"; +static char * turbo_opts = "ref=1:subme=1:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0:weightb=0"; static int largeFileSize = 0; +static int preset = 0; +static char * preset_name = 0; +static int vfr = 0; +static int mp4_optimize = 0; +static int ipod_atom = 0; /* Exit cleanly on Ctrl-C */ static volatile int die = 0; @@ -72,10 +81,23 @@ static void SigHandler( int ); /* Utils */ static void ShowCommands(); static void ShowHelp(); +static void ShowPresets(); + static int ParseOptions( int argc, char ** argv ); static int CheckOptions( int argc, char ** argv ); static int HandleEvents( hb_handle_t * h ); +/**************************************************************************** + * hb_error_handler + * + * When using the CLI just display using hb_log as we always did in the past + * make sure that we prefix with a nice ERROR message to catch peoples eyes. + ****************************************************************************/ +static void hb_cli_error_handler ( const char *errmsg ) +{ + fprintf( stderr, "ERROR: %s", errmsg ); +} + int main( int argc, char ** argv ) { hb_handle_t * h; @@ -89,6 +111,9 @@ int main( int argc, char ** argv ) return 1; } + /* Register our error handler */ + hb_register_error_handler(&hb_cli_error_handler); + /* Init libhb */ h = hb_init( debug, update ); @@ -173,9 +198,11 @@ int main( int argc, char ** argv ) switch( buf[0] ) { case 'q': + fprintf( stdout, "\nEncoding Quit by user command\n" ); die = 1; break; case 'p': + fprintf( stdout, "\nEncoding Paused by user command, 'r' to resume\n" ); hb_pause( h ); break; case 'r': @@ -204,6 +231,7 @@ int main( int argc, char ** argv ) if (native_language ) free (native_language ); if( x264opts ) free (x264opts ); if( x264opts2 ) free (x264opts2 ); + if (preset_name) free (preset_name); fprintf( stderr, "HandBrake has exited.\n" ); @@ -212,11 +240,11 @@ int main( int argc, char ** argv ) static void ShowCommands() { - fprintf( stderr, "Commands:\n" ); - fprintf( stderr, " [h]elp Show this message\n" ); - fprintf( stderr, " [q]uit Exit HandBrakeCLI\n" ); - fprintf( stderr, " [p]ause Pause encoding\n" ); - fprintf( stderr, " [r]esume Resume encoding\n" ); + fprintf( stdout, "\nCommands:\n" ); + fprintf( stdout, " [h]elp Show this message\n" ); + fprintf( stdout, " [q]uit Exit HandBrakeCLI\n" ); + fprintf( stdout, " [p]ause Pause encoding\n" ); + fprintf( stdout, " [r]esume Resume encoding\n" ); } static void PrintTitleInfo( hb_title_t * title ) @@ -372,6 +400,253 @@ static int HandleEvents( hb_handle_t * h ) job->chapter_end ); } + if (preset) + { + fprintf( stderr, "+ Using preset: %s", preset_name); + + if (!strcmp(preset_name, "Animation")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("ref=5:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=5:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip:filter=2,2"); + deinterlace = 1; + deinterlace_opt = "2:-1:1"; + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "AppleTV")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->vbitrate = 2500; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=1:cabac=0"); + job->chapter_markers = 1; + pixelratio = 1; + } + + if (!strcmp(preset_name, "Bedlam")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1800; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=16:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1"); + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "Blind")) + { + mux = HB_MUX_MP4; + job->vbitrate = 512; + job->abitrate = 128; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 512; + job->chapter_markers = 1; + } + + if (!strcmp(preset_name, "Broke")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + size = 695; + job->abitrate = 128; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 640; + x264opts = strdup("ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip"); + job->chapter_markers = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "Classic")) + { + mux = HB_MUX_MP4; + job->vbitrate = 1000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + } + + if (!strcmp(preset_name, "Constant Quality Rate")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vquality = 0.64709997177124023; + job->crf = 1; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=3:mixed-refs:bframes=3:b-pyramid:b-rdo:bime:weightb:filter=-2,-1:subme=6:trellis=1:analyse=all:8x8dct:me=umh"); + job->chapter_markers = 1; + pixelratio = 1; + } + + if (!strcmp(preset_name, "Deux Six Quatre")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1600; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=5:mixed-refs:bframes=3:bime:weightb:b-rdo:b-pyramid:me=umh:subme=7:trellis=1:analyse=all:8x8dct:no-fast-pskip"); + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "Film")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1800; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:analyse=all:8x8dct:trellis=1:no-fast-pskip"); + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "iPhone / iPod Touch")) + { + mux = HB_MUX_MP4; + job->ipod_atom = 1; + vcodec = HB_VCODEC_X264; + job->vbitrate = 960; + job->abitrate = 128; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 480; + x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1"); + job->chapter_markers = 1; + } + + if (!strcmp(preset_name, "iPod High-Rez")) + { + mux = HB_MUX_MP4; + job->ipod_atom = 1; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1500; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 640; + x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1"); + job->chapter_markers = 1; + } + + if (!strcmp(preset_name, "iPod Low-Rez")) + { + mux = HB_MUX_MP4; + job->ipod_atom = 1; + vcodec = HB_VCODEC_X264; + job->vbitrate = 700; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 320; + x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1"); + job->chapter_markers = 1; + } + + if (!strcmp(preset_name, "Normal")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1500; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("ref=2:bframes=2:subme=5:me=umh"); + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "PS3")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->vbitrate = 2500; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("level=41:subme=5:me=umh"); + pixelratio = 1; + } + + if (!strcmp(preset_name, "PSP")) + { + mux = HB_MUX_MP4; + job->vbitrate = 1024; + job->abitrate = 128; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 368; + job->height = 208; + job->chapter_markers = 1; + } + + if (!strcmp(preset_name, "QuickTime")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->vbitrate = 2000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:trellis=1:no-fast-pskip"); + job->chapter_markers = 1; + pixelratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "Television")) + { + mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1300; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("ref=3:mixed-refs:bframes=16:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip"); + deinterlace = 1; + deinterlace_opt = "2:-1:1"; + denoise = 1; + denoise_opt = "2:1:2:3"; + job->chapter_markers = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(preset_name, "Xbox 360")) + { + mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->vbitrate = 2000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + x264opts = strdup("level=40:ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:analyse=all:8x8dct:trellis=1:no-fast-pskip:filter=-2,-1"); + pixelratio = 1; + } + } + if ( chapter_markers ) { job->chapter_markers = chapter_markers; @@ -432,8 +707,18 @@ static int HandleEvents( hb_handle_t * h ) job->deinterlace = deinterlace; job->grayscale = grayscale; - job->pixel_ratio = pixelratio; - + if (loosePixelratio) + { + job->pixel_ratio = 2; + if (modulus) + { + job->modulus = modulus; + } + } + else + { + job->pixel_ratio = pixelratio; + } /* Add selected filters */ job->filters = hb_list_init(); if( detelecine ) @@ -467,16 +752,23 @@ static int HandleEvents( hb_handle_t * h ) job->width = width; hb_fix_aspect( job, HB_KEEP_WIDTH ); } - else if( height ) + else if( height && !loosePixelratio) { job->height = height; hb_fix_aspect( job, HB_KEEP_HEIGHT ); } - else if( !width && !height && !pixelratio ) + else if( !width && !height && !pixelratio && !loosePixelratio ) { hb_fix_aspect( job, HB_KEEP_WIDTH ); } - + else if (!width && loosePixelratio) + { + /* Default to full width when one isn't specified for loose anamorphic */ + job->width = title->width - job->crop[2] - job->crop[3]; + /* The height will be thrown away in hb.c but calculate it anyway */ + hb_fix_aspect( job, HB_KEEP_WIDTH ); + } + if( vquality >= 0.0 && vquality <= 1.0 ) { job->vquality = vquality; @@ -540,6 +832,26 @@ static int HandleEvents( hb_handle_t * h ) job->audios[0] = 0; job->audio_mixdowns[0] = audio_mixdown; } + + if( audio_mixdown == HB_AMIXDOWN_DOLBYPLII_AC3) + { + int i; + for( i = 3 ; i > 0; i--) + { + job->audios[i*2+1] = job->audios[i]; + job->audios[i*2] = job->audios[i]; + if(job->audios[i] != -1 ) + { + job->audio_mixdowns[i*2+1] = HB_AMIXDOWN_AC3; + job->audio_mixdowns[i*2] = HB_AMIXDOWN_DOLBYPLII; + } + } + + job->audios[1] = job->audios[0]; + job->audio_mixdowns[1] = HB_AMIXDOWN_AC3; + job->audio_mixdowns[0] = HB_AMIXDOWN_DOLBYPLII; + } + if( abitrate ) { job->abitrate = abitrate; @@ -548,7 +860,11 @@ static int HandleEvents( hb_handle_t * h ) { job->acodec = acodec; } - + if ( dynamic_range_compression ) + { + job->dynamic_range_compression = dynamic_range_compression; + } + if( size ) { job->vbitrate = hb_calc_bitrate( job, size ); @@ -575,6 +891,14 @@ static int HandleEvents( hb_handle_t * h ) { job->largeFileSize = 1; } + if ( mp4_optimize ) + { + job->mp4_optimize = 1; + } + if ( ipod_atom ) + { + job->ipod_atom = 1; + } job->file = strdup( output ); @@ -585,8 +909,6 @@ static int HandleEvents( hb_handle_t * h ) if( x264opts != NULL && *x264opts != '\0' ) { - fprintf( stderr, "Applying the following x264 options: %s\n", - x264opts); job->x264opts = x264opts; } else /*avoids a bus error crash when options aren't specified*/ @@ -597,7 +919,43 @@ static int HandleEvents( hb_handle_t * h ) job->maxWidth = maxWidth; if (maxHeight) job->maxHeight = maxHeight; - + + if (vfr) + job->vfr = 1; + + if( subtitle_force ) + { + job->subtitle_force = subtitle_force; + } + + if( subtitle_scan ) + { + char *x264opts_tmp; + + /* + * When subtitle scan is enabled do a fast pre-scan job + * which will determine which subtitles to enable, if any. + */ + job->pass = -1; + + x264opts_tmp = job->x264opts; + + job->x264opts = NULL; + + job->indepth_scan = subtitle_scan; + fprintf( stderr, "Subtitle Scan Enabled - enabling " + "subtitles if found for foreign language segments\n"); + job->select_subtitle = malloc(sizeof(hb_subtitle_t*)); + *(job->select_subtitle) = NULL; + + /* + * Add the pre-scan job + */ + hb_add( h, job ); + + job->x264opts = x264opts_tmp; + } + if( twoPass ) { /* @@ -605,15 +963,18 @@ static int HandleEvents( hb_handle_t * h ) * for the first pass and then off again for the * second. */ + hb_subtitle_t **subtitle_tmp = job->select_subtitle; + + job->select_subtitle = NULL; + job->pass = 1; - job->subtitle_scan = subtitle_scan; - if( subtitle_scan ) + + job->indepth_scan = 0; + + if (x264opts) { - fprintf( stderr, "Subtitle Scan Enabled - enabling " - "subtitles if found for foreign language segments\n"); - job->select_subtitle = malloc(sizeof(hb_subtitle_t*)); - *(job->select_subtitle) = NULL; - } + x264opts2 = strdup(x264opts); + } /* * If turbo options have been selected then append them @@ -646,6 +1007,9 @@ static int HandleEvents( hb_handle_t * h ) job->x264opts = x264opts; } hb_add( h, job ); + + job->select_subtitle = subtitle_tmp; + job->pass = 2; /* * On the second pass we turn off subtitle scan so that we @@ -653,7 +1017,7 @@ static int HandleEvents( hb_handle_t * h ) * selected in the first pass (using the whacky select-subtitle * attribute of the job). */ - job->subtitle_scan = 0; + job->indepth_scan = 0; job->x264opts = x264opts2; @@ -664,11 +1028,9 @@ static int HandleEvents( hb_handle_t * h ) /* * Turn on subtitle scan if requested, note that this option * precludes encoding of any actual subtitles. - */ - if ( subtitle_scan ) - { - fprintf( stderr, "Warning: Subtitle Scan only works in two-pass, disabling\n"); - } + */ + + job->indepth_scan = 0; job->pass = 0; hb_add( h, job ); } @@ -678,21 +1040,23 @@ static int HandleEvents( hb_handle_t * h ) #define p s.param.working case HB_STATE_WORKING: - fprintf( stderr, "\rEncoding: task %d of %d, %.2f %%", + fprintf( stdout, "\rEncoding: task %d of %d, %.2f %%", p.job_cur, p.job_count, 100.0 * p.progress ); if( p.seconds > -1 ) { - fprintf( stderr, " (%.2f fps, avg %.2f fps, ETA " + fprintf( stdout, " (%.2f fps, avg %.2f fps, ETA " "%02dh%02dm%02ds)", p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds ); } + fflush(stdout); break; #undef p #define p s.param.muxing case HB_STATE_MUXING: { - fprintf( stderr, "\rMuxing: %.2f %%", 100.0 * p.progress ); + fprintf( stdout, "\rMuxing: %.2f %%", 100.0 * p.progress ); + fflush(stdout); break; } #undef p @@ -754,6 +1118,10 @@ static void ShowHelp() " -u, --update Check for updates and exit\n" " -v, --verbose Be verbose\n" " -C, --cpu Set CPU count (default: autodetected)\n" + " -Z. --preset Use a built-in preset. Capitalization matters, and\n" + " if the preset name has spaces, surround it with\n" + " double quotation marks\n" + " -z, --preset-list See a list of available built-in presets\n" "\n" "### Source Options-----------------------------------------------------------\n\n" @@ -772,6 +1140,8 @@ static void ShowHelp() " autodetected from file name)\n" " -4, --large-file Use 64-bit mp4 files that can hold more than\n" " 4 GB. Note: Breaks iPod, @TV, PS3 compatibility.\n""" + " -O, --optimize Optimize mp4 files for HTTP streaming\n" + " -I, --ipod-atom Mark mp4 files so iPods will accept them\n" "\n" "### Picture Settings---------------------------------------------------------\n\n" @@ -781,10 +1151,15 @@ static void ShowHelp() " -Y, --maxHeight <#> Set maximum height\n" " -X, --maxWidth <#> Set maximum width\n" " -s, --subtitle Select subtitle (default: none)\n" - " -U, --subtitle-scan Scan for subtitles on the first pass, and choose\n" - " the one that's only used 20 percent of the time\n" + " -U, --subtitle-scan Scan for subtitles in an extra 1st pass, and choose\n" + " the one that's only used 10 percent of the time\n" " or less. This should locate subtitles for short\n" - " foreign language segments. Only works with 2-pass.\n" + " foreign language segments. Best used in conjunction\n" + " with --subtitle-forced.\n" + " -F, --subtitle-forced Only display subtitles from the selected stream if\n" + " the subtitle has the forced flag set. May be used in\n" + " conjunction with --subtitle-scan to auto-select\n" + " a stream if it contains forced subtitles.\n" " -N, --native-language Select subtitles with this language if it does not\n" " match the Audio language. Provide the language's\n" " iso639-2 code (fre, eng, spa, dut, et cetera)\n" @@ -795,7 +1170,7 @@ static void ShowHelp() " -e, --encoder Set video library encoder (ffmpeg,xvid,\n" " x264,x264b13,x264b30 default: ffmpeg)\n" " -q, --quality Set video quality (0.0..1.0)\n" - " -Q, --crf Use with -q for CRF instead of CQP\n" + " -Q, --cqp Use with -q for CQP instead of CRF\n" " -S, --size Set target size\n" " -b, --vb Set video bitrate (default: 1000)\n" " -r, --rate Set video framerate (" ); @@ -809,25 +1184,37 @@ static void ShowHelp() "\n" " -2, --two-pass Use two-pass mode\n" " -d, --deinterlace Deinterlace video with yadif/mcdeint filter\n" - " (default 0:-1:-1:1)\n" + " (default 0:-1:-1:1)\n" + " or\n" + " \n" " -7, --deblock Deblock video with pp7 filter\n" " (default 0:2)\n" " -8, --denoise Denoise video with hqdn3d filter\n" " (default 4:3:6:4.5)\n" + " or\n" + " \n" " -9, --detelecine Detelecine video with pullup filter\n" " (default 1:1:4:4:0:0)\n" " -g, --grayscale Grayscale encoding\n" " -p, --pixelratio Store pixel aspect ratio in video stream\n" + " -P, --loosePixelratio Store pixel aspect ratio with specified width\n" + " Takes as optional argument what number you want\n" + " the dimensions to divide cleanly by (default 16)\n" + "\n" "### Audio Options-----------------------------------------------------------\n\n" - " -E, --aencoder Set audio encoder (faac/lame/vorbis/ac3, ac3\n" - " meaning passthrough, default: guessed)\n" + " -E, --aencoder Audio encoder (faac/lame/vorbis/ac3/aac+ac3) \n" + " ac3 meaning passthrough, aac+ac3 meaning an\n" + " aac dpl2 mixdown paired with ac3 pass-thru\n" + " (default: guessed)\n" " -B, --ab Set audio bitrate (default: 128)\n" - " -a, --audio Select audio channel(s) (\"none\" for no \n" - " audio, default: first one)\n" + " -a, --audio Select audio channel(s), separated by commas\n" + " (\"none\" for no audio, \"1,2,3\" for multiple\n" + " tracks, default: first one,\n" + " max 8 normally, max 4 with aac+ac3)\n" " -6, --mixdown Format for surround sound downmixing\n" " (mono/stereo/dpl1/dpl2/6ch, default: dpl2)\n" " -R, --arate Set audio samplerate (" ); @@ -838,20 +1225,66 @@ static void ShowHelp() fprintf( stderr, "/" ); } fprintf( stderr, " kHz)\n" - + " -D, --drc Apply extra dynamic range compression to the audio,\n" + " making soft sounds louder. Range is 1.0 to 4.0\n" + " (too loud), with 1.5 - 2.5 being a useful range.\n" "\n" - "### Advanced H264 Options----------------------------------------------------\n\n" + "### Advanced Options---------------------------------------------------------\n\n" " -x, --x264opts Specify advanced x264 options in the\n" " same style as mencoder:\n" " option1=value1:option2=value2\n" " -T, --turbo When using 2-pass use the turbo options\n" " on the first pass to improve speed\n" " (only works with x264, affects PSNR by about 0.05dB,\n" - " and increases first pass speed two to four times)\n"); + " and increases first pass speed two to four times)\n" + " -V, --vfr Perform variable framerate detelecine on NTSC video\n" + ); +} + +/**************************************************************************** + * ShowPresets: + ****************************************************************************/ +static void ShowPresets() +{ + printf("\n+ Animation: -e x264 -b 1000 -B 160 -R 48 -E faac -f mkv --deinterlace=\"slower\" -m -p -2 -T -x ref=5:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=5:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip:filter=2,2\n"); + + printf("\n+ AppleTV: -e x264 -b 2500 -B 160 -R 48 -E faac -f mp4 -m -p -x bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=1:cabac=0\n"); + + printf("\n+ Bedlam: -e x264 -b 1800 -E ac3 -f mkv -m -p -2 -T -x ref=16:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1\n"); + + printf("\n+ Blind: -b 512 -B 128 -R 48 -E faac -f mp4 -w 512 -m\n"); + + printf("\n+ Broke: -e x264 -S 695 -B 128 -R 48 -E faac -f mp4 -w 640 -m -2 -T -x ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip\n"); + + printf("\n+ Classic: -b 1000 -B 160 -R 48 -E faac -f mp4\n"); + + printf("\n+ Constant Quality Rate: -e x264 -q 0.64709997177124023 -Q -E ac3 -f mkv -m -p -x ref=3:mixed-refs:bframes=3:b-pyramid:b-rdo:bime:weightb:filter=-2,-1:subme=6:trellis=1:analyse=all:8x8dct:me=umh\n"); + + printf("\n+ Deux Six Quatre: -e x264 -b 1600 -E ac3 -f mkv -m -p -2 -T -x ref=5:mixed-refs:bframes=3:bime:weightb:b-rdo:b-pyramid:me=umh:subme=7:trellis=1:analyse=all:8x8dct:no-fast-pskip\n"); + + printf("\n+ Film: -e x264 -b 1800 -E ac3 -f mkv -m -p -2 -T -x ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:analyse=all:8x8dct:trellis=1:no-fast-pskip\n"); + + printf("\n+ iPhone / iPod Touch: -e x264 -b 960 -B 128 -R 48 -E faac -f mp4 -I -w 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1\n"); + + printf("\n+ iPod High-Rez: -e x264 -b 1500 -B 160 -R 48 -E faac -f mp4 -I -w 640 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1\n"); + + printf("\n+ iPod Low-Rez: -e x264 -b 700 -B 160 -R 48 -E faac -f mp4 -I -w 320 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1\n"); + + printf("\n+ Normal: -e x264 -b 1500 -B 160 -R 48 -E faac -f mp4 -m -p -2 -T -x ref=2:bframes=2:subme=5:me=umh\n"); + + printf("\n+ PS3: -e x264 -b 2500 -B 160 -R 48 -E faac -f mp4 -p -x level=41:subme=5:me=umh\n"); + + printf("\n+ PSP: -b 1024 -B 128 -R 48 -E faac -f mp4 -w 368 -l 208 -m\n"); + + printf("\n+ QuickTime: -e x264 -b 2000 -B 160 -R 48 -E faac -f mp4 -m -p -2 -T -x ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:trellis=1:no-fast-pskip\n"); + + printf("\n+ Television: -e x264 -b 1300 -B 160 -R 48 -E faac -f mkv --deinterlace=\"slower\" --denoise=\"weak\" -m -2 -T -x ref=3:mixed-refs:bframes=16:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip\n"); + + printf("\n+ Xbox 360: -e x264 -b 2000 -B 160 -R 48 -E faac -f mp4 -p -x level=40:ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:analyse=all:8x8dct:trellis=1:no-fast-pskip:filter=-2,-1\n"); } /**************************************************************************** @@ -872,6 +1305,8 @@ static int ParseOptions( int argc, char ** argv ) { "input", required_argument, NULL, 'i' }, { "output", required_argument, NULL, 'o' }, { "large-file", no_argument, NULL, '4' }, + { "optimize", no_argument, NULL, 'O' }, + { "ipod-atom", no_argument, NULL, 'I' }, { "title", required_argument, NULL, 't' }, { "longest", no_argument, NULL, 'L' }, @@ -879,8 +1314,10 @@ static int ParseOptions( int argc, char ** argv ) { "markers", optional_argument, NULL, 'm' }, { "audio", required_argument, NULL, 'a' }, { "mixdown", required_argument, NULL, '6' }, + { "drc", required_argument, NULL, 'D' }, { "subtitle", required_argument, NULL, 's' }, { "subtitle-scan", no_argument, NULL, 'U' }, + { "subtitle-forced", no_argument, NULL, 'F' }, { "native-language", required_argument, NULL,'N' }, { "encoder", required_argument, NULL, 'e' }, @@ -892,6 +1329,7 @@ static int ParseOptions( int argc, char ** argv ) { "detelecine", optional_argument, NULL, '9' }, { "grayscale", no_argument, NULL, 'g' }, { "pixelratio", no_argument, NULL, 'p' }, + { "loosePixelratio", optional_argument, NULL, 'P' }, { "width", required_argument, NULL, 'w' }, { "height", required_argument, NULL, 'l' }, { "crop", required_argument, NULL, 'n' }, @@ -902,12 +1340,14 @@ static int ParseOptions( int argc, char ** argv ) { "ab", required_argument, NULL, 'B' }, { "rate", required_argument, NULL, 'r' }, { "arate", required_argument, NULL, 'R' }, - { "crf", no_argument, NULL, 'Q' }, + { "cqp", no_argument, NULL, 'Q' }, { "x264opts", required_argument, NULL, 'x' }, { "turbo", no_argument, NULL, 'T' }, - { "maxHeight", required_argument, NULL, 'Y' }, { "maxWidth", required_argument, NULL, 'X' }, + { "preset", required_argument, NULL, 'Z' }, + { "preset-list", no_argument, NULL, 'z' }, + { "vfr", no_argument, NULL, 'V' }, { 0, 0, 0, 0 } }; @@ -915,8 +1355,8 @@ static int ParseOptions( int argc, char ** argv ) int option_index = 0; int c; - c = getopt_long( argc, argv, - "hvuC:f:4i:o:t:Lc:ma:6:s:UN:e:E:2d789gpw:l:n:b:q:S:B:r:R:Qx:TY:X:", + c = getopt_long( argc, argv, + "hvuC:f:4i:Io:t:Lc:m::a:6:s:UFN:e:E:2dD:789gpOP::w:l:n:b:q:S:B:r:R:Qx:TY:X:VZ:z", long_options, &option_index ); if( c < 0 ) { @@ -937,7 +1377,15 @@ static int ParseOptions( int argc, char ** argv ) case 'C': cpu = atoi( optarg ); break; - + + case 'Z': + preset = 1; + preset_name = strdup(optarg); + break; + case 'z': + ShowPresets(); + exit ( 0 ); + case 'f': format = strdup( optarg ); break; @@ -950,6 +1398,13 @@ static int ParseOptions( int argc, char ** argv ) case '4': largeFileSize = 1; break; + case 'O': + mp4_optimize = 1; + break; + case 'I': + ipod_atom = 1; + break; + case 't': titleindex = atoi( optarg ); break; @@ -1009,12 +1464,18 @@ static int ParseOptions( int argc, char ** argv ) audio_mixdown = HB_AMIXDOWN_6CH; } break; + case 'D': + dynamic_range_compression = atof( optarg ); + break; case 's': sub = atoi( optarg ); break; case 'U': subtitle_scan = 1; break; + case 'F': + subtitle_force = 1; + break; case 'N': native_language = strdup( optarg ); break; @@ -1024,7 +1485,22 @@ static int ParseOptions( int argc, char ** argv ) case 'd': if( optarg != NULL ) { - deinterlace_opt = strdup( optarg ); + if (!( strcmp( optarg, "fast" ) )) + { + deinterlace_opt = "-1"; + } + else if (!( strcmp( optarg, "slow" ) )) + { + deinterlace_opt = "2"; + } + else if (!( strcmp( optarg, "slower" ) )) + { + deinterlace_opt = "0"; + } + else + { + deinterlace_opt = strdup( optarg ); + } } deinterlace = 1; break; @@ -1038,7 +1514,22 @@ static int ParseOptions( int argc, char ** argv ) case '8': if( optarg != NULL ) { - denoise_opt = strdup( optarg ); + if (!( strcmp( optarg, "weak" ) )) + { + denoise_opt = "2:1:2:3"; + } + else if (!( strcmp( optarg, "medium" ) )) + { + denoise_opt = "3:2:2:3"; + } + else if (!( strcmp( optarg, "strong" ) )) + { + denoise_opt = "7:7:5:5"; + } + else + { + denoise_opt = strdup( optarg ); + } } denoise = 1; break; @@ -1055,6 +1546,13 @@ static int ParseOptions( int argc, char ** argv ) case 'p': pixelratio = 1; break; + case 'P': + loosePixelratio = 1; + if( optarg != NULL ) + { + modulus = atoi( optarg ); + } + break; case 'e': if( !strcasecmp( optarg, "ffmpeg" ) ) { @@ -1101,6 +1599,12 @@ static int ParseOptions( int argc, char ** argv ) { acodec = HB_ACODEC_VORBIS; } + else if( !strcasecmp( optarg, "aac+ac3") ) + { + acodec = HB_ACODEC_FAAC; + audio_mixdown = HB_AMIXDOWN_DOLBYPLII_AC3; + arate = 48000; + } break; case 'w': width = atoi( optarg ); @@ -1170,11 +1674,10 @@ static int ParseOptions( int argc, char ** argv ) abitrate = atoi( optarg ); break; case 'Q': - crf = 1; + crf = 0; break; case 'x': x264opts = strdup( optarg ); - x264opts2 = strdup( optarg ); break; case 'T': turbo_opts_enabled = 1; @@ -1185,6 +1688,9 @@ static int ParseOptions( int argc, char ** argv ) case 'X': maxWidth = atoi (optarg ); break; + case 'V': + vfr = 1; + break; default: fprintf( stderr, "unknown option (%s)\n", argv[optind] ); @@ -1303,4 +1809,3 @@ static int CheckOptions( int argc, char ** argv ) return 0; } -