static char * rotate_opt = 0;
static int grayscale = 0;
static int vcodec = HB_VCODEC_FFMPEG;
-static int h264_13 = 0;
-static int h264_30 = 0;
static hb_list_t * audios = NULL;
static hb_audio_config_t * audio = NULL;
static int num_audio_tracks = 0;
static char * abitrates = NULL;
static char * acodecs = NULL;
static char * anames = NULL;
+#ifdef __APPLE_CC__
+static int default_acodec = HB_ACODEC_CA_AAC;
+#else
static int default_acodec = HB_ACODEC_FAAC;
-static int default_abitrate = 160;
+#endif
static int audio_explicit = 0;
static char ** subtracks = NULL;
static char ** subforce = NULL;
if( stop_at_string ) free( stop_at_string );
if( start_at_string ) free( start_at_string );
+ // write a carriage return to stdout - avoids overlap / line wrapping when stderr is redirected
+ fprintf( stdout, "\n" );
fprintf( stderr, "HandBrake has exited.\n" );
return 0;
if (preset)
{
- fprintf( stderr, "+ Using preset: %s", preset_name);
+ fprintf( stderr, "+ Using preset: %s\n", preset_name);
if (!strcmp(preset_name, "Universal"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- if( !atracks )
- {
- atracks = strdup("1,1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac,ac3pass");
- }
- if( !abitrates )
- {
- abitrates = strdup("160,160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2,auto");
- }
- if( !arates )
- {
- arates = strdup("Auto,Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0,0.0");
- }
- maxWidth = 720;
- if( !x264opts )
- {
- x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6");
- }
- if( !anamorphic_mode )
- {
- anamorphic_mode = 2;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "iPod"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->ipod_atom = 1;
- vcodec = HB_VCODEC_X264;
- job->vbitrate = 700;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- maxWidth = 320;
- if( !x264opts )
- {
- x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0");
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "iPhone & iPod Touch"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("128");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- maxWidth = 480;
- if( !x264opts )
- {
- x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0");
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "iPad"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->largeFileSize = 1;
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- job->vrate_base = 900900;
- job->cfr = 2;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- maxWidth = 1024;
- if( !anamorphic_mode )
- {
- anamorphic_mode = 2;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "AppleTV"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->largeFileSize = 1;
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- if( !atracks )
- {
- atracks = strdup("1,1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac,ac3pass");
- }
- if( !abitrates )
- {
- abitrates = strdup("160,160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2,auto");
- }
- if( !arates )
- {
- arates = strdup("Auto,Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0,0.0");
- }
- maxWidth = 960;
- if( !x264opts )
- {
- x264opts = strdup("cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500");
- }
- if( !anamorphic_mode )
- {
- anamorphic_mode = 2;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "Normal"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- if( !x264opts )
- {
- x264opts = strdup("ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
- }
- if( !anamorphic_mode )
- {
- anamorphic_mode = 1;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "High Profile"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- vcodec = HB_VCODEC_X264;
- job->vquality = 20.0;
- if( !atracks )
- {
- atracks = strdup("1,1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac,ac3pass");
- }
- if( !abitrates )
- {
- abitrates = strdup("160,160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2,auto");
- }
- if( !arates )
- {
- arates = strdup("Auto,Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0,0.0");
- }
- if( !x264opts )
- {
- x264opts = strdup("b-adapt=2:rc-lookahead=50");
- }
- detelecine = 1;
- decomb = 1;
- if( !anamorphic_mode )
- {
- anamorphic_mode = 2;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "Classic"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->vbitrate = 1000;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
-
- }
-
- if (!strcmp(preset_name, "AppleTV Legacy"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->largeFileSize = 1;
- vcodec = HB_VCODEC_X264;
- job->vbitrate = 2500;
- if( !atracks )
- {
- atracks = strdup("1,1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac,ac3pass");
- }
- if( !abitrates )
- {
- abitrates = strdup("160,160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2,auto");
- }
- if( !arates )
- {
- arates = strdup("Auto,Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0,0.0");
- }
- if( !x264opts )
- {
- x264opts = strdup("ref=1:b-pyramid=none:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
- }
- if( !anamorphic_mode )
- {
- anamorphic_mode = 1;
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "iPhone Legacy"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->ipod_atom = 1;
- vcodec = HB_VCODEC_X264;
- job->vbitrate = 960;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("128");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- maxWidth = 480;
- if( !x264opts )
- {
- x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0");
- }
- job->chapter_markers = 1;
-
- }
-
- if (!strcmp(preset_name, "iPod Legacy"))
- {
- if( !mux )
- {
- mux = HB_MUX_MP4;
- }
- job->ipod_atom = 1;
- vcodec = HB_VCODEC_X264;
- job->vbitrate = 1500;
- if( !atracks )
- {
- atracks = strdup("1");
- }
- if( !acodecs )
- {
- acodecs = strdup("faac");
- }
- if( !abitrates )
- {
- abitrates = strdup("160");
- }
- if( !mixdowns )
- {
- mixdowns = strdup("dpl2");
- }
- if( !arates )
- {
- arates = strdup("Auto");
- }
- if( !dynamic_range_compression )
- {
- dynamic_range_compression = strdup("0.0");
- }
- maxWidth = 640;
- if( !x264opts )
- {
- x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0");
- }
- job->chapter_markers = 1;
-
- }
-
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ if( !atracks )
+ {
+ atracks = strdup("1,1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac,copy:ac3");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160,160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2,auto");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto,Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0,0.0");
+ }
+ maxWidth = 720;
+ if( !x264opts )
+ {
+ x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6");
+ }
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPod"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->ipod_atom = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vbitrate = 700;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 320;
+ if( !x264opts )
+ {
+ x264opts = strdup("level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0");
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPhone & iPod Touch"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("128");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 480;
+ if( !x264opts )
+ {
+ x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0");
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPhone 4"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->largeFileSize = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ job->vrate_base = 900900;
+ job->cfr = 2;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 960;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPad"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->largeFileSize = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ job->vrate_base = 900900;
+ job->cfr = 2;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 1024;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "AppleTV"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->largeFileSize = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ if( !atracks )
+ {
+ atracks = strdup("1,1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac,copy:ac3");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160,160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2,auto");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto,Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0,0.0");
+ }
+ maxWidth = 960;
+ if( !x264opts )
+ {
+ x264opts = strdup("cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500");
+ }
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "AppleTV 2"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->largeFileSize = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ job->vrate_base = 900900;
+ job->cfr = 2;
+ if( !atracks )
+ {
+ atracks = strdup("1,1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac,copy:ac3");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160,160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2,auto");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto,Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0,0.0");
+ }
+ maxWidth = 1280;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "Normal"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ if( !x264opts )
+ {
+ x264opts = strdup("ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
+ }
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 1;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "High Profile"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ vcodec = HB_VCODEC_X264;
+ job->vquality = 20.0;
+ if( !atracks )
+ {
+ atracks = strdup("1,1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac,copy:ac3");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160,160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2,auto");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto,Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0,0.0");
+ }
+ if( !x264opts )
+ {
+ x264opts = strdup("b-adapt=2:rc-lookahead=50");
+ }
+ detelecine = 1;
+ decomb = 1;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "Classic"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->vbitrate = 1000;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+
+ }
+
+ if (!strcmp(preset_name, "AppleTV Legacy"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->largeFileSize = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vbitrate = 2500;
+ if( !atracks )
+ {
+ atracks = strdup("1,1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac,copy:ac3");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160,160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2,auto");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto,Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0,0.0");
+ }
+ if( !x264opts )
+ {
+ x264opts = strdup("ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
+ }
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 1;
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPhone Legacy"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->ipod_atom = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vbitrate = 960;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("128");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 480;
+ if( !x264opts )
+ {
+ x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0");
+ }
+ job->chapter_markers = 1;
+
+ }
+
+ if (!strcmp(preset_name, "iPod Legacy"))
+ {
+ if( !mux )
+ {
+ mux = HB_MUX_MP4;
+ }
+ job->ipod_atom = 1;
+ vcodec = HB_VCODEC_X264;
+ job->vbitrate = 1500;
+ if( !atracks )
+ {
+ atracks = strdup("1");
+ }
+ if( !acodecs )
+ {
+ acodecs = strdup("faac");
+ }
+ if( !abitrates )
+ {
+ abitrates = strdup("160");
+ }
+ if( !mixdowns )
+ {
+ mixdowns = strdup("dpl2");
+ }
+ if( !arates )
+ {
+ arates = strdup("Auto");
+ }
+ if( !dynamic_range_compression )
+ {
+ dynamic_range_compression = strdup("0.0");
+ }
+ maxWidth = 640;
+ if( !x264opts )
+ {
+ x264opts = strdup("level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0");
+ }
+ job->chapter_markers = 1;
+
+ }
+
}
if ( chapter_markers )
{
case 0: // Non-anamorphic
+ if (modulus)
+ {
+ job->modulus = modulus;
+ }
+
if( width && height )
{
job->width = width;
else if( width )
{
job->width = width;
+ // do not exceed source dimensions by default
+ if( !maxHeight )
+ job->maxHeight = title->height;
hb_fix_aspect( job, HB_KEEP_WIDTH );
}
else if( height )
{
job->height = height;
+ // do not exceed source dimensions by default
+ if( !maxWidth )
+ job->maxWidth = title->width;
hb_fix_aspect( job, HB_KEEP_HEIGHT );
}
else if( !width && !height )
{
+ /* Default to cropped width when one isn't specified
+ * avoids rounding to mod 16 regardless of modulus */
+ job->width = title->width - job->crop[2] - job->crop[3];
+ // do not exceed source dimensions by default
+ if( !maxHeight )
+ job->maxHeight = title->height;
hb_fix_aspect( job, HB_KEEP_WIDTH );
}
break;
}
- if( vquality >= 0.0 && ( ( vquality <= 1.0 ) || ( vcodec == HB_VCODEC_X264 ) || (vcodec == HB_VCODEC_FFMPEG) ) )
+ if( vquality >= 0.0 )
{
job->vquality = vquality;
job->vbitrate = 0;
{
job->vcodec = vcodec;
}
- if( h264_13 )
- {
- job->h264_level = 13;
- }
- if( h264_30 )
- {
- job->h264_level = 30;
- }
if( vrate )
{
job->cfr = cfr;
}
else
{
- fprintf(stderr, "ERROR: Unable to parse audio input \"%s\", skipping.",
+ fprintf(stderr, "ERROR: Unable to parse audio input \"%s\", skipping.\n",
token);
free(audio);
}
if( audio != NULL )
{
+ if ( !strcasecmp( token, "auto" ) )
+ {
+ arate = audio->in.samplerate;
+ }
if (!is_sample_rate_valid(arate))
{
fprintf(stderr, "Invalid sample rate %d, using input rate %d\n", arate, audio->in.samplerate);
}
}
/* Sample Rate */
+
+ /* Audio Mixdown */
+ i = 0;
+ if ( mixdowns )
+ {
+ char * token = strtok(mixdowns, ",");
+ if (token == NULL)
+ token = mixdowns;
+ while ( token != NULL )
+ {
+ mixdown = hb_mixdown_get_mixdown_from_short_name(token);
+ audio = hb_list_audio_config_item(job->list_audio, i);
+ if( audio != NULL )
+ {
+ audio->out.mixdown = mixdown;
+ if( (++i) >= num_audio_tracks )
+ break; /* We have more inputs than audio tracks, oops */
+ }
+ else
+ {
+ fprintf(stderr, "Ignoring mixdown, no audio tracks\n");
+ }
+ token = strtok(NULL, ",");
+ }
+ }
+ if (i < num_audio_tracks)
+ {
+ /* We have fewer inputs than audio tracks, use the default mixdown for the rest. Unless
+ * we only have one input, then use that.
+ */
+ int use_default = 0;
+ if (i != 1)
+ use_default = 1;
+
+ for (; i < num_audio_tracks; i++)
+ {
+ audio = hb_list_audio_config_item(job->list_audio, i);
+ if (use_default)
+ {
+ // Get default for this tracks codec and layout
+ mixdown = hb_get_default_mixdown( audio->out.codec, audio->in.channel_layout );
+ }
+ audio->out.mixdown = mixdown;
+ }
+ }
+ /* Audio Mixdown */
/* Audio Bitrate */
i = 0;
* for the remaining tracks. Unless we only have one input, then use
* that for all tracks.
*/
+ int use_default = 0;
if (i != 1)
- abitrate = default_abitrate;
+ use_default = 1;
+
for (; i < num_audio_tracks; i++)
{
audio = hb_list_audio_config_item(job->list_audio, i);
+ if (use_default)
+ {
+ abitrate = hb_get_default_audio_bitrate(
+ audio->out.codec, audio->out.samplerate,
+ audio->out.mixdown );
+ }
audio->out.bitrate = abitrate;
}
}
}
/* Audio DRC */
- /* Audio Mixdown */
- i = 0;
- if ( mixdowns )
- {
- char * token = strtok(mixdowns, ",");
- if (token == NULL)
- token = mixdowns;
- while ( token != NULL )
- {
- mixdown = hb_mixdown_get_mixdown_from_short_name(token);
- audio = hb_list_audio_config_item(job->list_audio, i);
- if( audio != NULL )
- {
- audio->out.mixdown = mixdown;
- if( (++i) >= num_audio_tracks )
- break; /* We have more inputs than audio tracks, oops */
- }
- else
- {
- fprintf(stderr, "Ignoring mixdown, no audio tracks\n");
- }
- token = strtok(NULL, ",");
- }
- }
- if (i < num_audio_tracks)
- {
- /* We have fewer inputs than audio tracks, use DPLII for the rest. Unless
- * we only have one input, then use that.
- */
- if (i != 1)
- mixdown = HB_AMIXDOWN_DOLBYPLII;
- for (; i < num_audio_tracks; i++)
- {
- audio = hb_list_audio_config_item(job->list_audio, i);
- audio->out.mixdown = mixdown;
- }
- }
- /* Audio Mixdown */
-
/* Audio Track Names */
i = 0;
if ( anames )
}
/* Audio Track Names */
+ /* Fix up passthru that needs to fallback to ac3 encode */
+ for( i = 0; i < hb_list_count( job->list_audio ); )
+ {
+ audio = hb_list_audio_config_item( job->list_audio, i );
+ if ( ( audio->out.codec & HB_ACODEC_AC3 ) &&
+ ( audio->out.codec & HB_ACODEC_PASS_FLAG ) &&
+ !( audio->out.codec & audio->in.codec ) )
+ {
+ // AC3 passthru not possible, fallback to AC3 encoder.
+ fprintf( stderr, "AC3 passthru requested and input codec is not AC3 for track %d, using AC3 encoder\n",
+ audio->out.track );
+ audio->out.codec = HB_ACODEC_AC3;
+ audio->out.mixdown = hb_get_default_mixdown( audio->out.codec, audio->in.channel_layout );
+ audio->out.bitrate = hb_get_default_audio_bitrate( audio->out.codec, audio->out.samplerate,
+ audio->out.mixdown );
+ }
+ // fix 'copy' to select a specific codec
+ if ( audio->out.codec & HB_ACODEC_PASS_FLAG )
+ {
+ audio->out.codec &= (audio->in.codec | HB_ACODEC_PASS_FLAG);
+ if ( !( audio->out.codec & HB_ACODEC_MASK ) )
+ {
+ // Passthru not possible, drop audio.
+ fprintf( stderr, "Passthru requested and input codec is not the same as output codec for track %d, dropping track\n",
+ audio->out.track );
+ hb_audio_t * item = hb_list_item( job->list_audio, i );
+ hb_list_rem( job->list_audio, item );
+ continue;
+ }
+ }
+ i++;
+ }
+
if( size )
{
job->vbitrate = hb_calc_bitrate( job, size );
sub_config.default_track =
( srtdefault != -1 ) && ( srtdefault == i + 1 );
sub_config.force = 0;
- strncpy( sub_config.src_filename, srtfile[i], 128);
- strncpy( sub_config.src_codeset, codeset, 40);
+ strncpy( sub_config.src_filename, srtfile[i], 255);
+ sub_config.src_filename[255] = 0;
+ strncpy( sub_config.src_codeset, codeset, 39);
+ sub_config.src_codeset[39] = 0;
sub_config.offset = offset;
hb_srt_add( job, &sub_config, lang);
#ifdef __APPLE_CC__
fprintf( out,
" -E, --aencoder <string> Audio encoder(s)\n"
- " (ca_aac/faac/lame/vorbis/ac3/ac3pass/dtspass)\n"
- " ac3pass and dtspass meaning passthrough\n"
+ " (ca_aac/faac/lame/vorbis/ac3/copy/copy:ac3/copy:dts)\n"
+ " copy, copy:ac3 and copy:dts meaning passthrough.\n"
+ " copy will passthrough either ac3 or dts.\n"
" Separated by commas for more than one audio track.\n"
- " (default: guessed)\n" );
+ " (default: ca_aac)\n" );
#else
fprintf( out,
" -E, --aencoder <string> Audio encoder(s):\n"
- " (faac/lame/vorbis/ac3/ac3pass/dtspass)\n"
- " ac3pass and dtspass meaning passthrough\n"
+ " (faac/lame/vorbis/ac3/copy/copy:ac3/copy:dts)\n"
+ " copy, copy:ac3 and copy:dts meaning passthrough.\n"
+ " copy will passthrough either ac3 or dts.\n"
" Separated by commas for more than one audio track.\n"
- " (default: guessed)\n" );
+ " (default: faac for mp4, lame for mkv)\n" );
#endif
fprintf( out,
- " -B, --ab <kb/s> Set audio bitrate(s) (default: 160)\n"
+ " -B, --ab <kb/s> Set audio bitrate(s) (default: depends on the\n"
+ " selected codec, mixdown and samplerate)\n"
" Separated by commas for more than one audio track.\n"
" -6, --mixdown <string> Format(s) for surround sound downmixing\n"
" Separated by commas for more than one audio track.\n"
- " (mono/stereo/dpl1/dpl2/6ch, default: dpl2)\n"
+ " (mono/stereo/dpl1/dpl2/6ch, default: up to 6ch for ac3,\n"
+ " up to dpl2 for other encoders)\n"
" -R, --arate Set audio samplerate(s) (" );
for( i = 0; i < hb_audio_rates_count; i++ )
{
" specified with '--subtitle'.\n"
" Separated by commas for more than one audio track.\n"
" Example: \"1,2,3\" for multiple tracks.\n"
- " If \"string\" is omitted, the first trac is forced.\n"
+ " If \"string\" is omitted, the first track is forced.\n"
" --subtitle-burn \"Burn\" the selected subtitle into the video track\n"
- " <number> If \"number\" is omitted, the first trac is burned.\n"
+ " <number> If \"number\" is omitted, the first track is burned.\n"
" \"number\" is an index into the subtitle list\n"
" specified with '--subtitle'.\n"
" --subtitle-default Flag the selected subtitle as the default subtitle\n"
" <number> to be displayed upon playback. Setting no default\n"
" means no subtitle will be automatically displayed\n"
- " If \"number\" is omitted, the first trac is default.\n"
+ " If \"number\" is omitted, the first track is default.\n"
" \"number\" is an index into the subtitle list\n"
" specified with '--subtitle'.\n"
" -N, --native-language Specifiy the your language preference. When the first\n"
****************************************************************************/
static void ShowPresets()
{
- printf("\n< Apple\n");
-
- printf("\n + Universal: -e x264 -q 20.0 -a 1,1 -E faac,ac3pass -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6\n");
-
- printf("\n + iPod: -e x264 -b 700 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0\n");
-
- printf("\n + iPhone & iPod Touch: -e x264 -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0\n");
-
+ fprintf( stderr, "%s - %s - %s\n", HB_PROJECT_TITLE, HB_PROJECT_BUILD_TITLE, HB_PROJECT_URL_WEBSITE );
+
+ printf("\n< Apple\n");
+
+ printf("\n + Universal: -e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6\n");
+
+ printf("\n + iPod: -e x264 -b 700 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0\n");
+
+ printf("\n + iPhone & iPod Touch: -e x264 -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0\n");
+
+ printf("\n + iPhone 4: -e x264 -q 20.0 -r 29.97 --pfr -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -4 -X 960 --loose-anamorphic -m\n");
+
printf("\n + iPad: -e x264 -q 20.0 -r 29.97 --pfr -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -4 -X 1024 --loose-anamorphic -m\n");
-
- printf("\n + AppleTV: -e x264 -q 20.0 -a 1,1 -E faac,ac3pass -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500\n");
-
+
+ printf("\n + AppleTV: -e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500\n");
+
+ printf("\n + AppleTV 2: -e x264 -q 20.0 -r 29.97 --pfr -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 1280 --loose-anamorphic -m\n");
+
printf("\n>\n");
-
+
printf("\n< Regular\n");
-
+
printf("\n + Normal: -e x264 -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 --strict-anamorphic -m -x ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0\n");
-
- printf("\n + High Profile: -e x264 -q 20.0 -a 1,1 -E faac,ac3pass -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x b-adapt=2:rc-lookahead=50\n");
-
+
+ printf("\n + High Profile: -e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x b-adapt=2:rc-lookahead=50\n");
+
printf("\n>\n");
-
+
printf("\n< Legacy\n");
-
+
printf("\n + Classic: -b 1000 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4\n");
-
- printf("\n + AppleTV Legacy: -e x264 -b 2500 -a 1,1 -E faac,ac3pass -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:b-pyramid=none:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
-
- printf("\n + iPhone Legacy: -e x264 -b 960 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0\n");
-
- printf("\n + iPod Legacy: -e x264 -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0\n");
-
+
+ printf("\n + AppleTV Legacy: -e x264 -b 2500 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
+
+ printf("\n + iPhone Legacy: -e x264 -b 960 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0\n");
+
+ printf("\n + iPod Legacy: -e x264 -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0\n");
+
printf("\n>\n");
}
{
vcodec = HB_VCODEC_X264;
}
- else if( !strcasecmp( optarg, "x264b13" ) )
- {
- vcodec = HB_VCODEC_X264;
- h264_13 = 1;
- }
- else if( !strcasecmp( optarg, "x264b30" ) )
- {
- vcodec = HB_VCODEC_X264;
- h264_30 = 1;
- }
else if( !strcasecmp( optarg, "theora" ) )
{
vcodec = HB_VCODEC_THEORA;
/* autodetect */
if( p && ( !strcasecmp( p, ".mp4" ) ||
- !strcasecmp( p, ".m4v" ) ) )
+ !strcasecmp( p, ".m4v" ) ) )
{
- if ( h264_30 == 1 )
- mux = HB_MUX_IPOD;
- else
- mux = HB_MUX_MP4;
- default_acodec = HB_ACODEC_FAAC;
+ mux = HB_MUX_MP4;
}
else if( p && !strcasecmp(p, ".mkv" ) )
{
mux = HB_MUX_MKV;
- default_acodec = HB_ACODEC_AC3;
+#ifndef __APPLE_CC__
+ // default to Lame for MKV (except under OS X where Core Audio is available)
+ default_acodec = HB_ACODEC_LAME;
+#endif
}
else
{
else if( !strcasecmp( format, "mp4" ) ||
!strcasecmp( format, "m4v" ) )
{
- if ( h264_30 == 1)
- mux = HB_MUX_IPOD;
- else
- mux = HB_MUX_MP4;
- default_acodec = HB_ACODEC_FAAC;
+ mux = HB_MUX_MP4;
}
else if( !strcasecmp( format, "mkv" ) )
{
mux = HB_MUX_MKV;
- default_acodec = HB_ACODEC_AC3;
+#ifndef __APPLE_CC__
+ // default to Lame for MKV (except under OS X where Core Audio is available)
+ default_acodec = HB_ACODEC_LAME;
+#endif
}
else
{
{
return HB_ACODEC_AC3;
}
- else if( !strcasecmp( codec, "ac3pass" ) )
+ else if( !strcasecmp( codec, "copy" ) )
+ {
+ return HB_ACODEC_AC3_PASS | HB_ACODEC_DCA_PASS;
+ }
+ else if( !strcasecmp( codec, "copy:ac3" ) )
{
return HB_ACODEC_AC3_PASS;
}
- else if( !strcasecmp( codec, "dtspass" ) || !strcasecmp( codec, "dcapass" ) )
+ else if( !strcasecmp( codec, "copy:dts" ) || !strcasecmp( codec, "copy:dca" ) )
{
return HB_ACODEC_DCA_PASS;
}