annotate vm/vm.c @ 404:d16ee5945580 src

Prevent display of garbage volume label when the file being scanned is not a dvd. This is a simple movement of the code that logs the volume name to after the point that some basic validation of the disc has been performed. Patch by John Stebbins of Handbrake
author nicodvb
date Tue, 01 Jun 2010 10:01:33 +0000
parents 1ce807c12563
children 7923e813ec61
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 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
361 vm->vmgi = ifoOpenVMGI(vm->dvd);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
362 if(!vm->vmgi) {
260
97ad00b13609 fixing typos noticed by Jeff Smith
mroi
parents: 256
diff changeset
363 fprintf(MSG_OUT, "libdvdnav: vm: failed to read VIDEO_TS.IFO\n");
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
364 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
365 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
366 if(!ifoRead_FP_PGC(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
367 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_FP_PGC failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
368 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
369 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
370 if(!ifoRead_TT_SRPT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
371 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_TT_SRPT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
372 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
373 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
374 if(!ifoRead_PGCI_UT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
375 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_PGCI_UT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
376 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
377 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
378 if(!ifoRead_PTL_MAIT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
379 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_PTL_MAIT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
380 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
381 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
382 if(!ifoRead_VTS_ATRT(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
383 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_VTS_ATRT failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
384 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
385 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
386 if(!ifoRead_VOBU_ADMAP(vm->vmgi)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
387 fprintf(MSG_OUT, "libdvdnav: vm: ifoRead_VOBU_ADMAP vgmi failed\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
388 /* return 0; Not really used for now.. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
389 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
390 /* ifoRead_TXTDT_MGI(vmgi); Not implemented yet */
404
d16ee5945580 Prevent display of garbage volume label when the file being scanned is
nicodvb
parents: 403
diff changeset
391 dvd_read_name(vm->dvd_name, vm->dvd_serial, dvdroot);
d16ee5945580 Prevent display of garbage volume label when the file being scanned is
nicodvb
parents: 403
diff changeset
392 vm->map = remap_loadmap(vm->dvd_name);
225
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 }
401
390fbf2a9602 Provide a way to retrieve video resolution.
rathann
parents: 400
diff changeset
861 #endif
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
862
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
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
887 int vm_get_video_aspect(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
888 int aspect = vm_get_video_attr(vm).display_aspect_ratio;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
889
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
890 assert(aspect == 0 || aspect == 3);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
891 (vm->state).registers.SPRM[14] &= ~(0x3 << 10);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
892 (vm->state).registers.SPRM[14] |= aspect << 10;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
893
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
894 return aspect;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
895 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
896
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
897 int vm_get_video_scale_permission(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
898 return vm_get_video_attr(vm).permitted_df;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
899 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
900
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
901 video_attr_t vm_get_video_attr(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
902 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
903 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
904 return vm->vtsi->vtsi_mat->vts_video_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
905 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
906 return vm->vtsi->vtsi_mat->vtsm_video_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
907 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
908 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
909 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
910 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
911 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
912 }
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 audio_attr_t vm_get_audio_attr(vm_t *vm, int streamN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
916 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
917 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
918 return vm->vtsi->vtsi_mat->vts_audio_attr[streamN];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
919 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
920 return vm->vtsi->vtsi_mat->vtsm_audio_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
921 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
922 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
923 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
924 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
925 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
926 }
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 subp_attr_t vm_get_subp_attr(vm_t *vm, int streamN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
930 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
931 case VTS_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
932 return vm->vtsi->vtsi_mat->vts_subp_attr[streamN];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
933 case VTSM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
934 return vm->vtsi->vtsi_mat->vtsm_subp_attr;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
935 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
936 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
937 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
938 default:
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
939 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
940 }
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 /* Playback control */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
945
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
946 static link_t play_PGC(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
947 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
948
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
949 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
950 fprintf(MSG_OUT, "libdvdnav: play_PGC:");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
951 if((vm->state).domain != FP_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
952 fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
953 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
954 fprintf(MSG_OUT, " first_play_pgc\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
955 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
956 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
957
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
958 /* This must be set before the pre-commands are executed because they
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
959 * might contain a CallSS that will save resume state */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
960
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
961 /* FIXME: This may be only a temporary fix for something... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
962 (vm->state).pgN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
963 (vm->state).cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
964 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
965
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
966 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
967 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
968 - just play video i.e first PG
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
969 (This is what happens if you fall of the end of the pre_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
970 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
971 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
972 if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds,
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
973 (vm->state).pgc->command_tbl->nr_of_pre,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
974 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
975 /* link_values contains the 'jump' return value */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
976 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
977 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
978 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
979 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
980 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
981 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
982 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
983 return play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
984 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
985
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
986 static link_t play_PGC_PG(vm_t *vm, int pgN) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
987 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
988
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
989 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
990 fprintf(MSG_OUT, "libdvdnav: play_PGC_PG:");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
991 if((vm->state).domain != FP_DOMAIN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
992 fprintf(MSG_OUT, " (vm->state).pgcN (%i)\n", get_PGCN(vm));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
993 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
994 fprintf(MSG_OUT, " first_play_pgc\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
995 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
996 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
997
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
998 /* This must be set before the pre-commands are executed because they
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
999 * might contain a CallSS that will save resume state */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1000
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1001 /* FIXME: This may be only a temporary fix for something... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1002 (vm->state).pgN = pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1003 (vm->state).cellN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1004 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1005
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1006 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1007 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1008 - just play video i.e first PG
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1009 (This is what happens if you fall of the end of the pre_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1010 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1011 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
1012 if(vmEval_CMD((vm->state).pgc->command_tbl->pre_cmds,
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1013 (vm->state).pgc->command_tbl->nr_of_pre,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1014 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1015 /* link_values contains the 'jump' return value */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1016 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1017 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1018 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1019 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
1020 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1021 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1022 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1023 return play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1024 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1025
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1026 static link_t play_PGC_post(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1027 link_t link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1028
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1029 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1030 fprintf(MSG_OUT, "libdvdnav: play_PGC_post:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1031 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1032
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1033 /* eval -> updates the state and returns either
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1034 - some kind of jump (Jump(TT/SS/VTS_TTN/CallSS/link C/PG/PGC/PTTN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1035 - just go to next PGC
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1036 (This is what happens if you fall of the end of the post_cmds)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1037 - or an error (are there more cases?) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1038 if((vm->state).pgc->command_tbl && (vm->state).pgc->command_tbl->nr_of_post &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1039 vmEval_CMD((vm->state).pgc->command_tbl->post_cmds,
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1040 (vm->state).pgc->command_tbl->nr_of_post,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1041 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1042 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1043 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1044
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1045 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1046 fprintf(MSG_OUT, "libdvdnav: ** Fell of the end of the pgc, continuing in NextPGC\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1047 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1048 /* Should end up in the STOP_DOMAIN if next_pgc is 0. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1049 if(!set_PGCN(vm, (vm->state).pgc->next_pgc_nr)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1050 link_values.command = Exit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1051 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1052 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1053 return play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1054 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1055
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1056 static link_t play_PG(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1057 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1058 fprintf(MSG_OUT, "libdvdnav: play_PG: (vm->state).pgN (%i)\n", (vm->state).pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1059 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1060
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1061 assert((vm->state).pgN > 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1062 if((vm->state).pgN > (vm->state).pgc->nr_of_programs) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1063 #ifdef TRACE
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1064 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
1065 (vm->state).pgN, (vm->state).pgc->nr_of_programs );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1066 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1067 assert((vm->state).pgN == (vm->state).pgc->nr_of_programs + 1);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1068 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1069 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1070
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1071 (vm->state).cellN = (vm->state).pgc->program_map[(vm->state).pgN - 1];
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1072
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1073 return play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1074 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1075
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1076 static link_t play_Cell(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1077 static const link_t play_this = {PlayThis, /* Block in Cell */ 0, 0, 0};
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1078
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1079 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1080 fprintf(MSG_OUT, "libdvdnav: play_Cell: (vm->state).cellN (%i)\n", (vm->state).cellN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1081 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1082
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1083 assert((vm->state).cellN > 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1084 if((vm->state).cellN > (vm->state).pgc->nr_of_cells) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1085 #ifdef TRACE
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1086 fprintf(MSG_OUT, "libdvdnav: (vm->state).cellN (%i) > pgc->nr_of_cells (%i)\n",
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1087 (vm->state).cellN, (vm->state).pgc->nr_of_cells );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1088 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1089 assert((vm->state).cellN == (vm->state).pgc->nr_of_cells + 1);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1090 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1091 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1092
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1093 /* Multi angle/Interleaved */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1094 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1095 case 0: /* Normal */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1096 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1097 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1098 case 1: /* The first cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1099 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1100 case 0: /* Not part of a block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1101 assert(0);
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1102 break;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1103 case 1: /* Angle block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1104 /* Loop and check each cell instead? So we don't get outside the block? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1105 (vm->state).cellN += (vm->state).AGL_REG - 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1106 #ifdef STRICT
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1107 assert((vm->state).cellN <= (vm->state).pgc->nr_of_cells);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1108 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1109 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1110 #else
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1111 if (!((vm->state).cellN <= (vm->state).pgc->nr_of_cells) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1112 !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode != 0) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1113 !((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 1)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1114 fprintf(MSG_OUT, "libdvdnav: Invalid angle block\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1115 (vm->state).cellN -= (vm->state).AGL_REG - 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1116 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1117 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1118 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1119 case 2: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1120 case 3: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1121 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1122 fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1123 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1124 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1125 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1126 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1127 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1128 case 2: /* Cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1129 case 3: /* Last cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1130 /* These might perhaps happen for RSM or LinkC commands? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1131 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1132 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
1133 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1134
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1135 /* Updates (vm->state).pgN and PTTN_REG */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1136 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1137 /* Should not happen */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1138 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1139 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1140 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1141 (vm->state).cell_restart++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1142 (vm->state).blockN = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1143 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1144 fprintf(MSG_OUT, "libdvdnav: Cell should restart here\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1145 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1146 return play_this;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1147 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1148
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1149 static link_t play_Cell_post(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1150 cell_playback_t *cell;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1151
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1152 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1153 fprintf(MSG_OUT, "libdvdnav: play_Cell_post: (vm->state).cellN (%i)\n", (vm->state).cellN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1154 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1155
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1156 cell = &(vm->state).pgc->cell_playback[(vm->state).cellN - 1];
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1157
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1158 /* Still time is already taken care of before we get called. */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1159
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1160 /* Deal with a Cell command, if any */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1161 if(cell->cell_cmd_nr != 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1162 link_t link_values;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1163
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1164 /* These asserts are now not needed.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1165 * Some DVDs have no cell commands listed in the PGC,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1166 * but the Cell itself points to a cell command that does not exist.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1167 * For this situation, just ignore the cell command and continue.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1168 *
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1169 * assert((vm->state).pgc->command_tbl != NULL);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1170 * assert((vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1171 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1172
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1173 if ((vm->state).pgc->command_tbl != NULL &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1174 (vm->state).pgc->command_tbl->nr_of_cell >= cell->cell_cmd_nr) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1175 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1176 fprintf(MSG_OUT, "libdvdnav: Cell command present, executing\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1177 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1178 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
1179 &(vm->state).registers, &link_values)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1180 return link_values;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1181 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1182 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1183 fprintf(MSG_OUT, "libdvdnav: Cell command didn't do a Jump, Link or Call\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1184 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1185 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1186 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1187 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1188 fprintf(MSG_OUT, "libdvdnav: Invalid Cell command\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1189 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1190 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1191 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1192
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1193 /* Where to continue after playing the cell... */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1194 /* Multi angle/Interleaved */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1195 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1196 case 0: /* Normal */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1197 assert((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type == 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1198 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1199 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1200 case 1: /* The first cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1201 case 2: /* A cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1202 case 3: /* The last cell in the block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1203 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1204 switch((vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1205 case 0: /* Not part of a block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1206 assert(0);
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1207 break;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1208 case 1: /* Angle block */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1209 /* Skip the 'other' angles */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1210 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1211 while((vm->state).cellN <= (vm->state).pgc->nr_of_cells &&
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1212 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode >= 2) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1213 (vm->state).cellN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1214 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1215 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1216 case 2: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1217 case 3: /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1218 default:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1219 fprintf(MSG_OUT, "libdvdnav: Invalid? Cell block_mode (%d), block_type (%d)\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1220 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_mode,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1221 (vm->state).pgc->cell_playback[(vm->state).cellN - 1].block_type);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1222 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1223 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1224 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1225 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1226
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1227 /* Figure out the correct pgN for the new cell */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1228 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1229 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1230 fprintf(MSG_OUT, "libdvdnav: last cell in this PGC\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1231 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1232 return play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1233 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1234 return play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1235 }
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 /* link processing */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1239
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1240 static int process_command(vm_t *vm, link_t link_values) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1241
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1242 while(link_values.command != PlayThis) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1243
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1244 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1245 fprintf(MSG_OUT, "libdvdnav: Before printout starts:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1246 vm_print_link(link_values);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1247 fprintf(MSG_OUT, "libdvdnav: Link values %i %i %i %i\n", link_values.command,
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1248 link_values.data1, link_values.data2, link_values.data3);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1249 vm_print_current_domain_state(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1250 fprintf(MSG_OUT, "libdvdnav: Before printout ends.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1251 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1252
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1253 switch(link_values.command) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1254 case LinkNoLink:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1255 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1256 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1257 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1258 return 0; /* no actual jump */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1259
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1260 case LinkTopC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1261 /* Restart playing from the beginning of the current Cell. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1262 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1263 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1264 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1265 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1266 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1267 case LinkNextC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1268 /* Link to Next Cell */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1269 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1270 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1271 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1272 (vm->state).cellN += 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1273 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1274 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1275 case LinkPrevC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1276 /* Link to Previous Cell */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1277 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1278 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1279 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1280 assert((vm->state).cellN > 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1281 (vm->state).cellN -= 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1282 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1283 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1284
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1285 case LinkTopPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1286 /* Link to Top of current Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1287 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1288 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1289 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1290 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1291 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1292 case LinkNextPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1293 /* Link to Next Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1294 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1295 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1296 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1297 (vm->state).pgN += 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1298 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1299 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1300 case LinkPrevPG:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1301 /* Link to Previous Program */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1302 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1303 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1304 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1305 assert((vm->state).pgN > 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1306 (vm->state).pgN -= 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1307 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1308 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1309
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1310 case LinkTopPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1311 /* Restart playing from beginning of current Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1312 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1313 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1314 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1315 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1316 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1317 case LinkNextPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1318 /* Link to Next Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1319 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1320 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1321 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1322 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
1323 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
1324 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1325 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1326 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1327 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1328 case LinkPrevPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1329 /* Link to Previous Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1330 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1331 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1332 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1333 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
1334 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
1335 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1336 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1337 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1338 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1339 case LinkGoUpPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1340 /* Link to GoUp Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1341 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1342 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1343 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1344 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
1345 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
1346 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1347 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1348 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1349 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1350 case LinkTailPGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1351 /* Link to Tail of Program Chain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1352 /* BUTTON number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1353 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1354 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1355 link_values = play_PGC_post(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1356 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1357
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1358 case LinkRSM:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1359 {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1360 /* Link to Resume point */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1361 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1362
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1363 /* Check and see if there is any rsm info!! */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1364 if (!(vm->state).rsm_vtsN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1365 fprintf(MSG_OUT, "libdvdnav: trying to resume without any resume info set\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1366 link_values.command = Exit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1367 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1368 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1369
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1370 (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
1371 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
1372 assert(0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1373 set_PGCN(vm, (vm->state).rsm_pgcN);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1374
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1375 /* These should never be set in SystemSpace and/or MenuSpace */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1376 /* (vm->state).TTN_REG = rsm_tt; ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1377 /* (vm->state).TT_PGCN_REG = (vm->state).rsm_pgcN; ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1378 for(i = 0; i < 5; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1379 (vm->state).registers.SPRM[4 + i] = (vm->state).rsm_regs[i];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1380 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1381
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1382 if(link_values.data1 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1383 (vm->state).HL_BTNN_REG = link_values.data1 << 10;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1384
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1385 if((vm->state).rsm_cellN == 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1386 assert((vm->state).cellN); /* Checking if this ever happens */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1387 (vm->state).pgN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1388 link_values = play_PG(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1389 } else {
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1390 /* (vm->state).pgN = ?? this gets the right value in set_PGN() below */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1391 (vm->state).cellN = (vm->state).rsm_cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1392 link_values.command = PlayThis;
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1393 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
1394 link_values.data2 = (vm->state).rsm_blockN >> 16;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1395 if(!set_PGN(vm)) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1396 /* Were at the end of the PGC, should not happen for a RSM */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1397 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1398 link_values.command = LinkTailPGC;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1399 link_values.data1 = 0; /* No button */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1400 }
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 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1404 case LinkPGCN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1405 /* Link to Program Chain Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1406 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1407 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1408 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1409 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1410 case LinkPTTN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1411 /* Link to Part of current Title Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1412 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1413 /* PGC Pre-Commands are not executed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1414 assert((vm->state).domain == VTS_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1415 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1416 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1417 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
1418 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1419 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1420 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1421 case LinkPGN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1422 /* Link to Program Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1423 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1424 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1425 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1426 /* Update any other state, PTTN perhaps? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1427 (vm->state).pgN = link_values.data1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1428 link_values = play_PG(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1429 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1430 case LinkCN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1431 /* Link to Cell Number:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1432 /* BUTTON number:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1433 if(link_values.data2 != 0)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1434 (vm->state).HL_BTNN_REG = link_values.data2 << 10;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1435 /* Update any other state, pgN, PTTN perhaps? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1436 (vm->state).cellN = link_values.data1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1437 link_values = play_Cell(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1438 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1439
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1440 case Exit:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1441 vm->stopped = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1442 return 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1443
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1444 case JumpTT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1445 /* Jump to VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1446 /* Only allowed from the First Play domain(PGC) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1447 /* or the Video Manager domain (VMG) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1448 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1449 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1450 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
1451 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
1452 link_values = play_PGC(vm);
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1453 else
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1454 link_values.command = Exit;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1455 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1456 case JumpVTS_TT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1457 /* Jump to Title:data1 in same VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1458 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1459 /* or the Video Title Set Domain(VTS) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1460 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1461 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1462 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1463 if(!set_VTS_TT(vm, (vm->state).vtsN, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1464 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1465 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1466 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1467 case JumpVTS_PTT:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1468 /* Jump to Part:data2 of Title:data1 in same VTS Title Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1469 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1470 /* or the Video Title Set Domain(VTS) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1471 /* Stop SPRM9 Timer */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1472 /* Set SPRM1 and SPRM2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1473 assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1474 if(!set_VTS_PTT(vm, (vm->state).vtsN, link_values.data1, link_values.data2))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1475 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1476 link_values = play_PGC_PG(vm, (vm->state).pgN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1477 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1478
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1479 case JumpSS_FP:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1480 /* Jump to First Play Domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1481 /* Only allowed from the VTS Menu Domain(VTSM) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1482 /* or the Video Manager domain (VMG) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1483 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1484 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == VTSM_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1485 if (!set_FP_PGC(vm))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1486 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1487 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1488 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1489 case JumpSS_VMGM_MENU:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1490 /* Jump to Video Manger domain - Title Menu:data1 or any PGC in VMG */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1491 /* Allowed from anywhere except the VTS Title domain */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1492 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1493 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1494 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1495 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1496 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1497 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1498 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1499 case JumpSS_VTSM:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1500 /* Jump to a menu in Video Title domain, */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1501 /* or to a Menu is the current VTS */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1502 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1503 /* ifoOpenNewVTSI:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1504 /* VTS_TTN_REG:data2 */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1505 /* get_MENU:data3 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1506 if(link_values.data1 != 0) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1507 if (link_values.data1 != (vm->state).vtsN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1508 /* the normal case */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1509 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1510 (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
1511 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
1512 assert(0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1513 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1514 /* This happens on some discs like "Captain Scarlet & the Mysterons" or
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1515 * the German RC2 of "Anatomie" in VTSM. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1516 assert((vm->state).domain == VTSM_DOMAIN ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1517 (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1518 (vm->state).domain = VTSM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1519 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1520 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1521 /* This happens on 'The Fifth Element' region 2. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1522 assert((vm->state).domain == VTSM_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1523 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1524 /* I don't know what title is supposed to be used for. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1525 /* Alien or Aliens has this != 1, I think. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1526 /* assert(link_values.data2 == 1); */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1527 (vm->state).VTS_TTN_REG = link_values.data2;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1528 /* TTN_REG (SPRM4), VTS_TTN_REG (SPRM5), TT_PGCN_REG (SPRM6) are linked, */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1529 /* so if one changes, the others must change to match it. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1530 (vm->state).TTN_REG = get_TT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1531 if(!set_MENU(vm, link_values.data3))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1532 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1533 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1534 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1535 case JumpSS_VMGM_PGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1536 /* set_PGCN:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1537 /* Stop SPRM9 Timer and any GPRM counters */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1538 assert((vm->state).domain != VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1539 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1540 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1541 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1542 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1543 break;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1544
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1545 case CallSS_FP:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1546 /* set_RSMinfo:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1547 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1548 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1549 set_RSMinfo(vm, link_values.data1, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1550 set_FP_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1551 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1552 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1553 case CallSS_VMGM_MENU:
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1554 /* set_MENU:data1 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1555 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1556 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1557 /* Must be called before domain is changed */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1558 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1559 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1560 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1561 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1562 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1563 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1564 case CallSS_VTSM:
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1565 /* set_MENU:data1 */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1566 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1567 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1568 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1569 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1570 (vm->state).domain = VTSM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1571 if(!set_MENU(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1572 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1573 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1574 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1575 case CallSS_VMGM_PGC:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1576 /* set_PGC:data1 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1577 /* set_RSMinfo:data2 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1578 assert((vm->state).domain == VTS_DOMAIN); /* ?? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1579 /* Must be called before domain is changed */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1580 set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1581 (vm->state).domain = VMGM_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1582 if(!set_PGCN(vm, link_values.data1))
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1583 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1584 link_values = play_PGC(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1585 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1586 case PlayThis:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1587 /* Should never happen. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1588 assert(0);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1589 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1590 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1591
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1592 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1593 fprintf(MSG_OUT, "libdvdnav: After printout starts:\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1594 vm_print_current_domain_state(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1595 fprintf(MSG_OUT, "libdvdnav: After printout ends.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1596 #endif
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1597
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1598 }
252
aee8af592d66 fix a long-standing problem: sometimes, hitting Escape in the movie and then
mroi
parents: 247
diff changeset
1599 (vm->state).blockN = link_values.data1 | (link_values.data2 << 16);
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1600 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1601 }
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 /* Set functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1605
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1606 static int set_TT(vm_t *vm, int tt) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1607 return set_PTT(vm, tt, 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1608 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1609
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1610 static int set_PTT(vm_t *vm, int tt, int ptt) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1611 assert(tt <= vm->vmgi->tt_srpt->nr_of_srpts);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1612 return set_VTS_PTT(vm, vm->vmgi->tt_srpt->title[tt - 1].title_set_nr,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1613 vm->vmgi->tt_srpt->title[tt - 1].vts_ttn, ptt);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1614 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1615
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1616 static int set_VTS_TT(vm_t *vm, int vtsN, int vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1617 return set_VTS_PTT(vm, vtsN, vts_ttn, 1);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1618 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1619
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1620 static int set_VTS_PTT(vm_t *vm, int vtsN, int vts_ttn, int part) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1621 int pgcN, pgN, res;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1622
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1623 (vm->state).domain = VTS_DOMAIN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1624
256
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1625 if (vtsN != (vm->state).vtsN)
6299ccea8a38 killing a lot of asserts and turning them into forced executions of Exit,
mroi
parents: 254
diff changeset
1626 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
1627 return 0;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1628
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1629 if ((vts_ttn < 1) || (vts_ttn > vm->vtsi->vts_ptt_srpt->nr_of_srpts) ||
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1630 (part < 1) || (part > vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].nr_of_ptts) ) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1631 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1632 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1633
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1634 pgcN = vm->vtsi->vts_ptt_srpt->title[vts_ttn - 1].ptt[part - 1].pgcn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1635 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
1636
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1637 (vm->state).TT_PGCN_REG = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1638 (vm->state).PTTN_REG = part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1639 (vm->state).TTN_REG = get_TT(vm, vtsN, vts_ttn);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1640 assert( (vm->state.TTN_REG) != 0 );
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1641 (vm->state).VTS_TTN_REG = vts_ttn;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1642 (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
1643 /* Any other registers? */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1644
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1645 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
1646 (vm->state).pgN = pgN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1647 return res;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1648 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1649
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1650 static int set_FP_PGC(vm_t *vm) {
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1651 (vm->state).domain = FP_DOMAIN;
254
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1652 if (!vm->vmgi->first_play_pgc) {
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1653 return set_PGCN(vm, 1);
f78669338b49 Fix segfault if the DVD does not contain a FP_PGC.
jcdutton
parents: 252
diff changeset
1654 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1655 (vm->state).pgc = vm->vmgi->first_play_pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1656 (vm->state).pgcN = vm->vmgi->vmgi_mat->first_play_pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1657 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1658 }
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 static int set_MENU(vm_t *vm, int menu) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1662 assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == VTSM_DOMAIN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1663 return set_PGCN(vm, get_ID(vm, menu));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1664 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1665
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1666 static int set_PGCN(vm_t *vm, int pgcN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1667 pgcit_t *pgcit;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1668
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1669 pgcit = get_PGCIT(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1670 assert(pgcit != NULL); /* ?? Make this return -1 instead */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1671
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1672 if(pgcN < 1 || pgcN > pgcit->nr_of_pgci_srp) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1673 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1674 fprintf(MSG_OUT, "libdvdnav: ** No such pgcN = %d\n", pgcN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1675 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1676 return 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1677 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1678
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1679 (vm->state).pgc = pgcit->pgci_srp[pgcN - 1].pgc;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1680 (vm->state).pgcN = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1681 (vm->state).pgN = 1;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1682
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1683 if((vm->state).domain == VTS_DOMAIN)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1684 (vm->state).TT_PGCN_REG = pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1685
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1686 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1687 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1688
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1689 /* Figure out the correct pgN from the cell and update (vm->state). */
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1690 static int set_PGN(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1691 int new_pgN = 0;
403
1ce807c12563 in vm:c set_PGN removed restriction that didn't play multi-PGC titles; patch by John Stebbins
nicodvb
parents: 401
diff changeset
1692 int dummy, part;
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 vm_get_current_title_part(vm, &dummy, &part);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1710 (vm->state).PTTN_REG = part;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1711 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1712 return 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1713 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1714
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1715 /* Must be called before domain is changed (set_PGCN()) */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1716 static void set_RSMinfo(vm_t *vm, int cellN, int blockN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1717 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1718
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1719 if(cellN) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1720 (vm->state).rsm_cellN = cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1721 (vm->state).rsm_blockN = blockN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1722 } else {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1723 (vm->state).rsm_cellN = (vm->state).cellN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1724 (vm->state).rsm_blockN = blockN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1725 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1726 (vm->state).rsm_vtsN = (vm->state).vtsN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1727 (vm->state).rsm_pgcN = get_PGCN(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1728
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1729 /* assert((vm->state).rsm_pgcN == (vm->state).TT_PGCN_REG); for VTS_DOMAIN */
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1730
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1731 for(i = 0; i < 5; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1732 (vm->state).rsm_regs[i] = (vm->state).registers.SPRM[4 + i];
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1733 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1734 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1735
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1736
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1737 /* Get functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1738
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1739 /* Searches the TT tables, to find the current TT.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1740 * returns the current TT.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1741 * returns 0 if not found.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1742 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1743 static int get_TT(vm_t *vm, int vtsN, int vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1744 int i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1745 int tt=0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1746
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1747 for(i = 1; i <= vm->vmgi->tt_srpt->nr_of_srpts; i++) {
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1748 if( vm->vmgi->tt_srpt->title[i - 1].title_set_nr == vtsN &&
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1749 vm->vmgi->tt_srpt->title[i - 1].vts_ttn == vts_ttn) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1750 tt=i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1751 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1752 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1753 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1754 return tt;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1755 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1756
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1757 /* Search for entry_id match of the PGC Category in the current VTS PGCIT table.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1758 * Return pgcN based on entry_id match.
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1759 */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1760 static int get_ID(vm_t *vm, int id) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1761 int pgcN, i;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1762 pgcit_t *pgcit;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1763
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1764 /* Relies on state to get the correct pgcit. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1765 pgcit = get_PGCIT(vm);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1766 assert(pgcit != NULL);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1767 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1768 fprintf(MSG_OUT, "libdvdnav: ** Searching for menu (0x%x) entry PGC\n", id);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1769 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1770
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1771 /* Force high bit set. */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1772 id |=0x80;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1773
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1774 /* Get menu/title */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1775 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1776 if( (pgcit->pgci_srp[i].entry_id) == id) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1777 pgcN = i + 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1778 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1779 fprintf(MSG_OUT, "libdvdnav: Found menu.\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1780 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1781 return pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1782 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1783 }
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: ** No such id/menu (0x%02x) entry PGC\n", id & 0x7f);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1786 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1787 if ( (pgcit->pgci_srp[i].entry_id & 0x80) == 0x80) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1788 fprintf(MSG_OUT, "libdvdnav: Available menus: 0x%x\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1789 pgcit->pgci_srp[i].entry_id & 0x7f);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1790 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1791 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1792 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1793 return 0; /* error */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1794 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1795
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1796 /* 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
1797 static int get_PGCN(vm_t *vm) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1798 pgcit_t *pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1799 int pgcN = 1;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1800
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1801 pgcit = get_PGCIT(vm);
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1802
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1803 if (pgcit) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1804 while(pgcN <= pgcit->nr_of_pgci_srp) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1805 if(pgcit->pgci_srp[pgcN - 1].pgc == (vm->state).pgc) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1806 assert((vm->state).pgcN == pgcN);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1807 return pgcN;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1808 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1809 pgcN++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1810 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1811 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1812 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
1813 (vm->state).domain);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1814 return 0; /* error */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1815 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1816
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1817 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
1818 int i;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1819
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1820 if(h == NULL || h->pgci_ut == NULL) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1821 fprintf(MSG_OUT, "libdvdnav: *** pgci_ut handle is NULL ***\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1822 return NULL; /* error? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1823 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1824
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1825 i = 0;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1826 while(i < h->pgci_ut->nr_of_lus
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1827 && h->pgci_ut->lu[i].lang_code != lang)
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1828 i++;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1829 if(i == h->pgci_ut->nr_of_lus) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1830 fprintf(MSG_OUT, "libdvdnav: Language '%c%c' not found, using '%c%c' instead\n",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1831 (char)(lang >> 8), (char)(lang & 0xff),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1832 (char)(h->pgci_ut->lu[0].lang_code >> 8),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1833 (char)(h->pgci_ut->lu[0].lang_code & 0xff));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1834 fprintf(MSG_OUT, "libdvdnav: Menu Languages available: ");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1835 for(i = 0; i < h->pgci_ut->nr_of_lus; i++) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1836 fprintf(MSG_OUT, "%c%c ",
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1837 (char)(h->pgci_ut->lu[i].lang_code >> 8),
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1838 (char)(h->pgci_ut->lu[i].lang_code & 0xff));
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1839 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1840 fprintf(MSG_OUT, "\n");
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1841 i = 0; /* error? */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1842 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1843
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1844 return h->pgci_ut->lu[i].pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1845 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1846
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1847 /* Uses state to decide what to return */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1848 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
1849 pgcit_t *pgcit = NULL;
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1850
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1851 switch ((vm->state).domain) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1852 case VTS_DOMAIN:
344
fb2fbd4cfbf6 in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents: 332
diff changeset
1853 if(!vm->vtsi) return NULL;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1854 pgcit = vm->vtsi->vts_pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1855 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1856 case VTSM_DOMAIN:
344
fb2fbd4cfbf6 in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents: 332
diff changeset
1857 if(!vm->vtsi) return NULL;
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1858 pgcit = get_MENU_PGCIT(vm, vm->vtsi, (vm->state).registers.SPRM[0]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1859 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1860 case VMGM_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1861 case FP_DOMAIN:
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1862 pgcit = get_MENU_PGCIT(vm, vm->vmgi, (vm->state).registers.SPRM[0]);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1863 break;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1864 default:
243
e75c52894630 * assert(0) does not always and the program (see NDEBUG)
mroi
parents: 229
diff changeset
1865 abort();
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1866 }
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1867
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1868 return pgcit;
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1869 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1870
388
90ca650854e0 Remove all trailing whitespace,
rathann
parents: 386
diff changeset
1871 //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
1872 //identify chapters
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1873 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
1874 {
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1875 ifo_handle_t *ifo = NULL;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1876 uint8_t titleset_nr;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1877 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
1878 return NULL;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1879 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
1880 ifo = ifoOpen(vm->dvd, titleset_nr);
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1881 return ifo;
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1882 }
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1883
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1884 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
1885 {
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1886 ifoClose(ifo);
fdbfb58d2735 added utility functions vm_get_title_ifo() and vm_ifo_close()
nicodvb
parents: 294
diff changeset
1887 }
225
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1888
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1889 /* Debug functions */
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1890
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1891 #ifdef TRACE
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1892 void vm_position_print(vm_t *vm, vm_position_t *position) {
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1893 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
1894 position->button,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1895 position->spu_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1896 position->audio_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1897 position->angle_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1898 position->hop_channel,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1899 position->vts,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1900 position->domain,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1901 position->cell,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1902 position->cell_restart,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1903 position->cell_start,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1904 position->still,
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1905 position->block);
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1906 }
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1907 #endif
9b1b740e3fc9 big build system changes
mroi
parents:
diff changeset
1908