Mercurial > libdvdnav.hg
comparison searching.c @ 132:f22458f928b8 src
PGC based positioning
author | mroi |
---|---|
date | Sun, 23 Mar 2003 15:24:31 +0000 |
parents | ada79e606d8d |
children | d09a81cf65ce |
comparison
equal
deleted
inserted
replaced
131:ada79e606d8d | 132:f22458f928b8 |
---|---|
166 printerr("Illegal seek mode."); | 166 printerr("Illegal seek mode."); |
167 pthread_mutex_unlock(&this->vm_lock); | 167 pthread_mutex_unlock(&this->vm_lock); |
168 return S_ERR; | 168 return S_ERR; |
169 } | 169 } |
170 | 170 |
171 /* First find closest cell number in program */ | 171 if (this->pgc_based) { |
172 first_cell_nr = state->pgc->program_map[state->pgN-1]; | 172 first_cell_nr = 1; |
173 if(state->pgN < state->pgc->nr_of_programs) { | 173 last_cell_nr = state->pgc->nr_of_cells; |
174 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
175 } else { | 174 } else { |
176 last_cell_nr = state->pgc->nr_of_cells; | 175 /* Find start cell of program. */ |
177 } | 176 first_cell_nr = state->pgc->program_map[state->pgN-1]; |
178 | 177 /* Find end cell of program */ |
178 if(state->pgN < state->pgc->nr_of_programs) | |
179 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
180 else | |
181 last_cell_nr = state->pgc->nr_of_cells; | |
182 } | |
183 | |
179 found = 0; | 184 found = 0; |
180 for(cell_nr = first_cell_nr; (cell_nr <= last_cell_nr) && !found; cell_nr ++) { | 185 for(cell_nr = first_cell_nr; (cell_nr <= last_cell_nr) && !found; cell_nr ++) { |
181 cell = &(state->pgc->cell_playback[cell_nr-1]); | 186 cell = &(state->pgc->cell_playback[cell_nr-1]); |
182 length = cell->last_sector - cell->first_sector + 1; | 187 length = cell->last_sector - cell->first_sector + 1; |
183 if (target >= length) { | 188 if (target >= length) { |
380 uint32_t cur_sector; | 385 uint32_t cur_sector; |
381 uint32_t cell_nr; | 386 uint32_t cell_nr; |
382 uint32_t first_cell_nr; | 387 uint32_t first_cell_nr; |
383 uint32_t last_cell_nr; | 388 uint32_t last_cell_nr; |
384 cell_playback_t *cell; | 389 cell_playback_t *cell; |
385 cell_playback_t *first_cell; | |
386 cell_playback_t *last_cell; | |
387 dvd_state_t *state; | 390 dvd_state_t *state; |
388 | 391 |
389 if(!this || !pos || !len) { | 392 if(!this || !pos || !len) { |
390 printerr("Passed a NULL pointer."); | 393 printerr("Passed a NULL pointer."); |
391 return S_ERR; | 394 return S_ERR; |
404 } | 407 } |
405 | 408 |
406 /* Get current sector */ | 409 /* Get current sector */ |
407 cur_sector = this->vobu.vobu_start + this->vobu.blockN; | 410 cur_sector = this->vobu.vobu_start + this->vobu.blockN; |
408 | 411 |
409 /* Find start cell of program. */ | 412 if (this->pgc_based) { |
410 first_cell_nr = state->pgc->program_map[state->pgN-1]; | 413 first_cell_nr = 1; |
411 first_cell = &(state->pgc->cell_playback[first_cell_nr-1]); | 414 last_cell_nr = state->pgc->nr_of_cells; |
412 | |
413 /* Find end cell of program */ | |
414 if(state->pgN < state->pgc->nr_of_programs) { | |
415 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
416 } else { | 415 } else { |
417 last_cell_nr = state->pgc->nr_of_cells; | 416 /* Find start cell of program. */ |
418 } | 417 first_cell_nr = state->pgc->program_map[state->pgN-1]; |
419 last_cell = &(state->pgc->cell_playback[last_cell_nr-1]); | 418 /* Find end cell of program */ |
420 | 419 if(state->pgN < state->pgc->nr_of_programs) |
420 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
421 else | |
422 last_cell_nr = state->pgc->nr_of_cells; | |
423 } | |
424 | |
421 *pos = -1; | 425 *pos = -1; |
422 *len = 0; | 426 *len = 0; |
423 for (cell_nr = first_cell_nr; cell_nr <= last_cell_nr; cell_nr++) { | 427 for (cell_nr = first_cell_nr; cell_nr <= last_cell_nr; cell_nr++) { |
424 cell = &(state->pgc->cell_playback[cell_nr-1]); | 428 cell = &(state->pgc->cell_playback[cell_nr-1]); |
425 if (cell_nr == state->cellN) { | 429 if (cell_nr == state->cellN) { |