X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=test%2Ftest.c;h=fc753d24f09ccf2a3b531f9beabb966f53ad7912;hb=3166f4bf518b12ef658ce4a249f9a265b16693bd;hp=f7253866758415a625215cb4929df19d8a95be76;hpb=d06ea93f002a1cf3380c890962d4ce1e000637e2;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/test/test.c b/test/test.c index f7253866..fc753d24 100644 --- a/test/test.c +++ b/test/test.c @@ -62,8 +62,6 @@ static int rotate = 0; 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; @@ -74,8 +72,11 @@ static char * arates = NULL; 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; @@ -364,6 +365,8 @@ int main( int argc, char ** argv ) 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; @@ -607,479 +610,567 @@ static int HandleEvents( hb_handle_t * h ) 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 ) @@ -1196,6 +1287,11 @@ static int HandleEvents( hb_handle_t * h ) { case 0: // Non-anamorphic + if (modulus) + { + job->modulus = modulus; + } + if( width && height ) { job->width = width; @@ -1204,15 +1300,27 @@ static int HandleEvents( hb_handle_t * h ) 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 ); } @@ -1339,7 +1447,7 @@ static int HandleEvents( hb_handle_t * h ) 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; @@ -1353,14 +1461,6 @@ static int HandleEvents( hb_handle_t * h ) { job->vcodec = vcodec; } - if( h264_13 ) - { - job->h264_level = 13; - } - if( h264_30 ) - { - job->h264_level = 30; - } if( vrate ) { job->cfr = cfr; @@ -1413,7 +1513,7 @@ static int HandleEvents( hb_handle_t * h ) } 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); } @@ -1600,6 +1700,10 @@ static int HandleEvents( hb_handle_t * h ) 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); @@ -1631,6 +1735,52 @@ static int HandleEvents( hb_handle_t * h ) } } /* 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; @@ -1663,11 +1813,19 @@ static int HandleEvents( hb_handle_t * h ) * 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; } } @@ -1713,45 +1871,6 @@ static int HandleEvents( hb_handle_t * h ) } /* 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 ) @@ -1788,6 +1907,39 @@ static int HandleEvents( hb_handle_t * h ) } /* 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 ); @@ -1925,8 +2077,10 @@ static int HandleEvents( hb_handle_t * h ) 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); @@ -2362,24 +2516,28 @@ static void ShowHelp() #ifdef __APPLE_CC__ fprintf( out, " -E, --aencoder 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 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 Set audio bitrate(s) (default: 160)\n" + " -B, --ab 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 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++ ) { @@ -2469,15 +2627,15 @@ static void ShowHelp() " 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" - " If \"number\" is omitted, the first trac is burned.\n" + " 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" " 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" @@ -2519,38 +2677,44 @@ static void ShowHelp() ****************************************************************************/ 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"); } @@ -3024,16 +3188,6 @@ static int ParseOptions( int argc, char ** argv ) { 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; @@ -3325,18 +3479,17 @@ static int CheckOptions( int argc, char ** argv ) /* 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 { @@ -3348,16 +3501,15 @@ static int CheckOptions( int argc, char ** argv ) 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 { @@ -3376,11 +3528,15 @@ static int get_acodec_for_string( char *codec ) { 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; }