summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
authortiter <[email protected]>2006-01-15 13:51:39 +0000
committertiter <[email protected]>2006-01-15 13:51:39 +0000
commit858555894dacb9cece778b4d49f693db0a29d473 (patch)
treed1144492c5c8249e02fc06b96060b6875b424c81 /libhb
parentf0746b160593e1237101cbef5e959d0dc04aaf70 (diff)
Fixed dvd_seek for titles which are not linear
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@20 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r--libhb/dvd.c32
-rw-r--r--libhb/scan.c5
2 files changed, 24 insertions, 13 deletions
diff --git a/libhb/dvd.c b/libhb/dvd.c
index 3888f41db..54b5e5e92 100644
--- a/libhb/dvd.c
+++ b/libhb/dvd.c
@@ -536,26 +536,34 @@ void hb_dvd_stop( hb_dvd_t * d )
**********************************************************************/
int hb_dvd_seek( hb_dvd_t * d, float f )
{
- int target;
+ int count, sizeCell;
+ int i;
- target = d->title_start + (int) ( f * d->title_block_count );
+ count = f * d->title_block_count;
- /* Find the cell we shall start in */
- d->cell_cur = d->cell_start;
- FindNextCell( d );
- for( ;; )
+ for( i = d->cell_start; i <= d->cell_end; i++ )
{
- if( target < d->pgc->cell_playback[d->cell_cur].last_sector )
+ sizeCell = d->pgc->cell_playback[i].last_sector + 1 -
+ d->pgc->cell_playback[i].first_sector;
+
+ if( count < sizeCell )
{
+ d->cell_cur = i;
+ FindNextCell( d );
+
+ /* Now let hb_dvd_read find the next VOBU */
+ d->next_vobu = d->pgc->cell_playback[i].first_sector + count;
+ d->pack_len = 0;
break;
}
- d->cell_cur = d->cell_next;
- FindNextCell( d );
+
+ count -= sizeCell;
}
- /* Now let hb_dvd_read find the next VOBU */
- d->next_vobu = target;
- d->pack_len = 0;
+ if( i > d->cell_end )
+ {
+ return 0;
+ }
return 1;
}
diff --git a/libhb/scan.c b/libhb/scan.c
index f60392cea..c2814f362 100644
--- a/libhb/scan.c
+++ b/libhb/scan.c
@@ -239,7 +239,10 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
FILE * file_preview;
char filename[1024];
- hb_dvd_seek( data->dvd, (float) ( i + 1 ) / 11.0 );
+ if( !hb_dvd_seek( data->dvd, (float) ( i + 1 ) / 11.0 ) )
+ {
+ goto error;
+ }
hb_log( "scan: preview %d", i + 1 );