static char * output = NULL;
static char * format = NULL;
static int titleindex = 1;
+static int titlescan = 0;
static int longest_title = 0;
static char * native_language = NULL;
static int native_dub = 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;
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;
}
/* 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;
}
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;
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 );
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-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500");
}
anamorphic_mode = 2;
job->chapter_markers = 1;
if (modulus)
{
- job->anamorphic.modulus = modulus;
+ job->modulus = modulus;
}
if( itu_par )
if (modulus)
{
- job->anamorphic.modulus = modulus;
+ job->modulus = modulus;
}
if( itu_par )
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"
+ " --scan Scan selected title only.\n"
" -L, --longest Select the longest title\n"
" -c, --chapters <string> Select chapters (e.g. \"1-3\" for chapters\n"
" 1 to 3, or \"3\" for chapter 3 only,\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"
" --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 + 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 + 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 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:vbv-maxrate=9500:vbv-bufsize=9500\n");
printf("\n>\n");
#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
for( ;; )
{
{ "ipod-atom", no_argument, NULL, 'I' },
{ "title", required_argument, NULL, 't' },
+ { "scan", no_argument, NULL, SCAN_ONLY },
{ "longest", no_argument, NULL, 'L' },
{ "chapters", required_argument, NULL, 'c' },
{ "angle", required_argument, NULL, ANGLE },
{ "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 },
case 't':
titleindex = atoi( optarg );
break;
+ case SCAN_ONLY:
+ titlescan = 1;
+ break;
case 'L':
longest_title = 1;
break;
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, ":");
}
/* Parse format */
- if( titleindex > 0 )
+ if( titleindex > 0 && !titlescan )
{
if( output == NULL || *output == '\0' )
{