X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fscan.c;h=68188a25344b30d3593bdb5ead33e2795895fa68;hb=32219d93ec8fcf0db6f7ca5d6045419882563951;hp=74cc52adb9b96c4dda1de5cdf331b28d01c5942f;hpb=894f08d4ce71b3a7d461e40e965b1e4394b0035c;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/scan.c b/libhb/scan.c index 74cc52ad..68188a25 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; @@ -65,6 +69,7 @@ static void ScanFunc( void * _data ) hb_scan_t * data = (hb_scan_t *) _data; hb_title_t * title; int i; + int feature = 0; data->dvd = NULL; data->stream = NULL; @@ -89,6 +94,24 @@ static void ScanFunc( void * _data ) hb_list_add( data->list_title, hb_dvd_title_scan( data->dvd, i + 1 ) ); } + feature = hb_dvd_main_feature( data->dvd, data->list_title ); + } + } + else if ( ( data->batch = hb_batch_init( data->path ) ) ) + { + int j = 1; + + /* 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 ); + if ( title != NULL ) + { + title->index = j++; + hb_list_add( data->list_title, title ); + } } } else if ( (data->stream = hb_stream_open( data->path, 0 ) ) != NULL ) @@ -107,6 +130,10 @@ static void ScanFunc( void * _data ) hb_state_t state; hb_audio_t * audio; + if ( *data->die ) + { + goto finish; + } title = hb_list_item( data->list_title, i ); #define p state.param.scanning @@ -138,9 +165,30 @@ static void ScanFunc( void * _data ) free( audio ); continue; } + if ( audio->priv.scan_cache ) + { + hb_fifo_flush( audio->priv.scan_cache ); + hb_fifo_close( &audio->priv.scan_cache ); + } j++; } + if ( data->dvd ) + { + // The subtitle width and height needs to be set to the + // title widht and height for DVDs. title width and + // height don't get set until we decode previews, so + // we can't set subtitle width/height till we get here. + for( j = 0; j < hb_list_count( title->list_subtitle ); j++ ) + { + hb_subtitle_t *subtitle = hb_list_item( title->list_subtitle, j ); + if ( subtitle->source == VOBSUB ) + { + subtitle->width = title->width; + subtitle->height = title->height; + } + } + } i++; } @@ -154,6 +202,7 @@ static void ScanFunc( void * _data ) title->job = job; job->title = title; + job->feature = feature; /* Set defaults settings */ job->chapter_start = 1; @@ -202,6 +251,8 @@ static void ScanFunc( void * _data ) job->mux = HB_MUX_MP4; } +finish: + if( data->dvd ) { hb_dvd_close( &data->dvd ); @@ -210,6 +261,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; @@ -379,9 +434,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++ ) @@ -390,6 +449,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 ) ) ) @@ -474,9 +537,10 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) vid_buf = NULL; } } - else if( ! AllAudioOK( title ) ) + else if( ! AllAudioOK( title ) ) { LookForAudio( title, buf_es ); + buf_es = NULL; } if ( buf_es ) hb_buffer_close( &buf_es ); @@ -570,8 +634,8 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) if( data->store_previews ) { - hb_get_tempory_filename( data->h, filename, "%" PRIxPTR "%d", - (intptr_t)title, i ); + hb_get_tempory_filename( data->h, filename, "%d_%d_%d", + hb_get_instance_id(data->h), title->index, i ); file_preview = fopen( filename, "wb" ); if( file_preview ) @@ -659,10 +723,24 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) ++npreviews; skip_preview: + /* Make sure we found audio rates and bitrates */ + for( j = 0; j < hb_list_count( title->list_audio ); j++ ) + { + hb_audio_t * audio = hb_list_item( title->list_audio, j ); + if ( audio->priv.scan_cache ) + { + hb_fifo_flush( audio->priv.scan_cache ); + } + } if ( vid_buf ) 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 @@ -786,9 +864,21 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b ) if( !audio || audio->config.in.bitrate != 0 ) { /* not found or already done */ + hb_buffer_close( &b ); return; } + if ( audio->priv.scan_cache == NULL ) + audio->priv.scan_cache = hb_fifo_init( 16, 16 ); + + if ( hb_fifo_size_bytes( audio->priv.scan_cache ) >= 4096 ) + { + hb_buffer_t * tmp; + tmp = hb_fifo_get( audio->priv.scan_cache ); + hb_buffer_close( &tmp ); + } + hb_fifo_push( audio->priv.scan_cache, b ); + hb_work_object_t *w = hb_codec_decoder( audio->config.in.codec ); if ( w == NULL || w->bsinfo == NULL ) @@ -801,6 +891,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b ) hb_work_info_t info; w->audio = audio; w->codec_param = audio->config.in.codec_param; + b = hb_fifo_see( audio->priv.scan_cache ); int ret = w->bsinfo( w, b, &info ); if ( ret < 0 ) { @@ -814,6 +905,9 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b ) /* didn't find any info */ return; } + hb_fifo_flush( audio->priv.scan_cache ); + hb_fifo_close( &audio->priv.scan_cache ); + audio->config.in.samplerate = info.rate; audio->config.in.bitrate = info.bitrate; audio->config.in.channel_layout = info.channel_layout; @@ -854,7 +948,10 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b ) if ( w ) free( w ); + hb_fifo_flush( audio->priv.scan_cache ); + hb_fifo_close( &audio->priv.scan_cache ); hb_list_rem( title->list_audio, audio ); + return; } /*