annotate vm/vm.c @ 400:3daa43270d2c src

Cosmetic change only - os2_open os2_open() doesn't look like the rest of the code. And since we just updated it, it probably should look like the rest of the code.
author erik
date Sun, 06 Sep 2009 15:26:43 +0000
parents 61edd6fa781b
children 390fbf2a9602
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1 /*
390
ef8c0e834a14 Convert all ISO8859-1 sequences to proper UTF-8.
diego
parents: 389
diff changeset
2 * Copyright (C) 2000, 2001 HÃ¥kan Hjort
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
3 * Copyright (C) 2001 Rich Wareham <richwareham@users.sourceforge.net>
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
4 * 2002-2004 the dvdnav project
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
5 *
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
6 * This file is part of libdvdnav, a DVD navigation library. It is modified
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
7 * from a file originally part of the Ogle DVD player.
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
8 *
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
9 * libdvdnav is free software; you can redistribute it and/or modify
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
12 * (at your option) any later version.
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
13 *
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
14 * libdvdnav is distributed in the hope that it will be useful,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
17 * GNU General Public License for more details.
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
18 *
389
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
19 * You should have received a copy of the GNU General Public License along
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
20 * with libdvdnav; if not, write to the Free Software Foundation, Inc.,
d3c273ced49c Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents: 388
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
22 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
23
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
25 #include "config.h"
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
26 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
27
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
28 #include <stdio.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
29 #include <string.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
30 #include <stdlib.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
31 #include <unistd.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
32 #include <inttypes.h>
294
2146ff691bcd include limits.h; it was included in the previous dvdnav_internal.h and without it players segfault
nicodvb
parents: 290
diff changeset
33 #include <limits.h>
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
34 #include <assert.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
35 #include <sys/types.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
36 #include <sys/stat.h>
290
54b6a000f6da decoder.h needs inclusion of sys/time.h
nicodvb
parents: 285
diff changeset
37 #include <sys/time.h>
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
38 #include <fcntl.h>
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
39
386
579a3538d284 Sync with current libdvdread header location.
rathann
parents: 378
diff changeset
40 #include <dvdread/nav_types.h>
579a3538d284 Sync with current libdvdread header location.
rathann
parents: 378
diff changeset
41 #include <dvdread/ifo_types.h>
579a3538d284 Sync with current libdvdread header location.
rathann
parents: 378
diff changeset
42 #include <dvdread/ifo_read.h>
395
9c5aef10d165 Move dvd_types.h, dvdnav_events.h and dvdnav.h into a dvdnav directory.
reimar
parents: 394
diff changeset
43 #include "dvdnav/dvdnav.h"
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
44
285
52877d182e96 moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents: 260
diff changeset
45 #include "decoder.h"
52877d182e96 moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents: 260
diff changeset
46 #include "remap.h"
52877d182e96 moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents: 260
diff changeset
47 #include "vm.h"
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
48 #include "dvdnav_internal.h"
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
49
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
50 #ifdef _MSC_VER
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
51 #include <io.h> /* read() */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
52 #endif /* _MSC_VER */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
53
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
54 #ifdef __OS2__
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
55 #define INCL_DOS
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
56 #include <os2.h>
399
61edd6fa781b OS/2 portability fix
erik
parents: 397
diff changeset
57 #include <io.h> /* setmode() */
61edd6fa781b OS/2 portability fix
erik
parents: 397
diff changeset
58 #include <fcntl.h> /* O_BINARY */
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
59 #endif
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
60
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
61 /*
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
62 #define STRICT
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
63 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
64
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
65 /* Local prototypes */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
66
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
67 /* get_XYZ returns a value.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
68 * set_XYZ sets state using passed parameters.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
69 * returns success/failure.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
70 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
71
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
72 /* Play */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
73 static link_t play_PGC(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
74 static link_t play_PGC_PG(vm_t *vm, int pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
75 static link_t play_PGC_post(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
76 static link_t play_PG(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
77 static link_t play_Cell(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
78 static link_t play_Cell_post(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
79
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
80 /* Process link - returns 1 if a hop has been performed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
81 static int process_command(vm_t *vm,link_t link_values);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
82
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
83 /* Set */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
84 static int set_TT(vm_t *vm, int tt);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
85 static int set_PTT(vm_t *vm, int tt, int ptt);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
86 static int set_VTS_TT(vm_t *vm, int vtsN, int vts_ttn);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
87 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
88 static int set_FP_PGC(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
89 static int set_MENU(vm_t *vm, int menu);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
90 static int set_PGCN(vm_t *vm, int pgcN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
91 static int set_PGN(vm_t *vm); /* Set PGN based on (vm->state).CellN */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
92 static void set_RSMinfo(vm_t *vm, int cellN, int blockN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
93
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
94 /* Get */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
95 static int get_TT(vm_t *vm, int vtsN, int vts_ttn);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
96 static int get_ID(vm_t *vm, int id);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
97 static int get_PGCN(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
98
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
99 static pgcit_t* get_MENU_PGCIT(vm_t *vm, ifo_handle_t *h, uint16_t lang);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
100 static pgcit_t* get_PGCIT(vm_t *vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
101
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
102
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
103 /* Helper functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
104
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
105 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
106 static void vm_print_current_domain_state(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
107 switch((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
108 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
109 fprintf(MSG_OUT, "libdvdnav: Video Title Domain: -\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
110 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
111
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
112 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
113 fprintf(MSG_OUT, "libdvdnav: Video Title Menu Domain: -\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
114 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
115
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
116 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
117 fprintf(MSG_OUT, "libdvdnav: Video Manager Menu Domain: -\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
118 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
119
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
120 case FP_DOMAIN:
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
121 fprintf(MSG_OUT, "libdvdnav: First Play Domain: -\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
122 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
123
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
124 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
125 fprintf(MSG_OUT, "libdvdnav: Unknown Domain: -\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
126 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
127 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
128 fprintf(MSG_OUT, "libdvdnav: VTS:%d PGC:%d PG:%u CELL:%u BLOCK:%u VTS_TTN:%u TTN:%u TT_PGCN:%u\n",
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
129 (vm->state).vtsN,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
130 get_PGCN(vm),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
131 (vm->state).pgN,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
132 (vm->state).cellN,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
133 (vm->state).blockN,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
134 (vm->state).VTS_TTN_REG,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
135 (vm->state).TTN_REG,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
136 (vm->state).TT_PGCN_REG);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
137 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
138 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
139
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
140 #ifdef __OS2__
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
141 #define open os2_open
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
142
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
143 static int os2_open(const char *name, int oflag)
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
144 {
400
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
145 HFILE hfile;
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
146 ULONG ulAction;
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
147 ULONG rc;
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
148
400
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
149 rc = DosOpenL(name, &hfile, &ulAction, 0, FILE_NORMAL,
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
150 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
151 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD,
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
152 NULL);
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
153
400
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
154 if(rc)
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
155 return -1;
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
156
400
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
157 setmode(hfile, O_BINARY);
399
61edd6fa781b OS/2 portability fix
erik
parents: 397
diff changeset
158
400
3daa43270d2c Cosmetic change only - os2_open
erik
parents: 399
diff changeset
159 return (int)hfile;
394
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
160 }
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
161 #endif
0ac6f0d242bc OS/2 support by KO Myung-Hun, komh chollian net
diego
parents: 392
diff changeset
162
397
a70f79850e5f implement and export dvdnav_get_serial_string(); patch by Matthew Wire devel - mrwire - co - uk. Fixed by Erik
nicodvb
parents: 395
diff changeset
163 static void dvd_read_name(char *name, char *serial, const char *device) {
229
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
164 /* Because we are compiling with _FILE_OFFSET_BITS=64
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
165 * all off_t are 64bit.
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
166 */
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
167 off_t off;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
168 int fd, i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
169 uint8_t data[DVD_VIDEO_LB_LEN];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
170
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
171 /* Read DVD name */
244
a27c81078c3c removing O_EXCL, since it does not work with DVD images
mroi
parents: 243
diff changeset
172 fd = open(device, O_RDONLY);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
173 if (fd > 0) {
229
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
174 off = lseek( fd, 32 * (off_t) DVD_VIDEO_LB_LEN, SEEK_SET );
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
175 if( off == ( 32 * (off_t) DVD_VIDEO_LB_LEN ) ) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
176 off = read( fd, data, DVD_VIDEO_LB_LEN );
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
177 close(fd);
229
8b5edf44e384 Remove all occurances to off64_t and lseek64
jcdutton
parents: 226
diff changeset
178 if (off == ( (off_t) DVD_VIDEO_LB_LEN )) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
179 fprintf(MSG_OUT, "libdvdnav: DVD Title: ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
180 for(i=25; i < 73; i++ ) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
181 if((data[i] == 0)) break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
182 if((data[i] > 32) && (data[i] < 127)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
183 fprintf(MSG_OUT, "%c", data[i]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
184 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
185 fprintf(MSG_OUT, " ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
186 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
187 }
377
9a9d15ed0599 (char*) typecase to silence gcc; patch by Erik Hovland org
nicodvb
parents: 345
diff changeset
188 strncpy(name, (char*) &data[25], 48);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
189 name[48] = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
190 fprintf(MSG_OUT, "\nlibdvdnav: DVD Serial Number: ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
191 for(i=73; i < 89; i++ ) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
192 if((data[i] == 0)) break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
193 if((data[i] > 32) && (data[i] < 127)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
194 fprintf(MSG_OUT, "%c", data[i]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
195 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
196 fprintf(MSG_OUT, " ");
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
197 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
198 }
397
a70f79850e5f implement and export dvdnav_get_serial_string(); patch by Matthew Wire devel - mrwire - co - uk. Fixed by Erik
nicodvb
parents: 395
diff changeset
199 strncpy(serial, (char*) &data[73], (i-73));
a70f79850e5f implement and export dvdnav_get_serial_string(); patch by Matthew Wire devel - mrwire - co - uk. Fixed by Erik
nicodvb
parents: 395
diff changeset
200 serial[14] = 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
201 fprintf(MSG_OUT, "\nlibdvdnav: DVD Title (Alternative): ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
202 for(i=89; i < 128; i++ ) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
203 if((data[i] == 0)) break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
204 if((data[i] > 32) && (data[i] < 127)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
205 fprintf(MSG_OUT, "%c", data[i]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
206 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
207 fprintf(MSG_OUT, " ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
208 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
209 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
210 fprintf(MSG_OUT, "\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
211 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
212 fprintf(MSG_OUT, "libdvdnav: Can't read name block. Probably not a DVD-ROM device.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
213 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
214 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
215 fprintf(MSG_OUT, "libdvdnav: Can't seek to block %u\n", 32 );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
216 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
217 close(fd);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
218 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
219 fprintf(MSG_OUT, "NAME OPEN FAILED\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
220 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
221 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
222
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
223 static int ifoOpenNewVTSI(vm_t *vm, dvd_reader_t *dvd, int vtsN) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
224 if((vm->state).vtsN == vtsN) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
225 return 1; /* We alread have it */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
226 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
227
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
228 if(vm->vtsi != NULL)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
229 ifoClose(vm->vtsi);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
230
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
231 vm->vtsi = ifoOpenVTSI(dvd, vtsN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
232 if(vm->vtsi == NULL) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
233 fprintf(MSG_OUT, "libdvdnav: ifoOpenVTSI failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
234 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
235 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
236 if(!ifoRead_VTS_PTT_SRPT(vm->vtsi)) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
237 fprintf(MSG_OUT, "libdvdnav: ifoRead_VTS_PTT_SRPT failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
238 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
239 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
240 if(!ifoRead_PGCIT(vm->vtsi)) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
241 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCIT failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
242 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
243 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
244 if(!ifoRead_PGCI_UT(vm->vtsi)) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
245 fprintf(MSG_OUT, "libdvdnav: ifoRead_PGCI_UT failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
246 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
247 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
248 if(!ifoRead_VOBU_ADMAP(vm->vtsi)) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
249 fprintf(MSG_OUT, "libdvdnav: ifoRead_VOBU_ADMAP vtsi failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
250 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
251 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
252 if(!ifoRead_TITLE_VOBU_ADMAP(vm->vtsi)) {
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
253 fprintf(MSG_OUT, "libdvdnav: ifoRead_TITLE_VOBU_ADMAP vtsi failed\n");
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
254 return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
255 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
256 (vm->state).vtsN = vtsN;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
257
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
258 return 1;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
259 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
260
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
261
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
262 /* Initialisation & Destruction */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
263
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
264 vm_t* vm_new_vm() {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
265 return (vm_t*)calloc(sizeof(vm_t), sizeof(char));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
266 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
267
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
268 void vm_free_vm(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
269 vm_stop(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
270 free(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
271 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
272
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
273
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
274 /* IFO Access */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
275
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
276 ifo_handle_t *vm_get_vmgi(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
277 return vm->vmgi;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
278 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
279
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
280 ifo_handle_t *vm_get_vtsi(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
281 return vm->vtsi;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
282 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
283
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
284
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
285 /* Reader Access */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
286
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
287 dvd_reader_t *vm_get_dvd_reader(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
288 return vm->dvd;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
289 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
290
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
291
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
292 /* Basic Handling */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
293
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
294 int vm_start(vm_t *vm) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
295 /* Set pgc to FP (First Play) pgc */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
296 set_FP_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
297 process_command(vm, play_PGC(vm));
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
298 return !vm->stopped;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
299 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
300
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
301 void vm_stop(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
302 if(vm->vmgi) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
303 ifoClose(vm->vmgi);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
304 vm->vmgi=NULL;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
305 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
306 if(vm->vtsi) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
307 ifoClose(vm->vtsi);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
308 vm->vtsi=NULL;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
309 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
310 if(vm->dvd) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
311 DVDClose(vm->dvd);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
312 vm->dvd=NULL;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
313 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
314 vm->stopped = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
315 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
316
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
317 int vm_reset(vm_t *vm, const char *dvdroot) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
318 /* Setup State */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
319 memset((vm->state).registers.SPRM, 0, sizeof((vm->state).registers.SPRM));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
320 memset((vm->state).registers.GPRM, 0, sizeof((vm->state).registers.GPRM));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
321 memset((vm->state).registers.GPRM_mode, 0, sizeof((vm->state).registers.GPRM_mode));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
322 memset((vm->state).registers.GPRM_mode, 0, sizeof((vm->state).registers.GPRM_mode));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
323 memset((vm->state).registers.GPRM_time, 0, sizeof((vm->state).registers.GPRM_time));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
324 (vm->state).registers.SPRM[0] = ('e'<<8)|'n'; /* Player Menu Languange code */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
325 (vm->state).AST_REG = 15; /* 15 why? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
326 (vm->state).SPST_REG = 62; /* 62 why? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
327 (vm->state).AGL_REG = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
328 (vm->state).TTN_REG = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
329 (vm->state).VTS_TTN_REG = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
330 /* (vm->state).TT_PGCN_REG = 0 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
331 (vm->state).PTTN_REG = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
332 (vm->state).HL_BTNN_REG = 1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
333 (vm->state).PTL_REG = 15; /* Parental Level */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
334 (vm->state).registers.SPRM[12] = ('U'<<8)|'S'; /* Parental Management Country Code */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
335 (vm->state).registers.SPRM[16] = ('e'<<8)|'n'; /* Initial Language Code for Audio */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
336 (vm->state).registers.SPRM[18] = ('e'<<8)|'n'; /* Initial Language Code for Spu */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
337 (vm->state).registers.SPRM[20] = 0x1; /* Player Regional Code Mask. Region free! */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
338 (vm->state).registers.SPRM[14] = 0x100; /* Try Pan&Scan */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
339
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
340 (vm->state).pgN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
341 (vm->state).cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
342 (vm->state).cell_restart = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
343
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
344 (vm->state).domain = FP_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
345 (vm->state).rsm_vtsN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
346 (vm->state).rsm_cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
347 (vm->state).rsm_blockN = 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
348
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
349 (vm->state).vtsN = -1;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
350
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
351 if (vm->dvd && dvdroot) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
352 /* a new dvd device has been requested */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
353 vm_stop(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
354 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
355 if (!vm->dvd) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
356 vm->dvd = DVDOpen(dvdroot);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
357 if(!vm->dvd) {
260
97ad00b13609 fixing typos noticed by Jeff Smith
mroi
parents: 256
diff changeset
358 fprintf(MSG_OUT, "libdvdnav: vm: failed to open/read the DVD\n");
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
359 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
360 }
397
a70f79850e5f implement and export dvdnav_get_serial_string(); patch by Matthew Wire devel - mrwire - co - uk. Fixed by Erik
nicodvb
parents: 395
diff changeset
361 dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
362 vm->map = remap_loadmap(vm->dvd_name);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
363 vm->vmgi = ifoOpenVMGI(vm->dvd);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
364 if(!vm->vmgi) {
260
97ad00b13609 fixing typos noticed by Jeff Smith
mroi
parents: 256
diff changeset
365 fprintf(MSG_OUT, "libdvdnav: vm: failed to read VIDEO_TS.IFO\n");
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
366 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
367 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
368 if(!ifoRead_FP_PGC(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
369 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_FP_PGC failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
370 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
371 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
372 if(!ifoRead_TT_SRPT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
373 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_TT_SRPT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
374 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
375 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
376 if(!ifoRead_PGCI_UT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
377 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_PGCI_UT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
378 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
379 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
380 if(!ifoRead_PTL_MAIT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
381 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_PTL_MAIT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
382 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
383 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
384 if(!ifoRead_VTS_ATRT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
385 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_VTS_ATRT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
386 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
387 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
388 if(!ifoRead_VOBU_ADMAP(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
389 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_VOBU_ADMAP vgmi failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
390 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
391 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
392 /* ifoRead_TXTDT_MGI(vmgi); Not implemented yet */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
393 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
394 if (vm->vmgi) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
395 int i, mask;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
396 fprintf(MSG_OUT, "libdvdnav: DVD disk reports itself with Region mask 0x%08x. Regions:",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
397 vm->vmgi->vmgi_mat->vmg_category);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
398 for (i = 1, mask = 1; i <= 8; i++, mask <<= 1)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
399 if (((vm->vmgi->vmgi_mat->vmg_category >> 16) & mask) == 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
400 fprintf(MSG_OUT, " %d", i);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
401 fprintf(MSG_OUT, "\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
402 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
403 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
404 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
405
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
406
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
407 /* copying and merging */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
408
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
409 vm_t *vm_new_copy(vm_t *source) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
410 vm_t *target = vm_new_vm();
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
411 int vtsN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
412 int pgcN = get_PGCN(source);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
413 int pgN = (source->state).pgN;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
414
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
415 assert(pgcN);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
416
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
417 memcpy(target, source, sizeof(vm_t));
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
418
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
419 /* open a new vtsi handle, because the copy might switch to another VTS */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
420 target->vtsi = NULL;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
421 vtsN = (target->state).vtsN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
422 if (vtsN > 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
423 (target->state).vtsN = 0;
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
424 if (!ifoOpenNewVTSI(target, target->dvd, vtsN))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
425 assert(0);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
426
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
427 /* restore pgc pointer into the new vtsi */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
428 if (!set_PGCN(target, pgcN))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
429 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
430 (target->state).pgN = pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
431 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
432
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
433 return target;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
434 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
435
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
436 void vm_merge(vm_t *target, vm_t *source) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
437 if(target->vtsi)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
438 ifoClose(target->vtsi);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
439 memcpy(target, source, sizeof(vm_t));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
440 memset(source, 0, sizeof(vm_t));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
441 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
442
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
443 void vm_free_copy(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
444 if(vm->vtsi)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
445 ifoClose(vm->vtsi);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
446 free(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
447 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
448
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
449
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
450 /* regular playback */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
451
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
452 void vm_position_get(vm_t *vm, vm_position_t *position) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
453 position->button = (vm->state).HL_BTNN_REG >> 10;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
454 position->vts = (vm->state).vtsN;
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
455 position->domain = (vm->state).domain;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
456 position->spu_channel = (vm->state).SPST_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
457 position->audio_channel = (vm->state).AST_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
458 position->angle_channel = (vm->state).AGL_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
459 position->hop_channel = vm->hop_channel; /* Increases by one on each hop */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
460 position->cell = (vm->state).cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
461 position->cell_restart = (vm->state).cell_restart;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
462 position->cell_start = (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
463 position->still = (vm->state).pgc->cell_playback[(vm->state).cellN - 1].still_time;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
464 position->block = (vm->state).blockN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
465
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
466 /* handle PGC stills at PGC end */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
467 if ((vm->state).cellN == (vm->state).pgc->nr_of_cells)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
468 position->still += (vm->state).pgc->still_time;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
469 /* still already determined */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
470 if (position->still)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
471 return;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
472 /* This is a rough fix for some strange still situations on some strange DVDs.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
473 * There are discs (like the German "Back to the Future" RC2) where the only
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
474 * indication of a still is a cell playback time higher than the time the frames
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
475 * in this cell actually take to play (like 1 frame with 1 minute playback time).
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
476 * On the said BTTF disc, for these cells last_sector and last_vobu_start_sector
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
477 * are equal and the cells are very short, so we abuse these conditions to
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
478 * detect such discs. I consider these discs broken, so the fix is somewhat
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
479 * broken, too. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
480 if (((vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector ==
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
481 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_vobu_start_sector) &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
482 ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector -
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
483 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector < 1024)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
484 int time;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
485 int size = (vm->state).pgc->cell_playback[(vm->state).cellN - 1].last_sector -
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
486 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].first_sector;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
487 time = ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.hour >> 4 ) * 36000;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
488 time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.hour & 0x0f) * 3600;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
489 time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.minute >> 4 ) * 600;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
490 time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.minute & 0x0f) * 60;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
491 time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.second >> 4 ) * 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
492 time += ((vm->state).pgc->cell_playback[(vm->state).cellN - 1].playback_time.second & 0x0f) * 1;
246
0ba179301f71 division by zero fix reported by david huber
mroi
parents: 244
diff changeset
493 if (!time || size / time > 30)
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
494 /* datarate is too high, it might be a very short, but regular cell */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
495 return;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
496 if (time > 0xff) time = 0xff;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
497 position->still = time;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
498 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
499 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
500
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
501 void vm_get_next_cell(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
502 process_command(vm, play_Cell_post(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
503 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
504
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
505
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
506 /* Jumping */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
507
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
508 int vm_jump_pg(vm_t *vm, int pg) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
509 (vm->state).pgN = pg;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
510 process_command(vm, play_PG(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
511 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
512 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
513
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
514 int vm_jump_cell_block(vm_t *vm, int cell, int block) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
515 (vm->state).cellN = cell;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
516 process_command(vm, play_Cell(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
517 /* play_Cell can jump to a different cell in case of angles */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
518 if ((vm->state).cellN == cell)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
519 (vm->state).blockN = block;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
520 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
521 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
522
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
523 int vm_jump_title_part(vm_t *vm, int title, int part) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
524 link_t link;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
525
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
526 if(!set_PTT(vm, title, part))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
527 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
528 /* Some DVDs do not want us to jump directly into a title and have
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
529 * PGC pre commands taking us back to some menu. Since we do not like that,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
530 * we do not execute PGC pre commands that would do a jump. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
531 /* process_command(vm, play_PGC_PG(vm, (vm->state).pgN)); */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
532 link = play_PGC_PG(vm, (vm->state).pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
533 if (link.command != PlayThis)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
534 /* jump occured -> ignore it and play the PG anyway */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
535 process_command(vm, play_PG(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
536 else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
537 process_command(vm, link);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
538 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
539 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
540
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
541 int vm_jump_top_pg(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
542 process_command(vm, play_PG(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
543 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
544 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
545
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
546 int vm_jump_next_pg(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
547 if((vm->state).pgN >= (vm->state).pgc->nr_of_programs) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
548 /* last program -> move to TailPGC */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
549 process_command(vm, play_PGC_post(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
550 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
551 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
552 vm_jump_pg(vm, (vm->state).pgN + 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
553 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
554 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
555 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
556
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
557 int vm_jump_prev_pg(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
558 if ((vm->state).pgN <= 1) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
559 /* first program -> move to last program of previous PGC */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
560 if ((vm->state).pgc->prev_pgc_nr && set_PGCN(vm, (vm->state).pgc->prev_pgc_nr)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
561 process_command(vm, play_PGC(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
562 vm_jump_pg(vm, (vm->state).pgc->nr_of_programs);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
563 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
564 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
565 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
566 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
567 vm_jump_pg(vm, (vm->state).pgN - 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
568 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
569 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
570 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
571
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
572 int vm_jump_up(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
573 if((vm->state).pgc->goup_pgc_nr && set_PGCN(vm, (vm->state).pgc->goup_pgc_nr)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
574 process_command(vm, play_PGC(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
575 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
576 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
577 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
578 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
579
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
580 int vm_jump_menu(vm_t *vm, DVDMenuID_t menuid) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
581 domain_t old_domain = (vm->state).domain;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
582
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
583 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
584 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
585 set_RSMinfo(vm, 0, (vm->state).blockN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
586 /* FALL THROUGH */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
587 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
588 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
589 switch(menuid) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
590 case DVD_MENU_Title:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
591 case DVD_MENU_Escape:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
592 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
593 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
594 case DVD_MENU_Root:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
595 case DVD_MENU_Subpicture:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
596 case DVD_MENU_Audio:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
597 case DVD_MENU_Angle:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
598 case DVD_MENU_Part:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
599 (vm->state).domain = VTSM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
600 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
601 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
602 if(get_PGCIT(vm) && set_MENU(vm, menuid)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
603 process_command(vm, play_PGC(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
604 return 1; /* Jump */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
605 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
606 (vm->state).domain = old_domain;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
607 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
608 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
609 case FP_DOMAIN: /* FIXME XXX $$$ What should we do here? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
610 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
611 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
612
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
613 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
614 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
615
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
616 int vm_jump_resume(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
617 link_t link_values = { LinkRSM, 0, 0, 0 };
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
618
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
619 if (!(vm->state).rsm_vtsN) /* Do we have resume info? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
620 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
621 if (!process_command(vm, link_values))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
622 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
623 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
624 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
625
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
626 int vm_exec_cmd(vm_t *vm, vm_cmd_t *cmd) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
627 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
628
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
629 if(vmEval_CMD(cmd, 1, &(vm->state).registers, &link_values))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
630 return process_command(vm, link_values);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
631 else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
632 return 0; /* It updated some state thats all... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
633 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
634
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
635
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
636 /* getting information */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
637
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
638 int vm_get_current_menu(vm_t *vm, int *menuid) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
639 pgcit_t* pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
640 int pgcn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
641 pgcn = (vm->state).pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
642 pgcit = get_PGCIT(vm);
345
f051b111ef50 10l to me: in vm_get_current_menu() I forgot to attach
nicodvb
parents: 344
diff changeset
643 if(pgcit==NULL) return 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
644 *menuid = pgcit->pgci_srp[pgcn - 1].entry_id & 0xf ;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
645 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
646 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
647
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
648 int vm_get_current_title_part(vm_t *vm, int *title_result, int *part_result) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
649 vts_ptt_srpt_t *vts_ptt_srpt;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
650 int title, part = 0, vts_ttn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
651 int found;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
652 int16_t pgcN, pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
653
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
654 vts_ptt_srpt = vm->vtsi->vts_ptt_srpt;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
655 pgcN = get_PGCN(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
656 pgN = vm->state.pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
657
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
658 found = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
659 for (vts_ttn = 0; (vts_ttn < vts_ptt_srpt->nr_of_srpts) && !found; vts_ttn++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
660 for (part = 0; (part < vts_ptt_srpt->title[vts_ttn].nr_of_ptts) && !found; part++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
661 if (vts_ptt_srpt->title[vts_ttn].ptt[part].pgcn == pgcN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
662 if (vts_ptt_srpt->title[vts_ttn].ptt[part].pgn == pgN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
663 found = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
664 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
665 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
666 if (part > 0 && vts_ptt_srpt->title[vts_ttn].ptt[part].pgn > pgN &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
667 vts_ptt_srpt->title[vts_ttn].ptt[part - 1].pgn < pgN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
668 part--;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
669 found = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
670 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
671 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
672 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
673 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
674 if (found) break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
675 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
676 vts_ttn++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
677 part++;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
678
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
679 if (!found) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
680 fprintf(MSG_OUT, "libdvdnav: chapter NOT FOUND!\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
681 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
682 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
683
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
684 title = get_TT(vm, vm->state.vtsN, vts_ttn);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
685
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
686 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
687 if (title) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
688 fprintf(MSG_OUT, "libdvdnav: ************ this chapter FOUND!\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
689 fprintf(MSG_OUT, "libdvdnav: VTS_PTT_SRPT - Title %3i part %3i: PGC: %3i PG: %3i\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
690 title, part,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
691 vts_ptt_srpt->title[vts_ttn-1].ptt[part-1].pgcn ,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
692 vts_ptt_srpt->title[vts_ttn-1].ptt[part-1].pgn );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
693 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
694 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
695 *title_result = title;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
696 *part_result = part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
697 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
698 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
699
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
700 /* Return the substream id for 'logical' audio stream audioN.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
701 * 0 <= audioN < 8
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
702 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
703 int vm_get_audio_stream(vm_t *vm, int audioN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
704 int streamN = -1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
705
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
706 if((vm->state).domain != VTS_DOMAIN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
707 audioN = 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
708
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
709 if(audioN < 8) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
710 /* Is there any control info for this logical stream */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
711 if((vm->state).pgc->audio_control[audioN] & (1<<15)) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
712 streamN = ((vm->state).pgc->audio_control[audioN] >> 8) & 0x07;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
713 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
714 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
715
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
716 if((vm->state).domain != VTS_DOMAIN && streamN == -1)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
717 streamN = 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
718
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
719 /* FIXME: Should also check in vtsi/vmgi status what kind of stream
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
720 * it is (ac3/lpcm/dts/sdds...) to find the right (sub)stream id */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
721 return streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
722 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
723
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
724 /* Return the substream id for 'logical' subpicture stream subpN and given mode.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
725 * 0 <= subpN < 32
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
726 * mode == 0 - widescreen
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
727 * mode == 1 - letterbox
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
728 * mode == 2 - pan&scan
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
729 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
730 int vm_get_subp_stream(vm_t *vm, int subpN, int mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
731 int streamN = -1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
732 int source_aspect = vm_get_video_aspect(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
733
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
734 if((vm->state).domain != VTS_DOMAIN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
735 subpN = 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
736
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
737 if(subpN < 32) { /* a valid logical stream */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
738 /* Is this logical stream present */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
739 if((vm->state).pgc->subp_control[subpN] & (1<<31)) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
740 if(source_aspect == 0) /* 4:3 */
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
741 streamN = ((vm->state).pgc->subp_control[subpN] >> 24) & 0x1f;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
742 if(source_aspect == 3) /* 16:9 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
743 switch (mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
744 case 0:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
745 streamN = ((vm->state).pgc->subp_control[subpN] >> 16) & 0x1f;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
746 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
747 case 1:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
748 streamN = ((vm->state).pgc->subp_control[subpN] >> 8) & 0x1f;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
749 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
750 case 2:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
751 streamN = (vm->state).pgc->subp_control[subpN] & 0x1f;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
752 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
753 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
754 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
755
247
84f652524ecb small indentation fix
mroi
parents: 246
diff changeset
756 if((vm->state).domain != VTS_DOMAIN && streamN == -1)
84f652524ecb small indentation fix
mroi
parents: 246
diff changeset
757 streamN = 0;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
758
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
759 /* FIXME: Should also check in vtsi/vmgi status what kind of stream it is. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
760 return streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
761 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
762
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
763 int vm_get_audio_active_stream(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
764 int audioN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
765 int streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
766 audioN = (vm->state).AST_REG ;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
767 streamN = vm_get_audio_stream(vm, audioN);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
768
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
769 /* If no such stream, then select the first one that exists. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
770 if(streamN == -1) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
771 for(audioN = 0; audioN < 8; audioN++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
772 if((vm->state).pgc->audio_control[audioN] & (1<<15)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
773 if ((streamN = vm_get_audio_stream(vm, audioN)) >= 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
774 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
775 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
776 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
777 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
778
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
779 return streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
780 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
781
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
782 int vm_get_subp_active_stream(vm_t *vm, int mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
783 int subpN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
784 int streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
785 subpN = (vm->state).SPST_REG & ~0x40;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
786 streamN = vm_get_subp_stream(vm, subpN, mode);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
787
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
788 /* If no such stream, then select the first one that exists. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
789 if(streamN == -1) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
790 for(subpN = 0; subpN < 32; subpN++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
791 if((vm->state).pgc->subp_control[subpN] & (1<<31)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
792 if ((streamN = vm_get_subp_stream(vm, subpN, mode)) >= 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
793 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
794 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
795 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
796 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
797
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
798 if((vm->state).domain == VTS_DOMAIN && !((vm->state).SPST_REG & 0x40))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
799 /* Bit 7 set means hide, and only let Forced display show */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
800 return (streamN | 0x80);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
801 else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
802 return streamN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
803 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
804
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
805 void vm_get_angle_info(vm_t *vm, int *current, int *num_avail) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
806 *num_avail = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
807 *current = 1;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
808
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
809 if((vm->state).domain == VTS_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
810 title_info_t *title;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
811 /* TTN_REG does not allways point to the correct title.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
812 if((vm->state).TTN_REG > vm->vmgi->tt_srpt->nr_of_srpts)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
813 return;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
814 title = &vm->vmgi->tt_srpt->title[(vm->state).TTN_REG - 1];
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
815 if(title->title_set_nr != (vm->state).vtsN ||
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
816 title->vts_ttn != (vm->state).VTS_TTN_REG)
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
817 return;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
818 *num_avail = title->nr_of_angles;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
819 *current = (vm->state).AGL_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
820 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
821 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
822
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
823 #if 0
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
824 /* currently unused */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
825 void vm_get_audio_info(vm_t *vm, int *current, int *num_avail) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
826 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
827 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
828 *num_avail = vm->vtsi->vtsi_mat->nr_of_vts_audio_streams;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
829 *current = (vm->state).AST_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
830 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
831 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
832 *num_avail = vm->vtsi->vtsi_mat->nr_of_vtsm_audio_streams; /* 1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
833 *current = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
834 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
835 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
836 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
837 *num_avail = vm->vmgi->vmgi_mat->nr_of_vmgm_audio_streams; /* 1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
838 *current = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
839 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
840 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
841 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
842
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
843 /* currently unused */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
844 void vm_get_subp_info(vm_t *vm, int *current, int *num_avail) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
845 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
846 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
847 *num_avail = vm->vtsi->vtsi_mat->nr_of_vts_subp_streams;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
848 *current = (vm->state).SPST_REG;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
849 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
850 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
851 *num_avail = vm->vtsi->vtsi_mat->nr_of_vtsm_subp_streams; /* 1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
852 *current = 0x41;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
853 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
854 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
855 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
856 *num_avail = vm->vmgi->vmgi_mat->nr_of_vmgm_subp_streams; /* 1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
857 *current = 0x41;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
858 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
859 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
860 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
861
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
862 /* currently unused */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
863 void vm_get_video_res(vm_t *vm, int *width, int *height) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
864 video_attr_t attr = vm_get_video_attr(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
865
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
866 if(attr.video_format != 0)
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
867 *height = 576;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
868 else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
869 *height = 480;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
870 switch(attr.picture_size) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
871 case 0:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
872 *width = 720;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
873 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
874 case 1:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
875 *width = 704;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
876 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
877 case 2:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
878 *width = 352;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
879 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
880 case 3:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
881 *width = 352;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
882 *height /= 2;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
883 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
884 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
885 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
886 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
887
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
888 int vm_get_video_aspect(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
889 int aspect = vm_get_video_attr(vm).display_aspect_ratio;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
890
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
891 assert(aspect == 0 || aspect == 3);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
892 (vm->state).registers.SPRM[14] &= ~(0x3 << 10);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
893 (vm->state).registers.SPRM[14] |= aspect << 10;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
894
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
895 return aspect;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
896 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
897
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
898 int vm_get_video_scale_permission(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
899 return vm_get_video_attr(vm).permitted_df;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
900 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
901
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
902 video_attr_t vm_get_video_attr(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
903 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
904 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
905 return vm->vtsi->vtsi_mat->vts_video_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
906 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
907 return vm->vtsi->vtsi_mat->vtsm_video_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
908 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
909 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
910 return vm->vmgi->vmgi_mat->vmgm_video_attr;
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
911 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
912 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
913 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
914 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
915
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
916 audio_attr_t vm_get_audio_attr(vm_t *vm, int streamN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
917 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
918 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
919 return vm->vtsi->vtsi_mat->vts_audio_attr[streamN];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
920 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
921 return vm->vtsi->vtsi_mat->vtsm_audio_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
922 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
923 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
924 return vm->vmgi->vmgi_mat->vmgm_audio_attr;
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
925 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
926 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
927 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
928 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
929
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
930 subp_attr_t vm_get_subp_attr(vm_t *vm, int streamN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
931 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
932 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
933 return vm->vtsi->vtsi_mat->vts_subp_attr[streamN];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
934 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
935 return vm->vtsi->vtsi_mat->vtsm_subp_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
936 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
937 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
938 return vm->vmgi->vmgi_mat->vmgm_subp_attr;
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
939 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
940 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
941 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
942 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
943
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
944
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
945 /* Playback control */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
946
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
947 static link_t play_PGC(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
948 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
949
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
950 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
951 fprintf(MSG_OUT, "libdvdnav: play_PGC:");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
952 if((vm->state).domain != FP_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
953 fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
954 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
955 fprintf(MSG_OUT, " first_play_pgc\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
956 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
957 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
958
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
959 /* This must be set before the pre-commands are executed because they
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
960 * might contain a CallSS that will save resume state */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
961
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
962 /* FIXME: This may be only a temporary fix for something... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
963 (vm->state).pgN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
964 (vm->state).cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
965 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
966
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
967 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
968 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
969 - just play video i.e first PG
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
970 (This is what happens if you fall of the end of the pre_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
971 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
972 if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_pre) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
973 if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds,
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
974 (vm->state).pgc->command_tbl->nr_of_pre,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
975 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
976 /* link_values contains the 'jump' return value */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
977 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
978 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
979 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
980 fprintf(MSG_OUT, "libdvdnav: PGC pre commands didn't do a Jump, Link or Call\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
981 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
982 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
983 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
984 return play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
985 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
986
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
987 static link_t play_PGC_PG(vm_t *vm, int pgN) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
988 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
989
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
990 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
991 fprintf(MSG_OUT, "libdvdnav: play_PGC_PG:");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
992 if((vm->state).domain != FP_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
993 fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
994 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
995 fprintf(MSG_OUT, " first_play_pgc\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
996 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
997 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
998
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
999 /* This must be set before the pre-commands are executed because they
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1000 * might contain a CallSS that will save resume state */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1001
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1002 /* FIXME: This may be only a temporary fix for something... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1003 (vm->state).pgN = pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1004 (vm->state).cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1005 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1006
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1007 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1008 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1009 - just play video i.e first PG
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1010 (This is what happens if you fall of the end of the pre_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1011 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1012 if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_pre) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1013 if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds,
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1014 (vm->state).pgc->command_tbl->nr_of_pre,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1015 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1016 /* link_values contains the 'jump' return value */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1017 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1018 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1019 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1020 fprintf(MSG_OUT, "libdvdnav: PGC pre commands didn't do a Jump, Link or Call\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1021 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1022 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1023 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1024 return play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1025 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1026
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1027 static link_t play_PGC_post(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1028 link_t link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1029
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1030 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1031 fprintf(MSG_OUT, "libdvdnav: play_PGC_post:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1032 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1033
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1034 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1035 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1036 - just go to next PGC
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1037 (This is what happens if you fall of the end of the post_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1038 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1039 if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_post &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1040 vmEval_CMD((vm->state).pgc->command_tbl->post_cmds,
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1041 (vm->state).pgc->command_tbl->nr_of_post,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1042 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1043 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1044 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1045
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1046 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1047 fprintf(MSG_OUT, "libdvdnav: ** Fell of the end of the pgc, continuing in NextPGC\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1048 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1049 /* Should end up in the STOP_DOMAIN if next_pgc is 0. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1050 if(!set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1051 link_values.command = Exit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1052 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1053 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1054 return play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1055 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1056
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1057 static link_t play_PG(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1058 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1059 fprintf(MSG_OUT, "libdvdnav: play_PG: (vm->state).pgN (%i)\n", (vm->state).pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1060 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1061
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1062 assert((vm->state).pgN > 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1063 if((vm->state).pgN > (vm->state).pgc->nr_of_programs) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1064 #ifdef TRACE
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1065 fprintf(MSG_OUT, "libdvdnav: play_PG: (vm->state).pgN (%i) > pgc->nr_of_programs (%i)\n",
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1066 (vm->state).pgN, (vm->state).pgc->nr_of_programs );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1067 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1068 assert((vm->state).pgN == (vm->state).pgc->nr_of_programs + 1);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1069 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1070 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1071
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1072 (vm->state).cellN = (vm->state).pgc->program_map[(vm->state).pgN - 1];
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1073
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1074 return play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1075 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1076
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1077 static link_t play_Cell(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1078 static const link_t play_this = {PlayThis, /* Block in Cell */ 0, 0, 0};
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1079
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1080 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1081 fprintf(MSG_OUT, "libdvdnav: play_Cell: (vm->state).cellN (%i)\n", (vm->state).cellN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1082 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1083
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1084 assert((vm->state).cellN > 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1085 if((vm->state).cellN > (vm->state).pgc->nr_of_cells) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1086 #ifdef TRACE
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1087 fprintf(MSG_OUT, "libdvdnav: (vm->state).cellN (%i) > pgc->nr_of_cells (%i)\n",
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1088 (vm->state).cellN, (vm->state).pgc->nr_of_cells );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1089 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1090 assert((vm->state).cellN == (vm->state).pgc->nr_of_cells + 1);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1091 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1092 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1093
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1094 /* Multi angle/Interleaved */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1095 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1096 case 0: /* Normal */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1097 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1098 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1099 case 1: /* The first cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1100 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1101 case 0: /* Not part of a block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1102 assert(0);
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1103 break;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1104 case 1: /* Angle block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1105 /* Loop and check each cell instead? So we don't get outside the block? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1106 (vm->state).cellN += (vm->state).AGL_REG - 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1107 #ifdef STRICT
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1108 assert((vm->state).cellN <= (vm->state).pgc->nr_of_cells);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1109 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1110 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1111 #else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1112 if (!((vm->state).cellN <= (vm->state).pgc->nr_of_cells) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1113 !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1114 !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1115 fprintf(MSG_OUT, "libdvdnav: Invalid angle block\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1116 (vm->state).cellN -= (vm->state).AGL_REG - 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1117 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1118 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1119 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1120 case 2: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1121 case 3: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1122 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1123 fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1124 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1125 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1126 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1127 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1128 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1129 case 2: /* Cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1130 case 3: /* Last cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1131 /* These might perhaps happen for RSM or LinkC commands? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1132 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1133 fprintf(MSG_OUT, "libdvdnav: Cell is in block but did not enter at first cell!\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1134 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1135
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1136 /* Updates (vm->state).pgN and PTTN_REG */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1137 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1138 /* Should not happen */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1139 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1140 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1141 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1142 (vm->state).cell_restart++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1143 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1144 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1145 fprintf(MSG_OUT, "libdvdnav: Cell should restart here\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1146 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1147 return play_this;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1148 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1149
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1150 static link_t play_Cell_post(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1151 cell_playback_t *cell;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1152
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1153 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1154 fprintf(MSG_OUT, "libdvdnav: play_Cell_post: (vm->state).cellN (%i)\n", (vm->state).cellN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1155 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1156
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1157 cell = &(vm->state).pgc->cell_playback[(vm->state).cellN - 1];
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1158
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1159 /* Still time is already taken care of before we get called. */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1160
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1161 /* Deal with a Cell command, if any */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1162 if(cell->cell_cmd_nr != 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1163 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1164
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1165 /* These asserts are now not needed.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1166 * Some DVDs have no cell commands listed in the PGC,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1167 * but the Cell itself points to a cell command that does not exist.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1168 * For this situation, just ignore the cell command and continue.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1169 *
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1170 * assert((vm->state).pgc->command_tbl != NULL);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1171 * assert((vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1172 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1173
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1174 if ((vm->state).pgc->command_tbl != NULL &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1175 (vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1176 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1177 fprintf(MSG_OUT, "libdvdnav: Cell command present, executing\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1178 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1179 if(vmEval_CMD(&(vm->state).pgc->command_tbl->cell_cmds[cell->cell_cmd_nr - 1], 1,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1180 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1181 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1182 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1183 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1184 fprintf(MSG_OUT, "libdvdnav: Cell command didn't do a Jump, Link or Call\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1185 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1186 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1187 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1188 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1189 fprintf(MSG_OUT, "libdvdnav: Invalid Cell command\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1190 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1191 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1192 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1193
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1194 /* Where to continue after playing the cell... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1195 /* Multi angle/Interleaved */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1196 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1197 case 0: /* Normal */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1198 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1199 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1200 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1201 case 1: /* The first cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1202 case 2: /* A cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1203 case 3: /* The last cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1204 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1205 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1206 case 0: /* Not part of a block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1207 assert(0);
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1208 break;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1209 case 1: /* Angle block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1210 /* Skip the 'other' angles */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1211 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1212 while((vm->state).cellN <= (vm->state).pgc->nr_of_cells &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1213 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode >= 2) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1214 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1215 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1216 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1217 case 2: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1218 case 3: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1219 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1220 fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1221 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1222 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1223 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1224 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1225 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1226 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1227
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1228 /* Figure out the correct pgN for the new cell */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1229 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1230 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1231 fprintf(MSG_OUT, "libdvdnav: last cell in this PGC\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1232 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1233 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1234 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1235 return play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1236 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1237
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1238
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1239 /* link processing */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1240
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1241 static int process_command(vm_t *vm, link_t link_values) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1242
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1243 while(link_values.command != PlayThis) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1244
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1245 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1246 fprintf(MSG_OUT, "libdvdnav: Before printout starts:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1247 vm_print_link(link_values);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1248 fprintf(MSG_OUT, "libdvdnav: Link values %i %i %i %i\n", link_values.command,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1249 link_values.data1, link_values.data2, link_values.data3);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1250 vm_print_current_domain_state(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1251 fprintf(MSG_OUT, "libdvdnav: Before printout ends.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1252 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1253
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1254 switch(link_values.command) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1255 case LinkNoLink:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1256 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1257 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1258 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1259 return 0; /* no actual jump */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1260
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1261 case LinkTopC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1262 /* Restart playing from the beginning of the current Cell. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1263 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1264 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1265 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1266 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1267 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1268 case LinkNextC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1269 /* Link to Next Cell */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1270 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1271 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1272 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1273 (vm->state).cellN += 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1274 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1275 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1276 case LinkPrevC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1277 /* Link to Previous Cell */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1278 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1279 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1280 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1281 assert((vm->state).cellN > 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1282 (vm->state).cellN -= 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1283 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1284 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1285
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1286 case LinkTopPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1287 /* Link to Top of current Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1288 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1289 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1290 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1291 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1292 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1293 case LinkNextPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1294 /* Link to Next Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1295 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1296 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1297 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1298 (vm->state).pgN += 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1299 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1300 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1301 case LinkPrevPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1302 /* Link to Previous Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1303 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1304 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1305 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1306 assert((vm->state).pgN > 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1307 (vm->state).pgN -= 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1308 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1309 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1310
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1311 case LinkTopPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1312 /* Restart playing from beginning of current Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1313 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1314 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1315 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1316 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1317 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1318 case LinkNextPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1319 /* Link to Next Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1320 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1321 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1322 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1323 assert((vm->state).pgc->next_pgc_nr != 0);
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1324 if(set_PGCN(vm, (vm->state).pgc->next_pgc_nr))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1325 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1326 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1327 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1328 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1329 case LinkPrevPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1330 /* Link to Previous Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1331 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1332 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1333 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1334 assert((vm->state).pgc->prev_pgc_nr != 0);
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1335 if(set_PGCN(vm, (vm->state).pgc->prev_pgc_nr))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1336 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1337 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1338 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1339 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1340 case LinkGoUpPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1341 /* Link to GoUp Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1342 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1343 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1344 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1345 assert((vm->state).pgc->goup_pgc_nr != 0);
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1346 if(set_PGCN(vm, (vm->state).pgc->goup_pgc_nr))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1347 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1348 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1349 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1350 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1351 case LinkTailPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1352 /* Link to Tail of Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1353 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1354 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1355 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1356 link_values = play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1357 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1358
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1359 case LinkRSM:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1360 {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1361 /* Link to Resume point */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1362 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1363
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1364 /* Check and see if there is any rsm info!! */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1365 if (!(vm->state).rsm_vtsN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1366 fprintf(MSG_OUT, "libdvdnav: trying to resume without any resume info set\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1367 link_values.command = Exit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1368 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1369 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1370
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1371 (vm->state).domain = VTS_DOMAIN;
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1372 if (!ifoOpenNewVTSI(vm, vm->dvd, (vm->state).rsm_vtsN))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1373 assert(0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1374 set_PGCN(vm, (vm->state).rsm_pgcN);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1375
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1376 /* These should never be set in SystemSpace and/or MenuSpace */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1377 /* (vm->state).TTN_REG = rsm_tt; ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1378 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1379 for(i = 0; i < 5; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1380 (vm->state).registers.SPRM[4 + i] = (vm->state).rsm_regs[i];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1381 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1382
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1383 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1384 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1385
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1386 if((vm->state).rsm_cellN == 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1387 assert((vm->state).cellN); /* Checking if this ever happens */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1388 (vm->state).pgN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1389 link_values = play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1390 } else {
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1391 /* (vm->state).pgN = ?? this gets the right value in set_PGN() below */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1392 (vm->state).cellN = (vm->state).rsm_cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1393 link_values.command = PlayThis;
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1394 link_values.data1 = (vm->state).rsm_blockN & 0xffff;
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1395 link_values.data2 = (vm->state).rsm_blockN >> 16;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1396 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1397 /* Were at the end of the PGC, should not happen for a RSM */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1398 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1399 link_values.command = LinkTailPGC;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1400 link_values.data1 = 0; /* No button */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1401 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1402 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1403 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1404 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1405 case LinkPGCN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1406 /* Link to Program Chain Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1407 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1408 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1409 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1410 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1411 case LinkPTTN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1412 /* Link to Part of current Title Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1413 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1414 /* PGC Pre-Commands are not executed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1415 assert((vm->state).domain == VTS_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1416 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1417 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1418 if(!set_VTS_PTT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1419 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1420 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1421 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1422 case LinkPGN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1423 /* Link to Program Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1424 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1425 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1426 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1427 /* Update any other state, PTTN perhaps? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1428 (vm->state).pgN = link_values.data1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1429 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1430 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1431 case LinkCN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1432 /* Link to Cell Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1433 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1434 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1435 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1436 /* Update any other state, pgN, PTTN perhaps? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1437 (vm->state).cellN = link_values.data1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1438 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1439 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1440
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1441 case Exit:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1442 vm->stopped = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1443 return 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1444
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1445 case JumpTT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1446 /* Jump to VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1447 /* Only allowed from the First Play domain(PGC) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1448 /* or the Video Manager domain (VMG) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1449 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1450 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1451 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1452 if(set_TT(vm, link_values.data1))
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1453 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1454 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1455 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1456 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1457 case JumpVTS_TT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1458 /* Jump to Title:data1 in same VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1459 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1460 /* or the Video Title Set Domain(VTS) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1461 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1462 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1463 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1464 if(!set_VTS_TT(vm, (vm->state).vtsN, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1465 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1466 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1467 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1468 case JumpVTS_PTT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1469 /* Jump to Part:data2 of Title:data1 in same VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1470 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1471 /* or the Video Title Set Domain(VTS) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1472 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1473 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1474 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1475 if(!set_VTS_PTT(vm, (vm->state).vtsN, link_values.data1, link_values.data2))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1476 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1477 link_values = play_PGC_PG(vm, (vm->state).pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1478 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1479
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1480 case JumpSS_FP:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1481 /* Jump to First Play Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1482 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1483 /* or the Video Manager domain (VMG) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1484 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1485 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == VTSM_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1486 if (!set_FP_PGC(vm))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1487 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1488 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1489 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1490 case JumpSS_VMGM_MENU:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1491 /* Jump to Video Manger domain - Title Menu:data1 or any PGC in VMG */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1492 /* Allowed from anywhere except the VTS Title domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1493 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1494 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1495 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1496 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1497 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1498 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1499 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1500 case JumpSS_VTSM:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1501 /* Jump to a menu in Video Title domain, */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1502 /* or to a Menu is the current VTS */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1503 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1504 /* ifoOpenNewVTSI:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1505 /* VTS_TTN_REG:data2 */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1506 /* get_MENU:data3 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1507 if(link_values.data1 != 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1508 if (link_values.data1 != (vm->state).vtsN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1509 /* the normal case */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1510 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1511 (vm->state).domain = VTSM_DOMAIN;
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1512 if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1513 assert(0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1514 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1515 /* This happens on some discs like "Captain Scarlet & the Mysterons" or
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1516 * the German RC2 of "Anatomie" in VTSM. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1517 assert((vm->state).domain == VTSM_DOMAIN ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1518 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1519 (vm->state).domain = VTSM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1520 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1521 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1522 /* This happens on 'The Fifth Element' region 2. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1523 assert((vm->state).domain == VTSM_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1524 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1525 /* I don't know what title is supposed to be used for. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1526 /* Alien or Aliens has this != 1, I think. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1527 /* assert(link_values.data2 == 1); */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1528 (vm->state).VTS_TTN_REG = link_values.data2;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1529 /* TTN_REG (SPRM4), VTS_TTN_REG (SPRM5), TT_PGCN_REG (SPRM6) are linked, */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1530 /* so if one changes, the others must change to match it. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1531 (vm->state).TTN_REG = get_TT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1532 if(!set_MENU(vm, link_values.data3))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1533 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1534 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1535 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1536 case JumpSS_VMGM_PGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1537 /* set_PGCN:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1538 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1539 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1540 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1541 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1542 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1543 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1544 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1545
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1546 case CallSS_FP:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1547 /* set_RSMinfo:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1548 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1549 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1550 set_RSMinfo(vm, link_values.data1, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1551 set_FP_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1552 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1553 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1554 case CallSS_VMGM_MENU:
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1555 /* set_MENU:data1 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1556 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1557 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1558 /* Must be called before domain is changed */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1559 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1560 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1561 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1562 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1563 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1564 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1565 case CallSS_VTSM:
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1566 /* set_MENU:data1 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1567 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1568 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1569 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1570 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1571 (vm->state).domain = VTSM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1572 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1573 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1574 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1575 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1576 case CallSS_VMGM_PGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1577 /* set_PGC:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1578 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1579 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1580 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1581 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1582 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1583 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1584 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1585 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1586 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1587 case PlayThis:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1588 /* Should never happen. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1589 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1590 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1591 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1592
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1593 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1594 fprintf(MSG_OUT, "libdvdnav: After printout starts:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1595 vm_print_current_domain_state(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1596 fprintf(MSG_OUT, "libdvdnav: After printout ends.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1597 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1598
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1599 }
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1600 (vm->state).blockN = link_values.data1 | (link_values.data2 << 16);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1601 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1602 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1603
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1604
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1605 /* Set functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1606
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1607 static int set_TT(vm_t *vm, int tt) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1608 return set_PTT(vm, tt, 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1609 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1610
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1611 static int set_PTT(vm_t *vm, int tt, int ptt) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1612 assert(tt <= vm->vmgi->tt_srpt->nr_of_srpts);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1613 return set_VTS_PTT(vm, vm->vmgi->tt_srpt->title[tt - 1].title_set_nr,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1614 vm->vmgi->tt_srpt->title[tt - 1].vts_ttn, ptt);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1615 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1616
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1617 static int set_VTS_TT(vm_t *vm, int vtsN, int vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1618 return set_VTS_PTT(vm, vtsN, vts_ttn, 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1619 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1620
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1621 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1622 int pgcN, pgN, res;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1623
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1624 (vm->state).domain = VTS_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1625
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1626 if (vtsN != (vm->state).vtsN)
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1627 if (!ifoOpenNewVTSI(vm, vm->dvd, vtsN)) /* Also sets (vm->state).vtsN */
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1628 return 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1629
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1630 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1631 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1632 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1633 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1634
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1635 pgcN = vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].ptt[part - 1].pgcn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1636 pgN = vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].ptt[part - 1].pgn;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1637
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1638 (vm->state).TT_PGCN_REG = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1639 (vm->state).PTTN_REG = part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1640 (vm->state).TTN_REG = get_TT(vm, vtsN, vts_ttn);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1641 assert( (vm->state.TTN_REG) != 0 );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1642 (vm->state).VTS_TTN_REG = vts_ttn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1643 (vm->state).vtsN = vtsN; /* Not sure about this one. We can get to it easily from TTN_REG */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1644 /* Any other registers? */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1645
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1646 res = set_PGCN(vm, pgcN); /* This clobber's state.pgN (sets it to 1), but we don't want clobbering here. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1647 (vm->state).pgN = pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1648 return res;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1649 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1650
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1651 static int set_FP_PGC(vm_t *vm) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1652 (vm->state).domain = FP_DOMAIN;
254
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1653 if (!vm->vmgi->first_play_pgc) {
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1654 return set_PGCN(vm, 1);
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1655 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1656 (vm->state).pgc = vm->vmgi->first_play_pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1657 (vm->state).pgcN = vm->vmgi->vmgi_mat->first_play_pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1658 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1659 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1660
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1661
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1662 static int set_MENU(vm_t *vm, int menu) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1663 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == VTSM_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1664 return set_PGCN(vm, get_ID(vm, menu));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1665 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1666
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1667 static int set_PGCN(vm_t *vm, int pgcN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1668 pgcit_t *pgcit;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1669
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1670 pgcit = get_PGCIT(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1671 assert(pgcit != NULL); /* ?? Make this return -1 instead */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1672
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1673 if(pgcN < 1 || pgcN > pgcit->nr_of_pgci_srp) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1674 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1675 fprintf(MSG_OUT, "libdvdnav: ** No such pgcN = %d\n", pgcN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1676 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1677 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1678 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1679
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1680 (vm->state).pgc = pgcit->pgci_srp[pgcN - 1].pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1681 (vm->state).pgcN = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1682 (vm->state).pgN = 1;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1683
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1684 if((vm->state).domain == VTS_DOMAIN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1685 (vm->state).TT_PGCN_REG = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1686
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1687 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1688 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1689
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1690 /* Figure out the correct pgN from the cell and update (vm->state). */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1691 static int set_PGN(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1692 int new_pgN = 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1693
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1694 while(new_pgN < (vm->state).pgc->nr_of_programs
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1695 && (vm->state).cellN >= (vm->state).pgc->program_map[new_pgN])
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1696 new_pgN++;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1697
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1698 if(new_pgN == (vm->state).pgc->nr_of_programs) /* We are at the last program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1699 if((vm->state).cellN > (vm->state).pgc->nr_of_cells)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1700 return 0; /* We are past the last cell */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1701
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1702 (vm->state).pgN = new_pgN;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1703
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1704 if((vm->state).domain == VTS_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1705 playback_type_t *pb_ty;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1706 if((vm->state).TTN_REG > vm->vmgi->tt_srpt->nr_of_srpts)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1707 return 0; /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1708 pb_ty = &vm->vmgi->tt_srpt->title[(vm->state).TTN_REG - 1].pb_ty;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1709 if(pb_ty->multi_or_random_pgc_title == /* One_Sequential_PGC_Title */ 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1710 int dummy, part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1711 vm_get_current_title_part(vm, &dummy, &part);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1712 (vm->state).PTTN_REG = part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1713 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1714 /* FIXME: Handle RANDOM or SHUFFLE titles. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1715 fprintf(MSG_OUT, "libdvdnav: RANDOM or SHUFFLE titles are NOT handled yet.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1716 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1717 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1718 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1719 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1720
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1721 /* Must be called before domain is changed (set_PGCN()) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1722 static void set_RSMinfo(vm_t *vm, int cellN, int blockN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1723 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1724
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1725 if(cellN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1726 (vm->state).rsm_cellN = cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1727 (vm->state).rsm_blockN = blockN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1728 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1729 (vm->state).rsm_cellN = (vm->state).cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1730 (vm->state).rsm_blockN = blockN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1731 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1732 (vm->state).rsm_vtsN = (vm->state).vtsN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1733 (vm->state).rsm_pgcN = get_PGCN(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1734
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1735 /* assert((vm->state).rsm_pgcN == (vm->state).TT_PGCN_REG); for VTS_DOMAIN */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1736
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1737 for(i = 0; i < 5; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1738 (vm->state).rsm_regs[i] = (vm->state).registers.SPRM[4 + i];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1739 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1740 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1741
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1742
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1743 /* Get functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1744
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1745 /* Searches the TT tables, to find the current TT.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1746 * returns the current TT.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1747 * returns 0 if not found.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1748 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1749 static int get_TT(vm_t *vm, int vtsN, int vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1750 int i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1751 int tt=0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1752
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1753 for(i = 1; i <= vm->vmgi->tt_srpt->nr_of_srpts; i++) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1754 if( vm->vmgi->tt_srpt->title[i - 1].title_set_nr == vtsN &&
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1755 vm->vmgi->tt_srpt->title[i - 1].vts_ttn == vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1756 tt=i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1757 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1758 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1759 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1760 return tt;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1761 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1762
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1763 /* Search for entry_id match of the PGC Category in the current VTS PGCIT table.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1764 * Return pgcN based on entry_id match.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1765 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1766 static int get_ID(vm_t *vm, int id) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1767 int pgcN, i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1768 pgcit_t *pgcit;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1769
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1770 /* Relies on state to get the correct pgcit. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1771 pgcit = get_PGCIT(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1772 assert(pgcit != NULL);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1773 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1774 fprintf(MSG_OUT, "libdvdnav: ** Searching for menu (0x%x) entry PGC\n", id);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1775 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1776
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1777 /* Force high bit set. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1778 id |=0x80;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1779
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1780 /* Get menu/title */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1781 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1782 if( (pgcit->pgci_srp[i].entry_id) == id) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1783 pgcN = i + 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1784 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1785 fprintf(MSG_OUT, "libdvdnav: Found menu.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1786 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1787 return pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1788 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1789 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1790 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1791 fprintf(MSG_OUT, "libdvdnav: ** No such id/menu (0x%02x) entry PGC\n", id & 0x7f);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1792 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1793 if ( (pgcit->pgci_srp[i].entry_id & 0x80) == 0x80) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1794 fprintf(MSG_OUT, "libdvdnav: Available menus: 0x%x\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1795 pgcit->pgci_srp[i].entry_id & 0x7f);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1796 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1797 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1798 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1799 return 0; /* error */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1800 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1801
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1802 /* FIXME: we have a pgcN member in the vm's state now, so this should be obsolete */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1803 static int get_PGCN(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1804 pgcit_t *pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1805 int pgcN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1806
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1807 pgcit = get_PGCIT(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1808
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1809 if (pgcit) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1810 while(pgcN <= pgcit->nr_of_pgci_srp) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1811 if(pgcit->pgci_srp[pgcN - 1].pgc == (vm->state).pgc) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1812 assert((vm->state).pgcN == pgcN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1813 return pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1814 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1815 pgcN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1816 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1817 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1818 fprintf(MSG_OUT, "libdvdnav: get_PGCN failed. Was trying to find pgcN in domain %d\n",
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1819 (vm->state).domain);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1820 return 0; /* error */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1821 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1822
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1823 static pgcit_t* get_MENU_PGCIT(vm_t *vm, ifo_handle_t *h, uint16_t lang) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1824 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1825
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1826 if(h == NULL || h->pgci_ut == NULL) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1827 fprintf(MSG_OUT, "libdvdnav: *** pgci_ut handle is NULL ***\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1828 return NULL; /* error? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1829 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1830
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1831 i = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1832 while(i < h->pgci_ut->nr_of_lus
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1833 && h->pgci_ut->lu[i].lang_code != lang)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1834 i++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1835 if(i == h->pgci_ut->nr_of_lus) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1836 fprintf(MSG_OUT, "libdvdnav: Language '%c%c' not found, using '%c%c' instead\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1837 (char)(lang >> 8), (char)(lang & 0xff),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1838 (char)(h->pgci_ut->lu[0].lang_code >> 8),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1839 (char)(h->pgci_ut->lu[0].lang_code & 0xff));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1840 fprintf(MSG_OUT, "libdvdnav: Menu Languages available: ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1841 for(i = 0; i < h->pgci_ut->nr_of_lus; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1842 fprintf(MSG_OUT, "%c%c ",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1843 (char)(h->pgci_ut->lu[i].lang_code >> 8),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1844 (char)(h->pgci_ut->lu[i].lang_code & 0xff));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1845 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1846 fprintf(MSG_OUT, "\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1847 i = 0; /* error? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1848 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1849
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1850 return h->pgci_ut->lu[i].pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1851 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1852
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1853 /* Uses state to decide what to return */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1854 static pgcit_t* get_PGCIT(vm_t *vm) {
344
fb2fbd4cfbf6 in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents: 332
diff changeset
1855 pgcit_t *pgcit = NULL;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1856
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1857 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1858 case VTS_DOMAIN:
344
fb2fbd4cfbf6 in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents: 332
diff changeset
1859 if(!vm->vtsi) return NULL;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1860 pgcit = vm->vtsi->vts_pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1861 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1862 case VTSM_DOMAIN:
344
fb2fbd4cfbf6 in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents: 332
diff changeset
1863 if(!vm->vtsi) return NULL;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1864 pgcit = get_MENU_PGCIT(vm, vm->vtsi, (vm->state).registers.SPRM[0]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1865 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1866 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1867 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1868 pgcit = get_MENU_PGCIT(vm, vm->vmgi, (vm->state).registers.SPRM[0]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1869 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1870 default:
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1871 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1872 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1873
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1874 return pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1875 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1876
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1877 //return the ifo_handle_t describing required title, used to
312
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1878 //identify chapters
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1879 ifo_handle_t *vm_get_title_ifo(vm_t *vm, uint32_t title)
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1880 {
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1881 ifo_handle_t *ifo = NULL;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1882 uint8_t titleset_nr;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1883 if((title < 1) || (title > vm->vmgi->tt_srpt->nr_of_srpts))
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1884 return NULL;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1885 titleset_nr = vm->vmgi->tt_srpt->title[title-1].title_set_nr;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1886 ifo = ifoOpen(vm->dvd, titleset_nr);
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1887 return ifo;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1888 }
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1889
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1890 void vm_ifo_close(ifo_handle_t *ifo)
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1891 {
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1892 ifoClose(ifo);
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1893 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1894
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1895 /* Debug functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1896
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1897 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1898 void vm_position_print(vm_t *vm, vm_position_t *position) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1899 fprintf(MSG_OUT, "libdvdnav: But=%x Spu=%x Aud=%x Ang=%x Hop=%x vts=%x dom=%x cell=%x cell_restart=%x cell_start=%x still=%x block=%x\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1900 position->button,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1901 position->spu_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1902 position->audio_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1903 position->angle_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1904 position->hop_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1905 position->vts,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1906 position->domain,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1907 position->cell,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1908 position->cell_restart,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1909 position->cell_start,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1910 position->still,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1911 position->block);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1912 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1913 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1914