X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fscan.c;h=a45829b155a8cb488d57fd5a1cdb24137769785d;hb=2d0e6c375b8dfd89d66b05128be8b2c236834b57;hp=ea15fc512eb32230d8faf293bc943c9319cce7f8;hpb=7dc534bc87accdf2d58a0a6e8e209fdf9c46f41a;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/scan.c b/libhb/scan.c index ea15fc51..a45829b1 100644 --- a/libhb/scan.c +++ b/libhb/scan.c @@ -69,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; @@ -93,18 +94,22 @@ 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 + 1 ); + title = hb_batch_title_scan( data->batch, i ); if ( title != NULL ) { + title->index = j++; hb_list_add( data->list_title, title ); } } @@ -160,6 +165,11 @@ 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++; } @@ -176,6 +186,7 @@ static void ScanFunc( void * _data ) title->job = job; job->title = title; + job->feature = feature; /* Set defaults settings */ job->chapter_start = 1; @@ -510,9 +521,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 ); @@ -606,8 +618,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 ) @@ -695,6 +707,15 @@ 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 ); } @@ -827,9 +848,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 ) @@ -842,6 +875,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 ) { @@ -855,6 +889,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; @@ -895,7 +932,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; } /*