+ if( d->in_sync == 0 )
+ {
+ hb_log( "dvd: In sync with DVD at block %d", d->block );
+ }
+ d->in_sync = 1;
+ }
+
+ // Revert the cell overlap, and check for a chapter break
+ // If this cell is zero length (prev_vobu & next_vobu both
+ // set to END_OF_CELL) we need to check for beginning of
+ // cell before checking for end or we'll advance to the next
+ // cell too early and fail to generate a chapter mark when this
+ // cell starts a chapter.
+ if( ( dsi_pack.vobu_sri.prev_vobu & (1 << 31 ) ) == 0 ||
+ ( dsi_pack.vobu_sri.prev_vobu & 0x3fffffff ) == 0x3fffffff )
+ {
+ // A vobu that's not at the start of a cell can have an
+ // EOC prev pointer (this seems to be associated with some
+ // sort of drm). The rest of the content in the cell may be
+ // booby-trapped so treat this like an end-of-cell rather
+ // than a beginning of cell.
+ if ( d->pgc->cell_playback[d->cell_cur].first_sector < dsi_pack.dsi_gi.nv_pck_lbn &&
+ d->pgc->cell_playback[d->cell_cur].last_sector >= dsi_pack.dsi_gi.nv_pck_lbn )
+ {
+ hb_log( "dvd: null prev_vobu in cell %d at block %d", d->cell_cur,
+ d->block );
+ // treat like end-of-cell then go directly to start of next cell.
+ d->cell_cur = d->cell_next;
+ d->in_cell = 0;
+ d->next_vobu = d->pgc->cell_playback[d->cell_cur].first_sector;
+ FindNextCell( d );
+ d->cell_overlap = 1;
+ goto top;
+ }
+ else
+ {
+ if ( d->block != d->pgc->cell_playback[d->cell_cur].first_sector )
+ {
+ hb_log( "dvd: beginning of cell %d at block %d", d->cell_cur,
+ d->block );
+ }
+ if( d->in_cell )
+ {
+ hb_error( "dvd: assuming missed end of cell %d", d->cell_cur );
+ d->cell_cur = d->cell_next;
+ d->next_vobu = d->pgc->cell_playback[d->cell_cur].first_sector;
+ FindNextCell( d );
+ d->cell_overlap = 1;
+ d->in_cell = 0;
+ } else {
+ d->in_cell = 1;
+ }
+ d->cur_vob_id = dsi_pack.dsi_gi.vobu_vob_idn;
+ d->cur_cell_id = dsi_pack.dsi_gi.vobu_c_idn;
+
+ if( d->cell_overlap )
+ {
+ b->new_chap = hb_dvdread_is_break( d );
+ d->cell_overlap = 0;
+ }
+ }
+ }
+
+ if( ( dsi_pack.vobu_sri.next_vobu & (1 << 31 ) ) == 0 ||
+ ( dsi_pack.vobu_sri.next_vobu & 0x3fffffff ) == 0x3fffffff )
+ {
+ if ( d->block <= d->pgc->cell_playback[d->cell_cur].first_sector ||
+ d->block > d->pgc->cell_playback[d->cell_cur].last_sector )
+ {
+ hb_log( "dvd: end of cell %d at block %d", d->cell_cur,
+ d->block );
+ }