# HG changeset patch # User mroi # Date 1048162979 0 # Node ID f47065513ad8a6737e0ab021273eb0b2dd6ff292 # Parent b48f53f7cff28e158a2a97ed2495e88454a98f88 do not assume PGs to be physically layed out in sequence on the disc diff -r b48f53f7cff2 -r f47065513ad8 searching.c --- a/searching.c Mon Mar 17 15:15:38 2003 +0000 +++ b/searching.c Thu Mar 20 12:22:59 2003 +0000 @@ -177,14 +177,16 @@ } found = 0; - target += state->pgc->cell_playback[first_cell_nr-1].first_sector; for(cell_nr = first_cell_nr; (cell_nr <= last_cell_nr) && !found; cell_nr ++) { cell = &(state->pgc->cell_playback[cell_nr-1]); - if((cell->first_sector <= target) && (cell->last_sector >= target)) { + length = cell->last_sector - cell->first_sector + 1; + if (target >= length) { + target -= length; + } else { + /* convert the target sector from PG-relative to absolute physical sector */ + target += cell->first_sector; found = 1; - state->cellN = cell_nr; - state->blockN = 0; - state->cell_restart++; + break; } } @@ -192,10 +194,14 @@ int32_t vobu, start; #ifdef LOG_DEBUG fprintf(MSG_OUT, "libdvdnav: Seeking to cell %i from choice of %i to %i\n", - state->cellN, first_cell_nr, last_cell_nr); + cell_nr, first_cell_nr, last_cell_nr); #endif dvdnav_scan_admap(this, state->domain, target, &vobu); - start = state->pgc->cell_playback[state->cellN - 1].first_sector; + + start = state->pgc->cell_playback[cell_nr-1].first_sector; + state->blockN = vobu - start; + state->cellN = cell_nr; + state->cell_restart++; #ifdef LOG_DEBUG fprintf(MSG_OUT, "libdvdnav: After cellN=%u blockN=%u target=%x vobu=%x start=%x\n" , state->cellN, @@ -204,13 +210,6 @@ vobu, start); #endif - state->blockN = vobu - start; -#ifdef LOG_DEBUG - fprintf(MSG_OUT, "libdvdnav: After vobu=%x start=%x blockN=%x\n" , - vobu, - start, - state->blockN); -#endif this->vm->hop_channel += HOP_SEEK; pthread_mutex_unlock(&this->vm_lock); return S_OK; @@ -379,8 +378,10 @@ dvdnav_status_t dvdnav_get_position(dvdnav_t *this, unsigned int *pos, unsigned int *len) { uint32_t cur_sector; + uint32_t cell_nr; uint32_t first_cell_nr; uint32_t last_cell_nr; + cell_playback_t *cell; cell_playback_t *first_cell; cell_playback_t *last_cell; dvd_state_t *state; @@ -416,9 +417,21 @@ last_cell_nr = state->pgc->nr_of_cells; } last_cell = &(state->pgc->cell_playback[last_cell_nr-1]); + + *pos = -1; + *len = 0; + for (cell_nr = first_cell_nr; cell_nr <= last_cell_nr; cell_nr++) { + cell = &(state->pgc->cell_playback[cell_nr-1]); + if (cell_nr == state->cellN) { + /* the current sector is in this cell, + * pos is length of PG up to here + sector's offset in this cell */ + *pos = *len + cur_sector - cell->first_sector; + } + *len += cell->last_sector - cell->first_sector + 1; + } + + assert(*pos != -1); - *pos= cur_sector - first_cell->first_sector; - *len= last_cell->last_sector - first_cell->first_sector; pthread_mutex_unlock(&this->vm_lock); return S_OK;