static char * output = NULL;
static char * format = NULL;
static int titleindex = 1;
-static int longest_title = 0;
+static int titlescan = 0;
+static int main_feature = 0;
static char * native_language = NULL;
static int native_dub = 0;
static int twoPass = 0;
static int preview_count = 10;
static int store_previews = 0;
static int start_at_preview = 0;
+static int64_t start_at_pts = 0;
+static int start_at_frame = 0;
+static char * start_at_string = NULL;
+static char * start_at_token = NULL;
static int64_t stop_at_pts = 0;
static int stop_at_frame = 0;
static char * stop_at_string = NULL;
static char * stop_at_token = NULL;
+static uint64_t min_title_duration = 900000LL;
/* Exit cleanly on Ctrl-C */
static volatile int die = 0;
return 1;
}
-#if defined( PTW32_STATIC_LIB )
- pthread_win32_process_attach_np();
- pthread_win32_thread_attach_np();
-#endif
-
/* Register our error handler */
hb_register_error_handler(&hb_cli_error_handler);
"date.\n" );
}
hb_close( &h );
+ hb_global_close();
return 0;
}
/* Feed libhb with a DVD to scan */
fprintf( stderr, "Opening %s...\n", input );
- if (longest_title) {
+ if (main_feature) {
/*
- * We need to scan for all the titles in order to find the longest
+ * We need to scan for all the titles in order to find the main feature
*/
titleindex = 0;
}
- hb_scan( h, input, titleindex, preview_count, store_previews );
+ hb_scan( h, input, titleindex, preview_count, store_previews, min_title_duration );
/* Wait... */
while( !die )
/* Clean up */
hb_close( &h );
+ hb_global_close();
if( input ) free( input );
if( output ) free( output );
if( format ) free( format );
if( x264opts2 ) free (x264opts2 );
if (preset_name) free (preset_name);
if( stop_at_string ) free( stop_at_string );
+ if( start_at_string ) free( start_at_string );
fprintf( stderr, "HandBrake has exited.\n" );
-#if defined( PTW32_STATIC_LIB )
- pthread_win32_thread_detach_np();
- pthread_win32_process_detach_np();
-#endif
-
return 0;
}
int i;
fprintf( stderr, "+ title %d:\n", title->index );
+ if ( title->index == title->job->feature )
+ {
+ fprintf( stderr, " + Main Feature\n" );
+ }
if ( title->type == HB_STREAM_TYPE )
{
fprintf( stderr, " + stream: %s\n", title->path );
}
else if ( title->type == HB_DVD_TYPE )
{
- fprintf( stderr, " + vts %d, ttn %d, cells %d->%d (%d blocks)\n",
+ fprintf( stderr, " + vts %d, ttn %d, cells %d->%d (%"PRIu64" blocks)\n",
title->vts, title->ttn, title->cell_start, title->cell_end,
title->block_count );
}
- if (dvdnav)
+ if (title->angle_count > 1)
fprintf( stderr, " + angle(s) %d\n", title->angle_count );
fprintf( stderr, " + duration: %02d:%02d:%02d\n",
title->hours, title->minutes, title->seconds );
for( i = 0; i < hb_list_count( title->list_chapter ); i++ )
{
chapter = hb_list_item( title->list_chapter, i );
- fprintf( stderr, " + %d: cells %d->%d, %d blocks, duration "
+ fprintf( stderr, " + %d: cells %d->%d, %"PRIu64" blocks, duration "
"%02d:%02d:%02d\n", chapter->index,
chapter->cell_start, chapter->cell_end,
chapter->block_count, chapter->hours, chapter->minutes,
case HB_STATE_SCANNING:
/* Show what title is currently being scanned */
fprintf( stderr, "Scanning title %d", p.title_cur );
- if( !titleindex )
+ if( !titleindex || titlescan )
fprintf( stderr, " of %d", p.title_count );
fprintf( stderr, "...\n" );
break;
die = 1;
break;
}
- if( longest_title )
+ if( main_feature )
{
int i;
- int longest_title_idx=0;
- int longest_title_pos=-1;
- int longest_title_time=0;
+ int main_feature_idx=0;
+ int main_feature_pos=-1;
+ int main_feature_time=0;
int title_time;
- fprintf( stderr, "Searching for longest title...\n" );
+ fprintf( stderr, "Searching for main feature title...\n" );
for( i = 0; i < hb_list_count( list ); i++ )
{
title_time = (title->hours*60*60 ) + (title->minutes *60) + (title->seconds);
fprintf( stderr, " + Title (%d) index %d has length %dsec\n",
i, title->index, title_time );
- if( longest_title_time < title_time )
+ if( main_feature_time < title_time )
+ {
+ main_feature_time = title_time;
+ main_feature_pos = i;
+ main_feature_idx = title->index;
+ }
+ if( title->job->feature == title->index )
{
- longest_title_time = title_time;
- longest_title_pos = i;
- longest_title_idx = title->index;
+ main_feature_time = title_time;
+ main_feature_pos = i;
+ main_feature_idx = title->index;
+ break;
}
}
- if( longest_title_pos == -1 )
+ if( main_feature_pos == -1 )
{
- fprintf( stderr, "No longest title found.\n" );
+ fprintf( stderr, "No main feature title found.\n" );
die = 1;
break;
}
- titleindex = longest_title_idx;
- fprintf( stderr, "Found longest title, setting title to %d\n",
- longest_title_idx);
+ titleindex = main_feature_idx;
+ fprintf( stderr, "Found main feature title, setting title to %d\n",
+ main_feature_idx);
- title = hb_list_item( list, longest_title_pos);
+ title = hb_list_item( list, main_feature_pos);
} else {
title = hb_list_item( list, 0 );
}
- if( !titleindex )
+ if( !titleindex || titlescan )
{
/* Scan-only mode, print infos and exit */
int i;
PrintTitleInfo( title );
- if( chapter_start && chapter_end && !stop_at_pts && !start_at_preview && !stop_at_frame )
+ if( chapter_start && chapter_end && !stop_at_pts && !start_at_preview && !stop_at_frame && !start_at_pts && !start_at_frame )
{
job->chapter_start = MAX( job->chapter_start,
chapter_start );
}
if( !arates )
{
- arates = strdup("48,Auto");
+ arates = strdup("Auto,Auto");
}
if( !dynamic_range_compression )
{
{
x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6");
}
- anamorphic_mode = 2;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
job->chapter_markers = 1;
+
}
if (!strcmp(preset_name, "iPod"))
}
if( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
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( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
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( !arates )
{
- arates = strdup("48,Auto");
+ arates = strdup("Auto,Auto");
}
if( !dynamic_range_compression )
{
maxWidth = 960;
if( !x264opts )
{
- x264opts = strdup("cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0");
+ 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;
}
- anamorphic_mode = 2;
job->chapter_markers = 1;
+
}
if (!strcmp(preset_name, "Normal"))
}
if( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
{
x264opts = strdup("ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
}
- anamorphic_mode = 1;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 1;
+ }
job->chapter_markers = 1;
+
}
if (!strcmp(preset_name, "High Profile"))
}
if( !arates )
{
- arates = strdup("48,Auto");
+ arates = strdup("Auto,Auto");
}
if( !dynamic_range_compression )
{
}
detelecine = 1;
decomb = 1;
- anamorphic_mode = 2;
+ if( !anamorphic_mode )
+ {
+ anamorphic_mode = 2;
+ }
job->chapter_markers = 1;
+
}
if (!strcmp(preset_name, "Classic"))
}
if( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
dynamic_range_compression = strdup("0.0");
}
+
}
if (!strcmp(preset_name, "AppleTV Legacy"))
}
if( !arates )
{
- arates = strdup("48,Auto");
+ arates = strdup("Auto,Auto");
}
if( !dynamic_range_compression )
{
}
if( !x264opts )
{
- x264opts = strdup("ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
+ 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;
}
- anamorphic_mode = 1;
job->chapter_markers = 1;
+
}
if (!strcmp(preset_name, "iPhone Legacy"))
}
if( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
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( !arates )
{
- arates = strdup("48");
+ arates = strdup("Auto");
}
if( !dynamic_range_compression )
{
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 ( chapter_markers )
if (modulus)
{
- job->anamorphic.modulus = modulus;
+ job->modulus = modulus;
}
if( itu_par )
if (modulus)
{
- job->anamorphic.modulus = modulus;
+ job->modulus = modulus;
}
if( itu_par )
}
force = test_sub_list( subforce, "scan", pos );
- if ( !burn && mux == HB_MUX_MKV )
+ if ( !burn )
{
job->select_subtitle_config.dest = PASSTHRUSUB;
}
- else if ( burn )
+ else
{
if ( sub_burned )
{
}
sub_burned = 1;
}
- if ( !( !burn && mux == HB_MUX_MP4 ) )
- {
- job->select_subtitle_config.force = force;
- job->select_subtitle_config.default_track = def;
- subtitle_scan = 1;
- } else {
- fprintf( stderr, "Warning: Subtitle Scan for MP4 requires the '--subtitle-burn' option to be selected\n");
- }
+ job->select_subtitle_config.force = force;
+ job->select_subtitle_config.default_track = def;
+ subtitle_scan = 1;
}
else
{
force = test_sub_list(subforce, token, pos);
- if ( !burn && mux == HB_MUX_MKV &&
- subtitle->format == PICTURESUB)
+ if ( !burn && subtitle->format == PICTURESUB)
{
sub_config.dest = PASSTHRUSUB;
}
- else if (!burn && mux == HB_MUX_MP4 &&
- subtitle->format == PICTURESUB)
- {
- // Skip any non-burned vobsubs when output is mp4
- fprintf( stderr, "Warning: Skipping subtitle track %d, can't pass-through VOBSUBs in an MP4 container,\nadd '--subtitle-burn %d' to the command line\n", track+1, track+1 );
- continue;
- }
else if ( burn && subtitle->format == PICTURESUB )
{
// Only allow one subtitle to be burned into video
subtitle_scan = 0;
}
+ if( start_at_pts )
+ {
+ job->pts_to_start = start_at_pts;
+ subtitle_scan = 0;
+ }
+
+ if( start_at_frame )
+ {
+ job->frame_to_start = start_at_frame;
+ subtitle_scan = 0;
+ }
+
if( subtitle_scan )
{
char *x264opts_tmp;
}
#define p s.param.working
+ case HB_STATE_SEARCHING:
+ fprintf( stdout, "\rEncoding: task %d of %d, Searching for start time, %.2f %%",
+ p.job_cur, p.job_count, 100.0 * p.progress );
+ if( p.seconds > -1 )
+ {
+ fprintf( stdout, " (ETA %02dh%02dm%02ds)",
+ p.hours, p.minutes, p.seconds );
+ }
+ fflush(stdout);
+ break;
+
case HB_STATE_WORKING:
fprintf( stdout, "\rEncoding: task %d of %d, %.2f %%",
p.job_cur, p.job_count, 100.0 * p.progress );
"### Source Options-----------------------------------------------------------\n\n"
" -i, --input <string> Set input device\n"
- " -t, --title <number> Select a title to encode (0 to scan only,\n"
+ " -t, --title <number> Select a title to encode (0 to scan all titles only,\n"
" default: 1)\n"
- " -L, --longest Select the longest title\n"
+ " --scan Scan selected title only.\n"
+ " --main-feature Detect and select the main feature title.\n"
" -c, --chapters <string> Select chapters (e.g. \"1-3\" for chapters\n"
" 1 to 3, or \"3\" for chapter 3 only,\n"
" default: all chapters)\n"
" and whether or not they're stored to disk (0 or 1).\n"
" (default: 10:0)\n"
" --start-at-preview <#> Start encoding at a given preview.\n"
+ " --start-at <unit:#> Start encoding at a given frame, duration (in seconds),\n"
+ " or pts (on a 90kHz clock)\n"
" --stop-at <unit:#> Stop encoding at a given frame, duration (in seconds),\n"
" or pts (on a 90kHz clock)"
"\n"
" -x, --x264opts <string> Specify advanced x264 options in the\n"
" same style as mencoder:\n"
" option1=value1:option2=value2\n"
- " -q, --quality <float> Set video quality (0.0..1.0)\n"
+ " -q, --quality <number> Set video quality\n"
" -S, --size <MB> Set target size\n"
" -b, --vb <kb/s> Set video bitrate (default: 1000)\n"
" -2, --two-pass Use two-pass mode\n"
" --itu-par Use wider, ITU pixel aspect values for loose and\n"
" custom anamorphic, useful with underscanned sources\n"
" --modulus Set the number you want the scaled pixel dimensions\n"
- " <number> to divide cleanly by, for loose and custom\n"
- " anamorphic modes (default: 16)\n"
+ " <number> to divide cleanly by. Does not affect strict\n"
+ " anamorphic mode, which is always mod 2 (default: 16)\n"
" -M --color-matrix Set the color space signaled by the output\n"
" <601 or 709> (Bt.601 is mostly for SD content, Bt.709 for HD,\n"
" default: set by resolution)\n"
{
printf("\n< Apple\n");
- printf("\n + Universal: -e x264 -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,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 + Universal: -e x264 -q 20.0 -a 1,1 -E faac,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: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 + iPod: -e x264 -b 700 -a 1 -E faac -B 160 -6 dpl2 -R 48 -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");
- printf("\n + iPhone & iPod Touch: -e x264 -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0\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,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0\n");
+ printf("\n + AppleTV: -e x264 -q 20.0 -a 1,1 -E faac,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>\n");
printf("\n< Regular\n");
- printf("\n + Normal: -e x264 -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R 48 -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 + 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,ac3 -B 160,160 -6 dpl2,auto -R 48,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,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 48 -D 0.0 -f mp4\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,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
+ printf("\n + AppleTV Legacy: -e x264 -b 2500 -a 1,1 -E faac,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: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 48 -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 + 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 48 -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 + 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>\n");
+
}
static char * hb_strndup( char * str, int len )
#define PREVIEWS 257
#define START_AT_PREVIEW 258
- #define STOP_AT 259
- #define ANGLE 260
- #define DVDNAV 261
- #define DISPLAY_WIDTH 262
- #define PIXEL_ASPECT 263
- #define MODULUS 264
- #define KEEP_DISPLAY_ASPECT 265
- #define SUB_BURNED 266
- #define SUB_DEFAULT 267
- #define NATIVE_DUB 268
- #define SRT_FILE 269
- #define SRT_CODESET 270
- #define SRT_OFFSET 271
- #define SRT_LANG 272
- #define SRT_DEFAULT 273
- #define ROTATE_FILTER 274
+ #define START_AT 259
+ #define STOP_AT 260
+ #define ANGLE 261
+ #define DVDNAV 262
+ #define DISPLAY_WIDTH 263
+ #define PIXEL_ASPECT 264
+ #define MODULUS 265
+ #define KEEP_DISPLAY_ASPECT 266
+ #define SUB_BURNED 267
+ #define SUB_DEFAULT 268
+ #define NATIVE_DUB 269
+ #define SRT_FILE 270
+ #define SRT_CODESET 271
+ #define SRT_OFFSET 272
+ #define SRT_LANG 273
+ #define SRT_DEFAULT 274
+ #define ROTATE_FILTER 275
+ #define SCAN_ONLY 276
+ #define MAIN_FEATURE 277
+ #define MIN_DURATION 278
for( ;; )
{
{ "ipod-atom", no_argument, NULL, 'I' },
{ "title", required_argument, NULL, 't' },
- { "longest", no_argument, NULL, 'L' },
+ { "min-duration",required_argument, NULL, MIN_DURATION },
+ { "scan", no_argument, NULL, SCAN_ONLY },
+ { "main-feature",no_argument, NULL, MAIN_FEATURE },
{ "chapters", required_argument, NULL, 'c' },
{ "angle", required_argument, NULL, ANGLE },
{ "markers", optional_argument, NULL, 'm' },
{ "color-matrix",required_argument, NULL, 'M' },
{ "previews", required_argument, NULL, PREVIEWS },
{ "start-at-preview", required_argument, NULL, START_AT_PREVIEW },
+ { "start-at", required_argument, NULL, START_AT },
{ "stop-at", required_argument, NULL, STOP_AT },
{ "vfr", no_argument, &cfr, 0 },
{ "cfr", no_argument, &cfr, 1 },
int option_index = 0;
int c;
+ int cur_optind;
- c = getopt_long( argc, argv,
- "hv::uC:f:4i:Io:t:Lc:m::M:a:A:6:s:UF::N:e:E:2dD:7895gOw:l:n:b:q:S:B:r:R:x:TY:X:Z:z",
+ cur_optind = optind;
+ c = getopt_long( argc, argv,
+ "hv::uC:f:4i:Io:t:c:m::M:a:A:6:s:UF::N:e:E:"
+ "2dD:7895gOw:l:n:b:q:S:B:r:R:x:TY:X:Z:z",
long_options, &option_index );
if( c < 0 )
{
case 't':
titleindex = atoi( optarg );
break;
- case 'L':
- longest_title = 1;
+ case SCAN_ONLY:
+ titlescan = 1;
+ break;
+ case MAIN_FEATURE:
+ main_feature = 1;
break;
case 'c':
{
case START_AT_PREVIEW:
start_at_preview = atoi( optarg );
break;
+ case START_AT:
+ start_at_string = strdup( optarg );
+ start_at_token = strtok( start_at_string, ":");
+ if( !strcmp( start_at_token, "frame" ) )
+ {
+ start_at_token = strtok( NULL, ":");
+ start_at_frame = atoi(start_at_token);
+ }
+ else if( !strcmp( start_at_token, "pts" ) )
+ {
+ start_at_token = strtok( NULL, ":");
+ sscanf( start_at_token, "%"SCNd64, &start_at_pts );
+ }
+ else if( !strcmp( start_at_token, "duration" ) )
+ {
+ start_at_token = strtok( NULL, ":");
+ sscanf( start_at_token, "%"SCNd64, &start_at_pts );
+ start_at_pts *= 90000LL;
+ }
+ break;
case STOP_AT:
stop_at_string = strdup( optarg );
stop_at_token = strtok( stop_at_string, ":");
else if( atoi( optarg ) == 709 )
color_matrix = 2;
break;
+ case MIN_DURATION:
+ min_title_duration = strtol( optarg, NULL, 0 );
+ break;
default:
- fprintf( stderr, "unknown option (%s)\n", argv[optind] );
+ fprintf( stderr, "unknown option (%s)\n", argv[cur_optind] );
return -1;
}
}
}
/* Parse format */
- if( titleindex > 0 )
+ if( titleindex > 0 && !titlescan )
{
if( output == NULL || *output == '\0' )
{