1 diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
2 --- libdvdnav.orig/src/vm/vm.c 2009-10-29 09:10:44.836643320 -0700
3 +++ libdvdnav/src/vm/vm.c 2009-11-27 11:32:47.475322754 -0800
8 + if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
11 (vm->state).domain = VMGM_DOMAIN;
18 + if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
21 (vm->state).domain = VTSM_DOMAIN;
33 if(link_values.data2 != 0)
34 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
35 if(!set_VTS_PTT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG, link_values.data1))
37 - link_values = play_PG(vm);
38 + link_values.command = Exit;
40 + link_values = play_PG(vm);
43 /* Link to Program Number:data1 */
45 /* Set SPRM1 and SPRM2 */
46 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
47 if(!set_VTS_TT(vm, (vm->state).vtsN, link_values.data1))
49 - link_values = play_PGC(vm);
50 + link_values.command = Exit;
52 + link_values = play_PGC(vm);
55 /* Jump to Part:data2 of Title:data1 in same VTS Title Domain */
57 /* Set SPRM1 and SPRM2 */
58 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
59 if(!set_VTS_PTT(vm, (vm->state).vtsN, link_values.data1, link_values.data2))
61 - link_values = play_PGC_PG(vm, (vm->state).pgN);
62 + link_values.command = Exit;
64 + link_values = play_PGC_PG(vm, (vm->state).pgN);
68 @@ -1488,6 +1498,10 @@
69 /* Allowed from anywhere except the VTS Title domain */
70 /* Stop SPRM9 Timer and any GPRM counters */
71 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
72 + if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
73 + link_values.command = Exit;
76 (vm->state).domain = VMGM_DOMAIN;
77 if(!set_MENU(vm, link_values.data1))
79 @@ -1504,14 +1518,22 @@
80 if (link_values.data1 != (vm->state).vtsN) {
82 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
83 - (vm->state).domain = VTSM_DOMAIN;
84 if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */
86 + if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
87 + link_values.command = Exit;
90 + (vm->state).domain = VTSM_DOMAIN;
92 /* This happens on some discs like "Captain Scarlet & the Mysterons" or
93 * the German RC2 of "Anatomie" in VTSM. */
94 assert((vm->state).domain == VTSM_DOMAIN ||
95 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
96 + if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
97 + link_values.command = Exit;
100 (vm->state).domain = VTSM_DOMAIN;
103 @@ -1533,6 +1555,10 @@
105 /* Stop SPRM9 Timer and any GPRM counters */
106 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
107 + if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
108 + link_values.command = Exit;
111 (vm->state).domain = VMGM_DOMAIN;
112 if(!set_PGCN(vm, link_values.data1))
114 @@ -1552,6 +1578,10 @@
115 /* set_RSMinfo:data2 */
116 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
117 /* Must be called before domain is changed */
118 + if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
119 + link_values.command = Exit;
122 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
123 (vm->state).domain = VMGM_DOMAIN;
124 if(!set_MENU(vm, link_values.data1))
125 @@ -1563,6 +1593,10 @@
126 /* set_RSMinfo:data2 */
127 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
128 /* Must be called before domain is changed */
129 + if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) {
130 + link_values.command = Exit;
133 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
134 (vm->state).domain = VTSM_DOMAIN;
135 if(!set_MENU(vm, link_values.data1))
136 @@ -1574,6 +1608,10 @@
137 /* set_RSMinfo:data2 */
138 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
139 /* Must be called before domain is changed */
140 + if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) {
141 + link_values.command = Exit;
144 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
145 (vm->state).domain = VMGM_DOMAIN;
146 if(!set_PGCN(vm, link_values.data1))
147 @@ -1634,7 +1672,9 @@
148 (vm->state).TT_PGCN_REG = pgcN;
149 (vm->state).PTTN_REG = part;
150 (vm->state).TTN_REG = get_TT(vm, vtsN, vts_ttn);
151 - assert( (vm->state.TTN_REG) != 0 );
152 + if( (vm->state.TTN_REG) == 0 )
155 (vm->state).VTS_TTN_REG = vts_ttn;
156 (vm->state).vtsN = vtsN; /* Not sure about this one. We can get to it easily from TTN_REG */
157 /* Any other registers? */