#include "dvdnav/dvdnav.h"
#include "dvdread/ifo_read.h"
+#include "dvdread/ifo_print.h"
#include "dvdread/nav_read.h"
#define DVD_READ_CACHE 1
hb_error( "scan: pgc not valid, skipping" );
break;
}
+ if (pgn > pgc->nr_of_programs)
+ {
+ pgn = 1;
+ continue;
+ }
+
duration += 90LL * dvdtime2msec( &pgc->playback_time );
cell_start = pgc->program_map[pgn-1] - 1;
pgc = ifo->vts_pgcit->pgci_srp[pgcn-1].pgc;
- hb_log("pgc_id: %d, pgn: %d: pgc: 0x%x", pgcn, pgn, pgc);
+ hb_log("pgc_id: %d, pgn: %d: pgc: %p", pgcn, pgn, pgc);
+ if (pgn > pgc->nr_of_programs)
+ {
+ hb_error( "invalid PGN %d for title %d, skipping", pgn, t );
+ goto fail;
+ }
/* Title start */
title->cell_start = pgc->program_map[pgn-1] - 1;
title->hours = title->duration / 90000 / 3600;
title->minutes = ( ( title->duration / 90000 ) % 3600 ) / 60;
title->seconds = ( title->duration / 90000 ) % 60;
- hb_log( "scan: duration is %02d:%02d:%02d (%lld ms)",
+ hb_log( "scan: duration is %02d:%02d:%02d (%"PRId64" ms)",
title->hours, title->minutes, title->seconds,
title->duration / 90 );
lang->iso639_2);
subtitle->format = PICTURESUB;
subtitle->source = VOBSUB;
- subtitle->dest = RENDERSUB; // By default render (burn-in) the VOBSUB.
+ subtitle->config.dest = RENDERSUB; // By default render (burn-in) the VOBSUB.
subtitle->type = lang_extension;
chapter->minutes = ( seconds % 3600 ) / 60;
chapter->seconds = seconds % 60;
- hb_log( "scan: chap %d c=%d->%d, b=%d->%d (%d), %lld ms",
+ hb_log( "scan: chap %d c=%d->%d, b=%d->%d (%d), %"PRId64" ms",
chapter->index, chapter->cell_start, chapter->cell_end,
chapter->block_start, chapter->block_end,
chapter->block_count, chapter->duration / 90 );
}
d->title = t;
d->stopped = 0;
+ d->chapter = 0;
return 1;
}
if ( result == DVDNAV_STATUS_ERR )
{
hb_log("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
- return 0;
+ return 0;
}
switch ( event )
{
return 0;
}
c = FindChapterIndex(d->list_chapter, pgcn, pgn);
- if (c > d->chapter)
+ if (c != d->chapter)
+ {
+ if (c < d->chapter)
+ {
+ // Some titles end with a 'link' back to the beginning so
+ // a transition to an earlier chapter means we're done.
+ return 0;
+ }
chapter = d->chapter = c;
+ }
}
break;