# HG changeset patch # User mroi # Date 1048433071 0 # Node ID f22458f928b81aef99d68659977beeeec5f8c740 # Parent ada79e606d8d5c215e862636aab3e424d12010c1 PGC based positioning diff -r ada79e606d8d -r f22458f928b8 dvdnav.h --- a/dvdnav.h Fri Mar 21 18:06:44 2003 +0000 +++ b/dvdnav.h Sun Mar 23 15:24:31 2003 +0000 @@ -171,6 +171,28 @@ dvdnav_status_t dvdnav_get_readahead_flag(dvdnav_t *self, int* flag); /** + * Specify whether the positioning works PGC or PG based. + * Programs (PGs) on DVDs are similar to Chapters and the program chain (PGC) + * usually covers a whole feature. This affects the behaviour of the + * functions dvdnav_get_position() and dvdnav_sector_search(). + * Default is PG based positioning. + * + * \param self Pointer to dvdnav_t associated with this operation. + * \param pgc 0 - PG based, 1 - PGC based + */ +dvdnav_status_t dvdnav_set_PGC_positioning_flag(dvdnav_t *self, int pgc); + +/** + * Query whether positioning is PG or PGC based. + * + * \param self Pointer to dvdnav_t associated with this operation. + * \param flag Pointer to int to recieve flag value. + * + * \sa dvdnav_set_PGC_positioning_flag() + */ +dvdnav_status_t dvdnav_get_PGC_positioning_flag(dvdnav_t *self, int *flag); + +/** * @} */ diff -r ada79e606d8d -r f22458f928b8 dvdnav_internal.h.in --- a/dvdnav_internal.h.in Fri Mar 21 18:06:44 2003 +0000 +++ b/dvdnav_internal.h.in Sun Mar 23 15:24:31 2003 +0000 @@ -146,6 +146,7 @@ int spu_clut_changed; /* The SPU CLUT changed */ int started; /* vm_start has been called? */ int use_read_ahead; /* 1 - use read-ahead cache, 0 - don't */ + int pgc_based; /* positioning works PGC based instead of PG based */ /* VM */ vm_t *vm; diff -r ada79e606d8d -r f22458f928b8 searching.c --- a/searching.c Fri Mar 21 18:06:44 2003 +0000 +++ b/searching.c Sun Mar 23 15:24:31 2003 +0000 @@ -168,14 +168,19 @@ return S_ERR; } - /* First find closest cell number in program */ - first_cell_nr = state->pgc->program_map[state->pgN-1]; - if(state->pgN < state->pgc->nr_of_programs) { - last_cell_nr = state->pgc->program_map[state->pgN] - 1; + if (this->pgc_based) { + first_cell_nr = 1; + last_cell_nr = state->pgc->nr_of_cells; } else { - last_cell_nr = state->pgc->nr_of_cells; + /* Find start cell of program. */ + first_cell_nr = state->pgc->program_map[state->pgN-1]; + /* Find end cell of program */ + if(state->pgN < state->pgc->nr_of_programs) + last_cell_nr = state->pgc->program_map[state->pgN] - 1; + else + last_cell_nr = state->pgc->nr_of_cells; } - + found = 0; for(cell_nr = first_cell_nr; (cell_nr <= last_cell_nr) && !found; cell_nr ++) { cell = &(state->pgc->cell_playback[cell_nr-1]); @@ -382,8 +387,6 @@ 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; if(!this || !pos || !len) { @@ -406,18 +409,19 @@ /* Get current sector */ cur_sector = this->vobu.vobu_start + this->vobu.blockN; - /* Find start cell of program. */ - first_cell_nr = state->pgc->program_map[state->pgN-1]; - first_cell = &(state->pgc->cell_playback[first_cell_nr-1]); - - /* Find end cell of program */ - if(state->pgN < state->pgc->nr_of_programs) { - last_cell_nr = state->pgc->program_map[state->pgN] - 1; + if (this->pgc_based) { + first_cell_nr = 1; + last_cell_nr = state->pgc->nr_of_cells; } else { - last_cell_nr = state->pgc->nr_of_cells; + /* Find start cell of program. */ + first_cell_nr = state->pgc->program_map[state->pgN-1]; + /* Find end cell of program */ + if(state->pgN < state->pgc->nr_of_programs) + last_cell_nr = state->pgc->program_map[state->pgN] - 1; + else + 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++) { diff -r ada79e606d8d -r f22458f928b8 settings.c --- a/settings.c Fri Mar 21 18:06:44 2003 +0000 +++ b/settings.c Sun Mar 23 15:24:31 2003 +0000 @@ -101,3 +101,23 @@ dvdnav_status_t dvdnav_spu_language_select(dvdnav_t *this, char *code) { return set_language_register(this, code, 18); } + +dvdnav_status_t dvdnav_set_PGC_positioning_flag(dvdnav_t *this, int pgc) { + if(!this) { + printerr("Passed a NULL this pointer."); + return S_ERR; + } + + this->pgc_based = pgc; + return S_OK; +} + +dvdnav_status_t dvdnav_get_PGC_positioning_flag(dvdnav_t *this, int *flag) { + if(!this || !flag) { + printerr("Passed a NULL this pointer."); + return S_ERR; + } + + (*flag) = this->pgc_based; + return S_OK; +}