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;
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;
hb_scan_t * data = (hb_scan_t *) _data;
hb_title_t * title;
int i;
+ int feature = 0;
data->dvd = NULL;
data->stream = NULL;
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 )
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 */
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++;
}
title->job = job;
job->title = title;
+ job->feature = feature;
/* Set defaults settings */
job->chapter_start = 1;
job->mux = HB_MUX_MP4;
}
+finish:
+
if( data->dvd )
{
hb_dvd_close( &data->dvd );
{
hb_stream_close(&data->stream);
}
+ if( data->batch )
+ {
+ hb_batch_close( &data->batch );
+ }
free( data->path );
free( data );
_data = NULL;
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++ )
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 ) ) )
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 );
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 )
++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
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 )
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 )
{
/* 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;
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;
}
/*