Mercurial > libdvdnav.hg
comparison vm/vm.c @ 256:6299ccea8a38 src
killing a lot of asserts and turning them into forced executions of Exit,
moving the VM into the STOP domain; also use this condition to report
failures right on VM start as problems with the disc
(patch heavily inspired by Bastien)
author | mroi |
---|---|
date | Wed, 15 Dec 2004 21:16:58 +0000 |
parents | f78669338b49 |
children | 97ad00b13609 |
comparison
equal
deleted
inserted
replaced
255:3e5192f8113f | 256:6299ccea8a38 |
---|---|
182 } else { | 182 } else { |
183 fprintf(MSG_OUT, "NAME OPEN FAILED\n"); | 183 fprintf(MSG_OUT, "NAME OPEN FAILED\n"); |
184 } | 184 } |
185 } | 185 } |
186 | 186 |
187 static void ifoOpenNewVTSI(vm_t *vm, dvd_reader_t *dvd, int vtsN) { | 187 static int ifoOpenNewVTSI(vm_t *vm, dvd_reader_t *dvd, int vtsN) { |
188 if((vm->state).vtsN == vtsN) { | 188 if((vm->state).vtsN == vtsN) { |
189 return; /* We alread have it */ | 189 return 1; /* We alread have it */ |
190 } | 190 } |
191 | 191 |
192 if(vm->vtsi != NULL) | 192 if(vm->vtsi != NULL) |
193 ifoClose(vm->vtsi); | 193 ifoClose(vm->vtsi); |
194 | 194 |
195 vm->vtsi = ifoOpenVTSI(dvd, vtsN); | 195 vm->vtsi = ifoOpenVTSI(dvd, vtsN); |
196 if(vm->vtsi == NULL) { | 196 if(vm->vtsi == NULL) { |
197 fprintf(MSG_OUT, "libdvdnav: ifoOpenVTSI failed - CRASHING!!!\n"); | 197 fprintf(MSG_OUT, "libdvdnav: ifoOpenVTSI failed\n"); |
198 assert(0); | 198 return 0; |
199 } | 199 } |
200 if(!ifoRead_VTS_PTT_SRPT(vm->vtsi)) { | 200 if(!ifoRead_VTS_PTT_SRPT(vm->vtsi)) { |
201 fprintf(MSG_OUT, "libdvdnav: ifoRead_VTS_PTT_SRPT failed - CRASHING!!!\n"); | 201 fprintf(MSG_OUT, "libdvdnav: ifoRead_VTS_PTT_SRPT failed\n"); |
202 assert(0); | 202 return 0; |
203 } | 203 } |
204 if(!ifoRead_PGCIT(vm->vtsi)) { | 204 if(!ifoRead_PGCIT(vm->vtsi)) { |
205 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCIT failed - CRASHING!!!\n"); | 205 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCIT failed\n"); |
206 assert(0); | 206 return 0; |
207 } | 207 } |
208 if(!ifoRead_PGCI_UT(vm->vtsi)) { | 208 if(!ifoRead_PGCI_UT(vm->vtsi)) { |
209 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCI_UT failed - CRASHING!!!\n"); | 209 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCI_UT failed\n"); |
210 assert(0); | 210 return 0; |
211 } | 211 } |
212 if(!ifoRead_VOBU_ADMAP(vm->vtsi)) { | 212 if(!ifoRead_VOBU_ADMAP(vm->vtsi)) { |
213 fprintf(MSG_OUT, "libdvdnav: ifoRead_VOBU_ADMAP vtsi failed - CRASHING\n"); | 213 fprintf(MSG_OUT, "libdvdnav: ifoRead_VOBU_ADMAP vtsi failed\n"); |
214 assert(0); | 214 return 0; |
215 } | 215 } |
216 if(!ifoRead_TITLE_VOBU_ADMAP(vm->vtsi)) { | 216 if(!ifoRead_TITLE_VOBU_ADMAP(vm->vtsi)) { |
217 fprintf(MSG_OUT, "libdvdnav: ifoRead_TITLE_VOBU_ADMAP vtsi failed - CRASHING\n"); | 217 fprintf(MSG_OUT, "libdvdnav: ifoRead_TITLE_VOBU_ADMAP vtsi failed\n"); |
218 assert(0); | 218 return 0; |
219 } | 219 } |
220 (vm->state).vtsN = vtsN; | 220 (vm->state).vtsN = vtsN; |
221 | |
222 return 1; | |
221 } | 223 } |
222 | 224 |
223 | 225 |
224 /* Initialisation & Destruction */ | 226 /* Initialisation & Destruction */ |
225 | 227 |
251 } | 253 } |
252 | 254 |
253 | 255 |
254 /* Basic Handling */ | 256 /* Basic Handling */ |
255 | 257 |
256 void vm_start(vm_t *vm) { | 258 int vm_start(vm_t *vm) { |
257 /* Set pgc to FP (First Play) pgc */ | 259 /* Set pgc to FP (First Play) pgc */ |
258 set_FP_PGC(vm); | 260 set_FP_PGC(vm); |
259 process_command(vm, play_PGC(vm)); | 261 process_command(vm, play_PGC(vm)); |
262 return !vm->stopped; | |
260 } | 263 } |
261 | 264 |
262 void vm_stop(vm_t *vm) { | 265 void vm_stop(vm_t *vm) { |
263 if(vm->vmgi) { | 266 if(vm->vmgi) { |
264 ifoClose(vm->vmgi); | 267 ifoClose(vm->vmgi); |
380 /* open a new vtsi handle, because the copy might switch to another VTS */ | 383 /* open a new vtsi handle, because the copy might switch to another VTS */ |
381 target->vtsi = NULL; | 384 target->vtsi = NULL; |
382 vtsN = (target->state).vtsN; | 385 vtsN = (target->state).vtsN; |
383 if (vtsN > 0) { | 386 if (vtsN > 0) { |
384 (target->state).vtsN = 0; | 387 (target->state).vtsN = 0; |
385 ifoOpenNewVTSI(target, target->dvd, vtsN); | 388 if (!ifoOpenNewVTSI(target, target->dvd, vtsN)) |
389 assert(0); | |
386 | 390 |
387 /* restore pgc pointer into the new vtsi */ | 391 /* restore pgc pointer into the new vtsi */ |
388 if (!set_PGCN(target, pgcN)) | 392 if (!set_PGCN(target, pgcN)) |
389 assert(0); | 393 assert(0); |
390 (target->state).pgN = pgN; | 394 (target->state).pgN = pgN; |
1278 /* Link to Next Program Chain */ | 1282 /* Link to Next Program Chain */ |
1279 /* BUTTON number:data1 */ | 1283 /* BUTTON number:data1 */ |
1280 if(link_values.data1 != 0) | 1284 if(link_values.data1 != 0) |
1281 (vm->state).HL_BTNN_REG = link_values.data1 << 10; | 1285 (vm->state).HL_BTNN_REG = link_values.data1 << 10; |
1282 assert((vm->state).pgc->next_pgc_nr != 0); | 1286 assert((vm->state).pgc->next_pgc_nr != 0); |
1283 if(!set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) | 1287 if(set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) |
1284 assert(0); | 1288 link_values = play_PGC(vm); |
1285 link_values = play_PGC(vm); | 1289 else |
1290 link_values.command = Exit; | |
1286 break; | 1291 break; |
1287 case LinkPrevPGC: | 1292 case LinkPrevPGC: |
1288 /* Link to Previous Program Chain */ | 1293 /* Link to Previous Program Chain */ |
1289 /* BUTTON number:data1 */ | 1294 /* BUTTON number:data1 */ |
1290 if(link_values.data1 != 0) | 1295 if(link_values.data1 != 0) |
1291 (vm->state).HL_BTNN_REG = link_values.data1 << 10; | 1296 (vm->state).HL_BTNN_REG = link_values.data1 << 10; |
1292 assert((vm->state).pgc->prev_pgc_nr != 0); | 1297 assert((vm->state).pgc->prev_pgc_nr != 0); |
1293 if(!set_PGCN(vm, (vm->state).pgc->prev_pgc_nr)) | 1298 if(set_PGCN(vm, (vm->state).pgc->prev_pgc_nr)) |
1294 assert(0); | 1299 link_values = play_PGC(vm); |
1295 link_values = play_PGC(vm); | 1300 else |
1301 link_values.command = Exit; | |
1296 break; | 1302 break; |
1297 case LinkGoUpPGC: | 1303 case LinkGoUpPGC: |
1298 /* Link to GoUp Program Chain */ | 1304 /* Link to GoUp Program Chain */ |
1299 /* BUTTON number:data1 */ | 1305 /* BUTTON number:data1 */ |
1300 if(link_values.data1 != 0) | 1306 if(link_values.data1 != 0) |
1301 (vm->state).HL_BTNN_REG = link_values.data1 << 10; | 1307 (vm->state).HL_BTNN_REG = link_values.data1 << 10; |
1302 assert((vm->state).pgc->goup_pgc_nr != 0); | 1308 assert((vm->state).pgc->goup_pgc_nr != 0); |
1303 if(!set_PGCN(vm, (vm->state).pgc->goup_pgc_nr)) | 1309 if(set_PGCN(vm, (vm->state).pgc->goup_pgc_nr)) |
1304 assert(0); | 1310 link_values = play_PGC(vm); |
1305 link_values = play_PGC(vm); | 1311 else |
1312 link_values.command = Exit; | |
1306 break; | 1313 break; |
1307 case LinkTailPGC: | 1314 case LinkTailPGC: |
1308 /* Link to Tail of Program Chain */ | 1315 /* Link to Tail of Program Chain */ |
1309 /* BUTTON number:data1 */ | 1316 /* BUTTON number:data1 */ |
1310 if(link_values.data1 != 0) | 1317 if(link_values.data1 != 0) |
1323 link_values.command = Exit; | 1330 link_values.command = Exit; |
1324 break; | 1331 break; |
1325 } | 1332 } |
1326 | 1333 |
1327 (vm->state).domain = VTS_DOMAIN; | 1334 (vm->state).domain = VTS_DOMAIN; |
1328 ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN); | 1335 if (!ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN)) |
1336 assert(0); | |
1329 set_PGCN(vm, (vm->state).rsm_pgcN); | 1337 set_PGCN(vm, (vm->state).rsm_pgcN); |
1330 | 1338 |
1331 /* These should never be set in SystemSpace and/or MenuSpace */ | 1339 /* These should never be set in SystemSpace and/or MenuSpace */ |
1332 /* (vm->state).TTN_REG = rsm_tt; ?? */ | 1340 /* (vm->state).TTN_REG = rsm_tt; ?? */ |
1333 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */ | 1341 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */ |
1402 /* Only allowed from the First Play domain(PGC) */ | 1410 /* Only allowed from the First Play domain(PGC) */ |
1403 /* or the Video Manager domain (VMG) */ | 1411 /* or the Video Manager domain (VMG) */ |
1404 /* Stop SPRM9 Timer */ | 1412 /* Stop SPRM9 Timer */ |
1405 /* Set SPRM1 and SPRM2 */ | 1413 /* Set SPRM1 and SPRM2 */ |
1406 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ | 1414 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ |
1407 if(!set_TT(vm, link_values.data1)) | 1415 if(set_TT(vm, link_values.data1)) |
1408 assert(0); | 1416 link_values = play_PGC(vm); |
1409 link_values = play_PGC(vm); | 1417 else |
1418 link_values.command = Exit; | |
1410 break; | 1419 break; |
1411 case JumpVTS_TT: | 1420 case JumpVTS_TT: |
1412 /* Jump to Title:data1 in same VTS Title Domain */ | 1421 /* Jump to Title:data1 in same VTS Title Domain */ |
1413 /* Only allowed from the VTS Menu Domain(VTSM) */ | 1422 /* Only allowed from the VTS Menu Domain(VTSM) */ |
1414 /* or the Video Title Set Domain(VTS) */ | 1423 /* or the Video Title Set Domain(VTS) */ |
1461 if(link_values.data1 != 0) { | 1470 if(link_values.data1 != 0) { |
1462 if (link_values.data1 != (vm->state).vtsN) { | 1471 if (link_values.data1 != (vm->state).vtsN) { |
1463 /* the normal case */ | 1472 /* the normal case */ |
1464 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ | 1473 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ |
1465 (vm->state).domain = VTSM_DOMAIN; | 1474 (vm->state).domain = VTSM_DOMAIN; |
1466 ifoOpenNewVTSI(vm, vm->dvd, link_values.data1); /* Also sets (vm->state).vtsN */ | 1475 if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */ |
1476 assert(0); | |
1467 } else { | 1477 } else { |
1468 /* This happens on some discs like "Captain Scarlet & the Mysterons" or | 1478 /* This happens on some discs like "Captain Scarlet & the Mysterons" or |
1469 * the German RC2 of "Anatomie" in VTSM. */ | 1479 * the German RC2 of "Anatomie" in VTSM. */ |
1470 assert((vm->state).domain == VTSM_DOMAIN || | 1480 assert((vm->state).domain == VTSM_DOMAIN || |
1471 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ | 1481 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ |
1574 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) { | 1584 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) { |
1575 int pgcN, pgN, res; | 1585 int pgcN, pgN, res; |
1576 | 1586 |
1577 (vm->state).domain = VTS_DOMAIN; | 1587 (vm->state).domain = VTS_DOMAIN; |
1578 | 1588 |
1579 if(vtsN != (vm->state).vtsN) | 1589 if (vtsN != (vm->state).vtsN) |
1580 ifoOpenNewVTSI(vm, vm->dvd, vtsN); /* Also sets (vm->state).vtsN */ | 1590 if (!ifoOpenNewVTSI(vm, vm->dvd, vtsN)) /* Also sets (vm->state).vtsN */ |
1591 return 0; | |
1581 | 1592 |
1582 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) || | 1593 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) || |
1583 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) { | 1594 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) { |
1584 return 0; | 1595 return 0; |
1585 } | 1596 } |