X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Freader.c;h=1d89c4f70fecb3a04785315ff14f77d0c01f8e7d;hb=ba2864fb60482a5bacb552d17c538b0ed5303a4a;hp=47ec9d5469090a3d13f7f33016315d20a8662f33;hpb=52d45181a7d1df6016d32c1842622660224538e0;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/reader.c b/libhb/reader.c index 47ec9d54..1d89c4f7 100644 --- a/libhb/reader.c +++ b/libhb/reader.c @@ -14,6 +14,9 @@ typedef struct hb_dvd_t * dvd; hb_buffer_t * ps; + hb_stream_t * stream; + + uint sequence; } hb_reader_t; @@ -37,6 +40,7 @@ hb_thread_t * hb_reader_init( hb_job_t * job ) r->job = job; r->title = job->title; r->die = job->die; + r->sequence = 0; return hb_thread_init( "reader", ReaderFunc, r, HB_NORMAL_PRIORITY ); @@ -53,40 +57,102 @@ static void ReaderFunc( void * _r ) hb_fifo_t * fifo; hb_buffer_t * buf; hb_list_t * list; - int chapter; + int chapter = -1; + int chapter_end = r->job->chapter_end; if( !( r->dvd = hb_dvd_init( r->title->dvd ) ) ) { - return; + if ( !(r->stream = hb_stream_open(r->title->dvd) ) ) + { + return; + } } - if( !hb_dvd_start( r->dvd, r->title->index, r->job->chapter_start ) ) + if (r->dvd) { - hb_dvd_close( &r->dvd ); - return; - } + /* + * XXX this code is a temporary hack that should go away if/when + * chapter merging goes away in libhb/dvd.c + * map the start and end chapter numbers to on-media chapter + * numbers since chapter merging could cause the handbrake numbers + * to diverge from the media numbers and, if our chapter_end is after + * a media chapter that got merged, we'll stop ripping too early. + */ + int start = r->job->chapter_start; + hb_chapter_t * chap = hb_list_item( r->title->list_chapter, chapter_end - 1 ); + + chapter_end = chap->index; + if (start > 1) + { + chap = hb_list_item( r->title->list_chapter, start - 1 ); + start = chap->index; + } + /* end chapter mapping XXX */ + if( !hb_dvd_start( r->dvd, r->title->index, start ) ) + { + hb_dvd_close( &r->dvd ); + return; + } + } + list = hb_list_init(); - r->ps = hb_buffer_init( 2048 ); + r->ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE ); while( !*r->die && !r->job->done ) { - chapter = hb_dvd_chapter( r->dvd ); + if (r->dvd) + chapter = hb_dvd_chapter( r->dvd ); + else if (r->stream) + chapter = 1; + if( chapter < 0 ) { hb_log( "reader: end of the title reached" ); break; } - if( chapter > r->job->chapter_end ) + if( chapter > chapter_end ) { - hb_log( "reader: end of chapter %d reached (%d)", - r->job->chapter_end, chapter ); + hb_log( "reader: end of chapter %d (media %d) reached at media chapter %d", + r->job->chapter_end, chapter_end, chapter ); break; } - if( !hb_dvd_read( r->dvd, r->ps ) ) + if (r->dvd) + { + if( !hb_dvd_read( r->dvd, r->ps ) ) + { + break; + } + } + else if (r->stream) { + if ( !hb_stream_read( r->stream, r->ps ) ) + { break; + } + } + + if( r->job->indepth_scan ) + { + /* + * Need to update the progress during a subtitle scan + */ + hb_state_t state; + +#define p state.param.working + + state.state = HB_STATE_WORKING; + p.progress = (float)chapter / (float)r->job->chapter_end; + if( p.progress > 1.0 ) + { + p.progress = 1.0; + } + p.rate_avg = 0.0; + p.hours = -1; + p.minutes = -1; + p.seconds = -1; + hb_set_state( r->job->h, &state ); } hb_demux_ps( r->ps, list ); @@ -102,6 +168,7 @@ static void ReaderFunc( void * _r ) { hb_snooze( 50 ); } + buf->sequence = r->sequence++; hb_fifo_push( fifo, buf ); } else @@ -113,8 +180,18 @@ static void ReaderFunc( void * _r ) hb_list_empty( &list ); hb_buffer_close( &r->ps ); - hb_dvd_stop( r->dvd ); - hb_dvd_close( &r->dvd ); + if (r->dvd) + { + hb_dvd_stop( r->dvd ); + hb_dvd_close( &r->dvd ); + } + else if (r->stream) + { + hb_stream_close(&r->stream); + } + + free( r ); + _r = NULL; hb_log( "reader: done" ); } @@ -133,21 +210,57 @@ static hb_fifo_t * GetFifoForId( hb_job_t * job, int id ) if( id == 0xE0 ) { - return job->fifo_mpeg2; + if( job->indepth_scan ) + { + /* + * Ditch the video here during the indepth scan until + * we can improve the MPEG2 decode performance. + */ + return NULL; + } + else + { + return job->fifo_mpeg2; + } } - if( ( subtitle = hb_list_item( title->list_subtitle, 0 ) ) && - id == subtitle->id ) - { - return subtitle->fifo_in; + if( job->indepth_scan ) { + /* + * Count the occurances of the subtitles, don't actually + * return any to encode unless we are looking fro forced + * subtitles in which case we need to look in the sub picture + * to see if it has the forced flag enabled. + */ + for (i=0; i < hb_list_count(title->list_subtitle); i++) { + subtitle = hb_list_item( title->list_subtitle, i); + if (id == subtitle->id) { + /* + * A hit, count it. + */ + subtitle->hits++; + if( job->subtitle_force ) + { + return subtitle->fifo_in; + } + break; + } + } + } else { + if( ( subtitle = hb_list_item( title->list_subtitle, 0 ) ) && + id == subtitle->id ) + { + return subtitle->fifo_in; + } } - - for( i = 0; i < hb_list_count( title->list_audio ); i++ ) + if( !job->indepth_scan ) { - audio = hb_list_item( title->list_audio, i ); - if( id == audio->id ) + for( i = 0; i < hb_list_count( title->list_audio ); i++ ) { - return audio->fifo_in; + audio = hb_list_item( title->list_audio, i ); + if( id == audio->id ) + { + return audio->fifo_in; + } } }