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. */
23 /***********************************************************************
25 **********************************************************************/
26 static void ReaderFunc( void * );
27 static hb_fifo_t
* GetFifoForId( hb_job_t
* job
, int id
);
29 /***********************************************************************
31 ***********************************************************************
33 **********************************************************************/
34 hb_thread_t
* hb_reader_init( hb_job_t
* job
)
38 r
= calloc( sizeof( hb_reader_t
), 1 );
41 r
->title
= job
->title
;
45 return hb_thread_init( "reader", ReaderFunc
, r
,
49 /***********************************************************************
51 ***********************************************************************
53 **********************************************************************/
54 static void ReaderFunc( void * _r
)
61 int chapter_end
= r
->job
->chapter_end
;
63 if( !( r
->dvd
= hb_dvd_init( r
->title
->dvd
) ) )
65 if ( !(r
->stream
= hb_stream_open(r
->title
->dvd
) ) )
74 * XXX this code is a temporary hack that should go away if/when
75 * chapter merging goes away in libhb/dvd.c
76 * map the start and end chapter numbers to on-media chapter
77 * numbers since chapter merging could cause the handbrake numbers
78 * to diverge from the media numbers and, if our chapter_end is after
79 * a media chapter that got merged, we'll stop ripping too early.
81 int start
= r
->job
->chapter_start
;
82 hb_chapter_t
* chap
= hb_list_item( r
->title
->list_chapter
, chapter_end
- 1 );
84 chapter_end
= chap
->index
;
87 chap
= hb_list_item( r
->title
->list_chapter
, start
- 1 );
90 /* end chapter mapping XXX */
92 if( !hb_dvd_start( r
->dvd
, r
->title
->index
, start
) )
94 hb_dvd_close( &r
->dvd
);
99 list
= hb_list_init();
100 r
->ps
= hb_buffer_init( HB_DVD_READ_BUFFER_SIZE
);
102 while( !*r
->die
&& !r
->job
->done
)
105 chapter
= hb_dvd_chapter( r
->dvd
);
111 hb_log( "reader: end of the title reached" );
114 if( chapter
> chapter_end
)
116 hb_log( "reader: end of chapter %d (media %d) reached at media chapter %d",
117 r
->job
->chapter_end
, chapter_end
, chapter
);
123 if( !hb_dvd_read( r
->dvd
, r
->ps
) )
130 if ( !hb_stream_read( r
->stream
, r
->ps
) )
136 if( r
->job
->indepth_scan
)
139 * Need to update the progress during a subtitle scan
143 #define p state.param.working
145 state
.state
= HB_STATE_WORKING
;
146 p
.progress
= (float)chapter
/ (float)r
->job
->chapter_end
;
147 if( p
.progress
> 1.0 )
155 hb_set_state( r
->job
->h
, &state
);
158 hb_demux_ps( r
->ps
, list
);
160 while( ( buf
= hb_list_item( list
, 0 ) ) )
162 hb_list_rem( list
, buf
);
163 fifo
= GetFifoForId( r
->job
, buf
->id
);
166 while( !*r
->die
&& !r
->job
->done
&&
167 hb_fifo_is_full( fifo
) )
171 buf
->sequence
= r
->sequence
++;
172 hb_fifo_push( fifo
, buf
);
176 hb_buffer_close( &buf
);
181 hb_list_empty( &list
);
182 hb_buffer_close( &r
->ps
);
185 hb_dvd_stop( r
->dvd
);
186 hb_dvd_close( &r
->dvd
);
190 hb_stream_close(&r
->stream
);
196 hb_log( "reader: done" );
199 /***********************************************************************
201 ***********************************************************************
203 **********************************************************************/
204 static hb_fifo_t
* GetFifoForId( hb_job_t
* job
, int id
)
206 hb_title_t
* title
= job
->title
;
208 hb_subtitle_t
* subtitle
;
213 if( job
->indepth_scan
)
216 * Ditch the video here during the indepth scan until
217 * we can improve the MPEG2 decode performance.
223 return job
->fifo_mpeg2
;
227 if( job
->indepth_scan
) {
229 * Count the occurances of the subtitles, don't actually
230 * return any to encode unless we are looking fro forced
231 * subtitles in which case we need to look in the sub picture
232 * to see if it has the forced flag enabled.
234 for (i
=0; i
< hb_list_count(title
->list_subtitle
); i
++) {
235 subtitle
= hb_list_item( title
->list_subtitle
, i
);
236 if (id
== subtitle
->id
) {
241 if( job
->subtitle_force
)
243 return subtitle
->fifo_in
;
249 if( ( subtitle
= hb_list_item( title
->list_subtitle
, 0 ) ) &&
252 return subtitle
->fifo_in
;
255 if( !job
->indepth_scan
)
257 for( i
= 0; i
< hb_list_count( title
->list_audio
); i
++ )
259 audio
= hb_list_item( title
->list_audio
, i
);
260 if( id
== audio
->id
)
262 return audio
->fifo_in
;