Index: test/test.c =================================================================== --- test/test.c (revision 1034) +++ test/test.c (working copy) @@ -67,6 +67,9 @@ 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 int largeFileSize = 0; +static int vfr = 0; +static int preset = 0; +static char * presetname = NULL; /* Exit cleanly on Ctrl-C */ static volatile int die = 0; @@ -75,6 +78,8 @@ /* 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 ); @@ -223,7 +228,8 @@ if (native_language ) free (native_language ); if( x264opts ) free (x264opts ); if( x264opts2 ) free (x264opts2 ); - + if (presetname) free (presetname); + fprintf( stderr, "HandBrake has exited.\n" ); return 0; @@ -375,7 +381,7 @@ die = 1; break; } - + /* Set job settings */ job = title->job; @@ -390,7 +396,247 @@ job->chapter_end = MAX( job->chapter_start, job->chapter_end ); } + + if (preset) + { + hb_log("+ Using preset: %s", presetname); + + if (!strcmp(presetname, "Animation")) + { + job->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=6: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"); + job->chapter_markers = 1; + job->deinterlace = 1; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + if (!strcmp(presetname, "AppleTV")) + { + job->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=2:cabac=0"); + job->chapter_markers = 1; + job->pixel_ratio = 1; + } + + if (!strcmp(presetname, "Bedlam")) + { + job->mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1800; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=16:mixed-refs:bframes=6: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; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(presetname, "Blind")) + { + job->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(presetname, "Broke")) + { + job->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=6: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(presetname, "Classic")) + { + job->mux = HB_MUX_MP4; + job->vbitrate = 1000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + } + + if (!strcmp(presetname, "Constant Quality Rate")) + { + job->mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vquality = 0.64709997177124023; + job->abitrate = 160; + job->arate = 48000; + 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; + job->pixel_ratio = 1; + } + + if (!strcmp(presetname, "Deux Six Quatre")) + { + job->mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 1600; + job->abitrate = 160; + job->arate = 48000; + 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; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(presetname, "Film")) + { + job->mux = HB_MUX_MKV; + vcodec = HB_VCODEC_X264; + job->vbitrate = 2000; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_AC3; + x264opts = strdup("ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:no-fast-pskip"); + job->chapter_markers = 1; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(presetname, "iPhone")) + { + job->mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->h264_level = 30; + job->vbitrate = 960; + job->abitrate = 128; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 480; + x264opts = strdup("cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1"); + job->chapter_markers = 1; + } + + if (!strcmp(presetname, "iPod High-Rez")) + { + job->mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->h264_level = 30; + job->vbitrate = 1500; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 640; + x264opts = strdup("keyint=300:keyint-min=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(presetname, "iPod Low-Rez")) + { + job->mux = HB_MUX_MP4; + vcodec = HB_VCODEC_X264; + job->h264_level = 30; + job->vbitrate = 700; + job->abitrate = 160; + job->arate = 48000; + acodec = HB_ACODEC_FAAC; + job->width = 320; + x264opts = strdup("keyint=300:keyint-min=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(presetname, "Normal")) + { + job->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; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(presetname, "PS3")) + { + job->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"); + job->chapter_markers = 1; + job->pixel_ratio = 1; + } + + if (!strcmp(presetname, "PSP")) + { + job->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(presetname, "QuickTime")) + { + job->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:8x8dct:trellis=1:no-fast-pskip"); + job->chapter_markers = 1; + job->pixel_ratio = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + if (!strcmp(presetname, "Television")) + { + job->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=6:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip"); + job->chapter_markers = 1; + job->deinterlace = 1; + twoPass = 1; + turbo_opts_enabled = 1; + } + + } + if ( chapter_markers ) { job->chapter_markers = chapter_markers; @@ -633,6 +879,9 @@ job->maxWidth = maxWidth; if (maxHeight) job->maxHeight = maxHeight; + + if (vfr) + job->vfr = 1; if( subtitle_force ) { @@ -928,17 +1177,42 @@ "\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\n"); } /**************************************************************************** + * ShowPresets: + ****************************************************************************/ +static void ShowPresets() +{ + printf("\n+ Animation: -e x264 -b 1000 -B 160 -R 48 -E faac -f mkv -x ref=5:mixed-refs:bframes=6: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 -m -d -p -2 -T\n"); + printf("\n+ AppleTV: -e x264 -b 2500 -B 160 -R 48 -E faac -f mp4 -x bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2:cabac=0 -m -p\n"); + printf("\n+ Bedlam: -e x264 -b 1800 -B 160 -R 48 -E ac3 -f mkv -x ref=16:mixed-refs:bframes=6: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 -m -p -2 -T\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 -x ref=3:mixed-refs:bframes=6:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip -m -2 -T\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 -B 160 -R 48 -E ac3 -f mkv -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 -m -p\n"); + printf("\n+ Deux Six Quatre: -e x264 -b 1600 -B 160 -R 48 -E ac3 -f mkv -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 -m -p -2 -T\n"); + printf("\n+ Film: -e x264 -b 2000 -B 160 -R 48 -E ac3 -f mkv -x ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:no-fast-pskip -m -p -2 -T\n"); + printf("\n+ iPhone: -e x264b30 -b 960 -B 128 -R 48 -E faac -f mp4 -w 480 -x cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1 -m\n"); + printf("\n+ iPod High-Rez: -e x264b30 -b 1500 -B 160 -R 48 -E faac -f mp4 -w 640 -x keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1 -m\n"); + printf("\n+ iPod Low-Rez: -e x264b30 -b 700 -B 160 -R 48 -E faac -f mp4 -w 320 -x keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1 -m\n"); + printf("\n+ Normal: -e x264 -b 1500 -B 160 -R 48 -E faac -f mp4 -x ref=2:bframes=2:subme=5:me=umh -m -p -2 -T\n"); + printf("\n+ PS3: -e x264 -b 2500 -B 160 -R 48 -E faac -f mp4 -x level=41:subme=5:me=umh -m -p\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 -x ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:8x8dct:trellis=1:no-fast-pskip -m -p -2 -T\n"); + printf("\n+ Television: -e x264 -b 1300 -B 160 -R 48 -E faac -f mkv -x ref=3:mixed-refs:bframes=6:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip -m -d -2 -T\n"); +} + +/**************************************************************************** * ParseOptions: ****************************************************************************/ static int ParseOptions( int argc, char ** argv ) @@ -991,9 +1265,11 @@ { "crf", no_argument, NULL, 'Q' }, { "x264opts", required_argument, NULL, 'x' }, { "turbo", no_argument, NULL, 'T' }, - + { "vfr", no_argument, NULL, 'V' }, { "maxHeight", required_argument, NULL, 'Y' }, { "maxWidth", required_argument, NULL, 'X' }, + { "preset", required_argument, NULL, 'Z' }, + { "preset-list", no_argument, NULL, 'z' }, { 0, 0, 0, 0 } }; @@ -1002,7 +1278,7 @@ int c; c = getopt_long( argc, argv, - "hvuC:f:4i:o:t:Lc:ma:6:s:UFN:e:E:2d789gpP::w:l:n:b:q:S:B:r:R:Qx:TY:X:", + "hvuC:f:4i:o:t:Lc:ma:6:s:UFN:e:E:2d789gpP::w:l:n:b:q:S:B:r:R:Qx:TY:X:VZ:z", long_options, &option_index ); if( c < 0 ) { @@ -1024,6 +1300,13 @@ cpu = atoi( optarg ); break; + case 'Z': + preset = 1; + presetname = strdup(optarg); + break; + case 'z': + ShowPresets(); + exit ( 0 ); case 'f': format = strdup( optarg ); break; @@ -1315,6 +1598,9 @@ case 'X': maxWidth = atoi (optarg ); break; + case 'V': + vfr = 1; + break; default: fprintf( stderr, "unknown option (%s)\n", argv[optind] );