1 /* $Id: reader.c,v 1.21 2005/11/25 15:05:25 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.m0k.org/>.
5 It may be used under the terms of the GNU General Public License. */
20 /***********************************************************************
22 **********************************************************************/
23 static void ReaderFunc( void * );
24 static hb_fifo_t * GetFifoForId( hb_job_t * job, int id );
26 /***********************************************************************
28 ***********************************************************************
30 **********************************************************************/
31 hb_thread_t * hb_reader_init( hb_job_t * job )
35 r = calloc( sizeof( hb_reader_t ), 1 );
38 r->title = job->title;
41 return hb_thread_init( "reader", ReaderFunc, r,
45 /***********************************************************************
47 ***********************************************************************
49 **********************************************************************/
50 static void ReaderFunc( void * _r )
58 if( !( r->dvd = hb_dvd_init( r->title->dvd ) ) )
63 if( !hb_dvd_start( r->dvd, r->title->index, r->job->chapter_start ) )
65 hb_dvd_close( &r->dvd );
69 list = hb_list_init();
70 r->ps = hb_buffer_init( 2048 );
72 while( !*r->die && !r->job->done )
74 chapter = hb_dvd_chapter( r->dvd );
77 hb_log( "reader: end of the title reached" );
80 if( chapter > r->job->chapter_end )
82 hb_log( "reader: end of chapter %d reached (%d)",
83 r->job->chapter_end, chapter );
87 if( !hb_dvd_read( r->dvd, r->ps ) )
92 hb_demux_ps( r->ps, list );
94 while( ( buf = hb_list_item( list, 0 ) ) )
96 hb_list_rem( list, buf );
97 fifo = GetFifoForId( r->job, buf->id );
100 while( !*r->die && !r->job->done &&
101 hb_fifo_is_full( fifo ) )
105 hb_fifo_push( fifo, buf );
109 hb_buffer_close( &buf );
114 hb_list_empty( &list );
115 hb_buffer_close( &r->ps );
116 hb_dvd_stop( r->dvd );
117 hb_dvd_close( &r->dvd );
121 hb_log( "reader: done" );
124 /***********************************************************************
126 ***********************************************************************
128 **********************************************************************/
129 static hb_fifo_t * GetFifoForId( hb_job_t * job, int id )
131 hb_title_t * title = job->title;
133 hb_subtitle_t * subtitle;
138 return job->fifo_mpeg2;
141 if( ( subtitle = hb_list_item( title->list_subtitle, 0 ) ) &&
144 return subtitle->fifo_in;
147 for( i = 0; i < hb_list_count( title->list_audio ); i++ )
149 audio = hb_list_item( title->list_audio, i );
150 if( id == audio->id )
152 return audio->fifo_in;