X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fscan.c;h=ea15fc512eb32230d8faf293bc943c9319cce7f8;hb=7dc534bc87accdf2d58a0a6e8e209fdf9c46f41a;hp=a549285b58376e1b0c0601940cce0048a9c21eb6;hpb=67a2494fca9ce3c00649d967f15300a505143fe6;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/scan.c b/libhb/scan.c index a549285b..ea15fc51 100644 --- a/libhb/scan.c +++ b/libhb/scan.c @@ -12,17 +12,19 @@ typedef struct { - hb_handle_t * h; + hb_handle_t * h; + volatile int * die; - char * path; - int title_index; - hb_list_t * list_title; + char * path; + int title_index; + hb_list_t * list_title; - hb_dvd_t * dvd; - hb_stream_t * stream; + hb_dvd_t * dvd; + hb_stream_t * stream; + hb_batch_t * batch; - int preview_count; - int store_previews; + int preview_count; + int store_previews; } hb_scan_t; @@ -43,13 +45,15 @@ static const char *aspect_to_string( double aspect ) return arstr; } -hb_thread_t * hb_scan_init( hb_handle_t * handle, const char * path, - int title_index, hb_list_t * list_title, - int preview_count, int store_previews ) +hb_thread_t * hb_scan_init( hb_handle_t * handle, volatile int * die, + const char * path, int title_index, + hb_list_t * list_title, int preview_count, + int store_previews ) { hb_scan_t * data = calloc( sizeof( hb_scan_t ), 1 ); data->h = handle; + data->die = die; data->path = strdup( path ); data->title_index = title_index; data->list_title = list_title; @@ -91,6 +95,20 @@ static void ScanFunc( void * _data ) } } } + else if ( ( data->batch = hb_batch_init( data->path ) ) ) + { + /* Scan all titles */ + for( i = 0; i < hb_batch_title_count( data->batch ); i++ ) + { + hb_title_t * title; + + title = hb_batch_title_scan( data->batch, i + 1 ); + if ( title != NULL ) + { + hb_list_add( data->list_title, title ); + } + } + } else if ( (data->stream = hb_stream_open( data->path, 0 ) ) != NULL ) { hb_list_add( data->list_title, hb_stream_title_scan( data->stream ) ); @@ -106,35 +124,12 @@ static void ScanFunc( void * _data ) int j; hb_state_t state; hb_audio_t * audio; - hb_title_t * title_tmp = NULL; - - title = hb_list_item( data->list_title, i ); - /* I've seen a DVD with strictly identical titles. Check this - here and ignore it if redundant */ - for( j = 0; j < i; j++ ) - { - title_tmp = hb_list_item( data->list_title, j ); - if( title->vts == title_tmp->vts && - title->block_start == title_tmp->block_start && - title->block_end == title_tmp->block_end && - title->block_count == title_tmp->block_count ) - { - break; - } - else - { - title_tmp = NULL; - } - } - if( title_tmp ) + if ( *data->die ) { - hb_log( "scan: title %d is duplicate with title %d", - title->index, title_tmp->index ); - hb_list_rem( data->list_title, title ); - free( title ); /* This _will_ leak! */ - continue; + goto finish; } + title = hb_list_item( data->list_title, i ); #define p state.param.scanning /* Update the UI */ @@ -224,12 +219,13 @@ static void ScanFunc( void * _data ) job->vrate_base = title->rate_base; job->list_audio = hb_list_init(); - - job->subtitle = -1; + job->list_subtitle = hb_list_init(); job->mux = HB_MUX_MP4; } +finish: + if( data->dvd ) { hb_dvd_close( &data->dvd ); @@ -238,6 +234,10 @@ static void ScanFunc( void * _data ) { hb_stream_close(&data->stream); } + if( data->batch ) + { + hb_batch_close( &data->batch ); + } free( data->path ); free( data ); _data = NULL; @@ -407,9 +407,13 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) if (data->dvd) { - hb_dvd_start( data->dvd, title, 1 ); - title->angle_count = hb_dvd_angle_count( data->dvd ); - hb_log( "scan: title angle(s) %d", title->angle_count ); + hb_dvd_start( data->dvd, title, 1 ); + title->angle_count = hb_dvd_angle_count( data->dvd ); + hb_log( "scan: title angle(s) %d", title->angle_count ); + } + else if (data->batch) + { + data->stream = hb_stream_open( title->path, title ); } for( i = 0; i < data->preview_count; i++ ) @@ -418,6 +422,10 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) FILE * file_preview; char filename[1024]; + if ( *data->die ) + { + return 0; + } if (data->dvd) { if( !hb_dvd_seek( data->dvd, (float) ( i + 1 ) / ( data->preview_count + 1.0 ) ) ) @@ -441,6 +449,7 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2; hb_work_object_t *vid_decoder = hb_get_work( vcodec ); vid_decoder->codec_param = title->video_codec_param; + vid_decoder->title = title; vid_decoder->init( vid_decoder, NULL ); hb_buffer_t * vid_buf = NULL; int vidskip = 0; @@ -600,7 +609,7 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) hb_get_tempory_filename( data->h, filename, "%" PRIxPTR "%d", (intptr_t)title, i ); - file_preview = fopen( filename, "w" ); + file_preview = fopen( filename, "wb" ); if( file_preview ) { fwrite( vid_buf->data, title->width * title->height * 3 / 2, @@ -690,6 +699,11 @@ skip_preview: hb_buffer_close( &vid_buf ); } + if ( data->batch && data->stream ) + { + hb_stream_close( &data->stream ); + } + if ( npreviews ) { // use the most common frame info for our final title dimensions