From eafb0fa7739d0863eb6a6d181c0b69a71ddf2ba1 Mon Sep 17 00:00:00 2001 From: jstebbins Date: Sat, 6 Feb 2010 18:03:22 +0000 Subject: [PATCH] dvdnav: fix seeking on some dvds that use multiple pgc's in a title The code that was in place to handle this did not allow for the possibility that there could be sector gaps between the segments git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3098 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- libhb/dvdnav.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libhb/dvdnav.c b/libhb/dvdnav.c index 59e1ac67e..8d7ac70e7 100644 --- a/libhb/dvdnav.c +++ b/libhb/dvdnav.c @@ -883,18 +883,22 @@ static int hb_dvdnav_seek( hb_dvd_t * e, float f ) // XXX the current version of libdvdnav can't seek outside the current // PGC. Check if the place we're seeking to is in a different // PGC. Position there & adjust the offset if so. + uint64_t pgc_offset = 0; + uint64_t chap_offset = 0; hb_chapter_t *pgc_change = hb_list_item(d->list_chapter, 0 ); for ( ii = 0; ii < hb_list_count( d->list_chapter ); ++ii ) { hb_chapter_t *chapter = hb_list_item( d->list_chapter, ii ); + uint64_t chap_len = chapter->block_end - chapter->block_start + 1; if ( chapter->pgcn != pgc_change->pgcn ) { // this chapter's in a different pgc from the previous - note the // change so we can make sector offset's be pgc relative. + pgc_offset = chap_offset; pgc_change = chapter; } - if ( chapter->block_start <= sector && sector <= chapter->block_end ) + if ( chap_offset <= sector && sector < chap_offset + chap_len ) { // this chapter contains the sector we want - see if it's in a // different pgc than the one we're currently in. @@ -908,9 +912,10 @@ static int hb_dvdnav_seek( hb_dvd_t * e, float f ) hb_log("dvdnav prog play err: %s", dvdnav_err_to_string(d->dvdnav)); } // seek sectors are pgc-relative so remove the pgc start sector. - sector -= pgc_change->block_start; + sector -= pgc_offset; break; } + chap_offset += chap_len; } // dvdnav will not let you seek or poll current position -- 2.40.0