Mercurial > libdvdnav.hg
annotate searching.c @ 24:870a0a1eee41 src
Re-implemented seeking.
author | jcdutton |
---|---|
date | Tue, 23 Apr 2002 02:12:58 +0000 |
parents | 3c1df0cb3aee |
children | df024077cbc1 |
rev | line source |
---|---|
0 | 1 /* |
2 * Copyright (C) 2000 Rich Wareham <richwareham@users.sourceforge.net> | |
3 * | |
4 * This file is part of libdvdnav, a DVD navigation library. | |
5 * | |
6 * libdvdnav is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * libdvdnav is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
19 * | |
20 * $Id$ | |
21 * | |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include "config.h" | |
26 #endif | |
27 | |
28 #include <dvdnav.h> | |
29 #include "dvdnav_internal.h" | |
30 | |
31 #include "vm.h" | |
32 #include <dvdread/nav_types.h> | |
33 | |
34 /* Searching API calls */ | |
35 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
36 dvdnav_status_t dvdnav_time_search(dvdnav_t *this, |
0 | 37 unsigned long int time) { |
38 /* Time search the current PGC based on the xxx table */ | |
39 return S_OK; | |
40 } | |
41 | |
24 | 42 /* Scan the ADMAP for a particular block number. */ |
43 /* Return placed in vobu. */ | |
44 /* Returns error status */ | |
45 | |
46 dvdnav_status_t dvdnav_scan_admap(dvdnav_t *this, int32_t domain, int32_t seekto_block, int32_t *vobu) { | |
47 /* FIXME:Need to handle seeking outside current cell. */ | |
48 vobu_admap_t *admap = NULL; | |
49 *vobu = -1; | |
50 fprintf(stderr,"Seeking to target %u ...\n", | |
51 seekto_block); | |
52 | |
53 /* Search through the VOBU_ADMAP for the nearest VOBU | |
54 * to the target block */ | |
55 switch(domain) { | |
56 case FP_DOMAIN: | |
57 case VMGM_DOMAIN: | |
58 admap = this->vm->vmgi->menu_vobu_admap; | |
59 break; | |
60 case VTSM_DOMAIN: | |
61 admap = this->vm->vtsi->menu_vobu_admap; | |
62 break; | |
63 case VTS_DOMAIN: | |
64 admap = this->vm->vtsi->vts_vobu_admap; | |
65 break; | |
66 default: | |
67 fprintf(stderr,"Error: Unknown domain for seeking seek.\n"); | |
68 } | |
69 if(admap) { | |
70 int32_t address = 0; | |
71 int32_t vobu_start, next_vobu; | |
72 int found = 0; | |
73 | |
74 /* Search through ADMAP for best sector */ | |
75 vobu_start = 0x3fffffff; | |
76 /* FIXME: Implement a faster search algorithm */ | |
77 while((!found) && ((address<<2) < admap->last_byte)) { | |
78 next_vobu = admap->vobu_start_sectors[address]; | |
79 | |
80 /* printf("Found block %u\n", next_vobu); */ | |
81 | |
82 if(vobu_start <= seekto_block && | |
83 next_vobu > seekto_block) { | |
84 found = 1; | |
85 } else { | |
86 vobu_start = next_vobu; | |
87 } | |
88 | |
89 address ++; | |
90 } | |
91 if(found) { | |
92 *vobu = vobu_start; | |
93 return S_OK; | |
94 } else { | |
95 fprintf(stderr,"Could not locate block\n"); | |
96 return S_ERR; | |
97 } | |
98 } | |
99 fprintf(stderr,"admap not located\n"); | |
100 return S_ERR; | |
101 } | |
102 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
103 dvdnav_status_t dvdnav_sector_search(dvdnav_t *this, |
0 | 104 unsigned long int offset, int origin) { |
105 /* FIXME: Implement */ | |
106 | |
107 uint32_t target = 0; | |
108 uint32_t length = 0; | |
109 uint32_t first_cell_nr, last_cell_nr, cell_nr, fnd_cell_nr; | |
110 int found; | |
111 cell_playback_t *cell, *fnd_cell; | |
112 dvd_state_t *state; | |
113 dvdnav_status_t result; | |
114 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
115 if((!this) || (!this->vm) ) |
0 | 116 return -1; |
117 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
118 state = &(this->vm->state); |
0 | 119 if((!state) || (!state->pgc) ) |
120 return -1; | |
121 | |
122 if(offset == 0) | |
123 return -1; | |
124 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
125 if(this->position_current.still != 0) |
0 | 126 /* Cannot do seeking in a still frame. */ |
127 return -1; | |
128 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
129 pthread_mutex_lock(&this->vm_lock); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
130 result = dvdnav_get_position(this, &target, &length); |
0 | 131 fprintf(stderr,"FIXME: seeking to offset=%lu pos=%u length=%u\n", offset, target, length); |
132 fprintf(stderr,"FIXME: Before cellN=%u blockN=%u\n" , | |
133 state->cellN, | |
134 state->blockN); | |
135 if(!result) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
136 pthread_mutex_unlock(&this->vm_lock); |
0 | 137 return -1; |
138 } | |
139 | |
140 switch(origin) { | |
141 case SEEK_SET: | |
142 if(offset > length) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
143 pthread_mutex_unlock(&this->vm_lock); |
0 | 144 return -1; |
145 } | |
146 target = offset; | |
147 break; | |
148 case SEEK_CUR: | |
149 if(target + offset > length) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
150 pthread_mutex_unlock(&this->vm_lock); |
0 | 151 return -1; |
152 } | |
153 target += offset; | |
154 break; | |
155 case SEEK_END: | |
156 if(length - offset < 0) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
157 pthread_mutex_unlock(&this->vm_lock); |
0 | 158 return -1; |
159 } | |
160 target = length - offset; | |
161 default: | |
162 /* Error occured */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
163 pthread_mutex_unlock(&this->vm_lock); |
0 | 164 return -1; |
165 } | |
166 | |
167 /* First find closest cell number in program */ | |
168 first_cell_nr = state->pgc->program_map[state->pgN-1]; | |
169 if(state->pgN < state->pgc->nr_of_programs) { | |
170 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
171 } else { | |
172 last_cell_nr = state->pgc->nr_of_cells; | |
173 } | |
174 | |
175 found = 0; target += state->pgc->cell_playback[first_cell_nr-1].first_sector; | |
176 fnd_cell_nr = last_cell_nr + 1; | |
177 for(cell_nr = first_cell_nr; (cell_nr <= last_cell_nr) && !found; cell_nr ++) { | |
178 cell = &(state->pgc->cell_playback[cell_nr-1]); | |
179 if((cell->first_sector <= target) && (cell->last_sector >= target)) { | |
180 state->cellN = cell_nr; | |
181 state->blockN = 0; | |
182 found = 1; | |
183 fnd_cell_nr = cell_nr; | |
184 fnd_cell = cell; | |
185 } | |
186 } | |
187 | |
188 if(fnd_cell_nr <= last_cell_nr) { | |
24 | 189 int32_t vobu, start, blockN; |
190 dvdnav_status_t status; | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
191 fprintf(stderr,"Seeking to cell %i from choice of %i to %i\n", |
0 | 192 fnd_cell_nr, first_cell_nr, last_cell_nr); |
24 | 193 status = dvdnav_scan_admap(this, state->domain, target, &vobu); |
0 | 194 /* |
195 * Clut does not actually change, | |
196 * but as the decoders have been closed then opened, | |
197 * A new clut has to be sent. | |
198 */ | |
24 | 199 start =(state->pgc->cell_playback[state->cellN - 1].first_sector); |
200 fprintf(stderr,"FIXME: After cellN=%u blockN=%u target=%x vobu=%x start=%x\n" , | |
0 | 201 state->cellN, |
24 | 202 state->blockN, |
203 target, | |
204 vobu, | |
205 start); | |
206 state->blockN = vobu - start; | |
207 fprintf(stderr,"FIXME: After vobu=%x start=%x blockN=%x\n" , | |
208 vobu, | |
209 start, | |
0 | 210 state->blockN); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
211 pthread_mutex_unlock(&this->vm_lock); |
0 | 212 return target; |
213 } else { | |
214 fprintf(stderr, "Error when seeking, asked to seek outside program\n"); | |
215 } | |
216 | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
217 fprintf(stderr,"FIXME: Implement seeking to location %u\n", target); |
0 | 218 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
219 pthread_mutex_unlock(&this->vm_lock); |
0 | 220 return -1; |
221 } | |
222 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
223 dvdnav_status_t dvdnav_part_search(dvdnav_t *this, int part) { |
0 | 224 return S_OK; |
225 } | |
226 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
227 dvdnav_status_t dvdnav_prev_pg_search(dvdnav_t *this) { |
0 | 228 dvd_state_t *state; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
229 state = &(this->vm->state); |
0 | 230 /* Make sure this is not the first chapter */ |
231 | |
232 if(state->pgN <= 1 ) { | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
233 fprintf(stderr,"dvdnav: at first chapter. prev chapter failed.\n"); |
0 | 234 return S_ERR; |
235 } | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
236 fprintf(stderr,"dvdnav: previous chapter\n"); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
237 vm_jump_prog(this->vm, state->pgN - 1); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
238 dvdnav_do_post_jump(this); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
239 this->vm->hop_channel++; |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
240 fprintf(stderr,"dvdnav: previous chapter done\n"); |
0 | 241 |
242 return S_OK; | |
243 } | |
244 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
245 dvdnav_status_t dvdnav_top_pg_search(dvdnav_t *this) { |
0 | 246 |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
247 fprintf(stderr,"dvdnav: top chapter. NOP.\n"); |
0 | 248 |
249 return S_OK; | |
250 } | |
251 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
252 dvdnav_status_t dvdnav_next_pg_search(dvdnav_t *this) { |
0 | 253 dvd_state_t *state; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
254 state = &(this->vm->state); |
0 | 255 /* Make sure this is not the last chapter */ |
256 if(state->pgN >= state->pgc->nr_of_programs) { | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
257 fprintf(stderr,"dvdnav: at last chapter. next chapter failed.\n"); |
0 | 258 return S_ERR; |
259 } | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
260 fprintf(stderr,"dvdnav: next chapter\n"); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
261 vm_jump_prog(this->vm, state->pgN + 1); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
262 dvdnav_do_post_jump(this); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
263 this->vm->hop_channel++; |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
264 fprintf(stderr,"dvdnav: next chapter done\n"); |
0 | 265 |
266 return S_OK; | |
267 } | |
268 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
269 dvdnav_status_t dvdnav_menu_call(dvdnav_t *this, DVDMenuID_t menu) { |
0 | 270 dvd_state_t *state; |
271 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
272 pthread_mutex_lock(&this->vm_lock); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
273 state = &(this->vm->state); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
274 vm_menu_call(this->vm, menu, 0); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
275 dvdnav_do_post_jump(this); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
276 pthread_mutex_unlock(&this->vm_lock); |
0 | 277 return S_OK; |
278 } | |
279 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
280 dvdnav_status_t dvdnav_current_title_info(dvdnav_t *this, int *tt, int *pr) { |
0 | 281 int vts_ttn = 0; |
282 int vts, i; | |
283 domain_t domain; | |
284 tt_srpt_t* srpt; | |
285 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
286 if(!this) |
0 | 287 return S_ERR; |
288 | |
289 if(!tt || !pr) { | |
290 printerr("Passed a NULL pointer"); | |
291 } | |
292 | |
293 if(tt) | |
294 *tt = -1; | |
295 if(*pr) | |
296 *pr = -1; | |
297 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
298 domain = this->vm->state.domain; |
0 | 299 if((domain == FP_DOMAIN) || (domain == VMGM_DOMAIN)) { |
300 /* Not in a title */ | |
301 return S_OK; | |
302 } | |
303 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
304 vts_ttn = this->vm->state.VTS_TTN_REG; |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
305 vts = this->vm->state.vtsN; |
0 | 306 |
307 if(pr) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
308 *pr = this->vm->state.pgN; |
0 | 309 } |
310 | |
311 /* Search TT_SRPT for title */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
312 if(!(vm_get_vmgi(this->vm))) { |
0 | 313 printerr("Oh poo, no SRPT"); |
314 return S_ERR; | |
315 } | |
316 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
317 srpt = vm_get_vmgi(this->vm)->tt_srpt; |
0 | 318 for(i=0; i<srpt->nr_of_srpts; i++) { |
319 title_info_t* info = &(srpt->title[i]); | |
320 if((info->title_set_nr == vts) && (info->vts_ttn == vts_ttn)) { | |
321 if(tt) | |
322 *tt = i+1; | |
323 } | |
324 } | |
325 | |
326 return S_OK; | |
327 } | |
328 | |
329 static char __title_str[] = "DVDNAV"; | |
330 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
331 dvdnav_status_t dvdnav_get_title_string(dvdnav_t *this, char **title_str) { |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
332 if(!this) |
0 | 333 return S_ERR; |
334 | |
335 if(!title_str) { | |
336 printerr("Passed a NULL pointer"); | |
337 return S_ERR; | |
338 } | |
339 | |
340 (*title_str) = __title_str; | |
341 | |
342 return S_OK; | |
343 } | |
344 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
345 dvdnav_status_t dvdnav_get_position(dvdnav_t *this, unsigned int* pos, |
0 | 346 unsigned int *len) { |
347 uint32_t cur_sector; | |
348 uint32_t first_cell_nr; | |
349 uint32_t last_cell_nr; | |
350 cell_playback_t *first_cell; | |
351 cell_playback_t *last_cell; | |
352 dvd_state_t *state; | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
353 if((!this) || (!this->vm) ) |
0 | 354 return 0; |
355 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
356 state = &(this->vm->state); |
0 | 357 if((!state) || (!state->pgc) ) |
358 return 0; | |
359 | |
360 /* Sanity check */ | |
361 if(state->pgN > state->pgc->nr_of_programs) { | |
362 return 0; | |
363 } | |
364 | |
365 /* Get current sector */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
366 cur_sector = this->vobu.vobu_start + this->vobu.blockN; |
0 | 367 |
368 /* Find start cell of program. */ | |
369 first_cell_nr = state->pgc->program_map[state->pgN-1]; | |
370 first_cell = &(state->pgc->cell_playback[first_cell_nr-1]); | |
371 if(state->pgN < state->pgc->nr_of_programs) { | |
372 last_cell_nr = state->pgc->program_map[state->pgN] - 1; | |
373 } else { | |
374 last_cell_nr = state->pgc->nr_of_cells; | |
375 } | |
376 last_cell = &(state->pgc->cell_playback[last_cell_nr-1]); | |
377 | |
378 *pos= cur_sector - first_cell->first_sector; | |
379 *len= last_cell->last_sector - first_cell->first_sector; | |
380 /* printf("dvdnav:searching:current pos=%u length=%u\n",*pos,*len); */ | |
381 | |
382 | |
383 return S_OK; | |
384 } | |
385 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
386 dvdnav_status_t dvdnav_get_position_in_title(dvdnav_t *this, |
8
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
387 unsigned int *pos, |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
388 unsigned int *len) { |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
389 uint32_t cur_sector; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
390 uint32_t first_cell_nr; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
391 uint32_t last_cell_nr; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
392 cell_playback_t *first_cell; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
393 cell_playback_t *last_cell; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
394 dvd_state_t *state; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
395 if((!this) || (!this->vm) ) |
8
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
396 return S_ERR; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
397 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
398 state = &(this->vm->state); |
8
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
399 if((!state) || (!state->pgc) ) |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
400 return S_ERR; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
401 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
402 /* Sanity check */ |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
403 if(state->pgN > state->pgc->nr_of_programs) { |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
404 return S_ERR; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
405 } |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
406 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
407 /* Get current sector */ |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
8
diff
changeset
|
408 cur_sector = this->vobu.vobu_start + this->vobu.blockN; |
8
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
409 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
410 /* Now find first and last cells in title. */ |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
411 first_cell_nr = state->pgc->program_map[0]; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
412 first_cell = &(state->pgc->cell_playback[first_cell_nr-1]); |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
413 last_cell_nr = state->pgc->nr_of_cells; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
414 last_cell = &(state->pgc->cell_playback[last_cell_nr-1]); |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
415 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
416 *pos = cur_sector - first_cell->first_sector; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
417 *len = last_cell->last_sector - first_cell->first_sector; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
418 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
419 return S_OK; |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
420 } |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
421 |
66708b4a1b5e
Stop C++ bitching about some things and extend the menus example
richwareham
parents:
3
diff
changeset
|
422 |