- /*
- * 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;
- }
+
+ // XXX code from DecodePreviews - should go into its own routine
+ hb_stream_seek( r->stream, (float)( r->job->start_at_preview - 1 ) /
+ ( r->job->seek_points ? ( r->job->seek_points + 1.0 ) : 11.0 ) );
+
+ }
+ else if ( r->stream && r->job->pts_to_start )
+ {
+ int64_t pts_to_start = r->job->pts_to_start;
+
+ // Find out what the first timestamp of the stream is
+ // and then seek to the appropriate offset from it
+ if ( hb_stream_read( r->stream, ps ) )
+ {
+ if ( ps->start > 0 )
+ pts_to_start += ps->start;
+ }
+
+ if ( hb_stream_seek_ts( r->stream, pts_to_start ) >= 0 )
+ {
+ // Seek takes us to the nearest I-frame before the timestamp
+ // that we want. So we will retrieve the start time of the
+ // first packet we get, subtract that from pts_to_start, and
+ // inspect the reset of the frames in sync.
+ r->start_found = 2;
+ r->job->pts_to_start = pts_to_start;
+ }
+ }
+ else if( r->stream )
+ {
+ /*
+ * Standard stream, seek to the starting chapter, if set, and track the
+ * end chapter so that we end at the right time.
+ */
+ 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;
+ }
+
+ /*
+ * Seek to the start chapter.
+ */
+ hb_stream_seek_chapter( r->stream, start );