+ if ( r->title->type == HB_BD_TYPE )
+ {
+ if ( !( r->bd = hb_bd_init( r->title->path ) ) )
+ return;
+ }
+ else if ( r->title->type == HB_DVD_TYPE )
+ {
+ if ( !( r->dvd = hb_dvd_init( r->title->path ) ) )
+ return;
+ }
+ else if ( r->title->type == HB_STREAM_TYPE )
+ {
+ if ( !( r->stream = hb_stream_open( r->title->path, r->title ) ) )
+ return;
+ }
+ else
+ {
+ // Unknown type, should never happen
+ return;
+ }
+
+ hb_buffer_t *ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
+ if (r->bd)
+ {
+ if( !hb_bd_start( r->bd, r->title ) )
+ {
+ hb_bd_close( &r->bd );
+ hb_buffer_close( &ps );
+ return;
+ }
+ if ( r->job->start_at_preview )
+ {
+ // XXX code from DecodePreviews - should go into its own routine
+ hb_bd_seek( r->bd, (float)r->job->start_at_preview /
+ ( r->job->seek_points ? ( r->job->seek_points + 1.0 ) : 11.0 ) );
+ }
+ else if ( r->job->pts_to_start )
+ {
+ hb_bd_seek_pts( r->bd, r->job->pts_to_start );
+ }
+ else
+ {
+ hb_bd_seek_chapter( r->bd, r->job->chapter_start );
+ }
+ if (r->job->angle > 1)
+ {
+ hb_bd_set_angle( r->bd, r->job->angle - 1 );
+ }
+ }
+ else if (r->dvd)