Mercurial > libdvdnav.hg
annotate dvdnav.c @ 249:5d643668f1e3 src
I added this code myself a long time ago, but now I am quite convinced that
it is wrong: Why would we filter out SPU stream change events that switch
SPUs off? This breaks watching the trailer on the RC2 of "Girl, interrupted",
because you always get unwanted subtitles.
When I added this code, it fixed a problem with the RC2 of "Terminator", but
I cannot reproduce this problem any more. Back then, the menu highlights would
not show up, but they do now. I assume the problem really got fixed with proper
support for forced subtitles in xine, so this crappy workaround here can go
away.
After all, this way it is more symmetric to audio stream change events,
because these are not filtered.
author | mroi |
---|---|
date | Sun, 12 Sep 2004 15:12:43 +0000 |
parents | 15dc5660d9a8 |
children | 6299ccea8a38 |
rev | line source |
---|---|
0 | 1 /* |
2 * Copyright (C) 2000 Rich Wareham <richwareham@users.sourceforge.net> | |
3 * | |
4 * This file is part of libdvdnav, a DVD navigation library. | |
5 * | |
6 * libdvdnav is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * libdvdnav is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
19 * | |
20 * $Id$ | |
21 * | |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include "config.h" | |
26 #endif | |
27 | |
31 | 28 /* |
29 #define LOG_DEBUG | |
30 */ | |
31 | |
0 | 32 #include "dvdnav_internal.h" |
33 #include "read_cache.h" | |
231 | 34 #include "nav_read.h" |
0 | 35 |
36 #include <stdlib.h> | |
37 #include <stdio.h> | |
84 | 38 #include <sys/time.h> |
0 | 39 |
97
c1dff1899bda
First patch for personalized dvd viewing. I have not tested it yet.
jcdutton
parents:
92
diff
changeset
|
40 #include "remap.h" |
c1dff1899bda
First patch for personalized dvd viewing. I have not tested it yet.
jcdutton
parents:
92
diff
changeset
|
41 |
114 | 42 static dvdnav_status_t dvdnav_clear(dvdnav_t * this) { |
43 /* clear everything except file, vm, mutex, readahead */ | |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
44 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
45 if (this->file) DVDCloseFile(this->file); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
46 this->file = NULL; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
47 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
48 memset(&this->pci,0,sizeof(this->pci)); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
49 memset(&this->dsi,0,sizeof(this->dsi)); |
197
a20a5976a207
last_cmd_nav_lbn has to be initialized with an invalid value, so that the first
mroi
parents:
195
diff
changeset
|
50 this->last_cmd_nav_lbn = SRI_END_OF_CELL; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
51 |
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
52 /* Set initial values of flags */ |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
53 this->position_current.still = 0; |
23 | 54 this->skip_still = 0; |
116 | 55 this->sync_wait = 0; |
56 this->sync_wait_skip = 0; | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
57 this->spu_clut_changed = 0; |
114 | 58 this->started = 0; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
59 |
34
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
60 dvdnav_read_cache_clear(this->cache); |
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
61 |
193 | 62 return DVDNAV_STATUS_OK; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
63 } |
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
64 |
114 | 65 dvdnav_status_t dvdnav_open(dvdnav_t** dest, const char *path) { |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
66 dvdnav_t *this; |
84 | 67 struct timeval time; |
0 | 68 |
69 /* Create a new structure */ | |
100 | 70 fprintf(MSG_OUT, "libdvdnav: Using dvdnav version %s from http://dvd.sf.net\n", VERSION); |
82 | 71 |
0 | 72 (*dest) = NULL; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
73 this = (dvdnav_t*)malloc(sizeof(dvdnav_t)); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
74 if(!this) |
193 | 75 return DVDNAV_STATUS_ERR; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
76 memset(this, 0, (sizeof(dvdnav_t) ) ); /* Make sure this structure is clean */ |
114 | 77 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
78 pthread_mutex_init(&this->vm_lock, NULL); |
0 | 79 /* Initialise the error string */ |
80 printerr(""); | |
81 | |
82 /* Initialise the VM */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
83 this->vm = vm_new_vm(); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
84 if(!this->vm) { |
114 | 85 printerr("Error initialising the DVD VM."); |
92 | 86 pthread_mutex_destroy(&this->vm_lock); |
87 free(this); | |
193 | 88 return DVDNAV_STATUS_ERR; |
0 | 89 } |
114 | 90 if(!vm_reset(this->vm, path)) { |
91 printerr("Error starting the VM / opening the DVD device."); | |
92 | 92 pthread_mutex_destroy(&this->vm_lock); |
93 vm_free_vm(this->vm); | |
94 free(this); | |
193 | 95 return DVDNAV_STATUS_ERR; |
0 | 96 } |
97 | |
98 /* Set the path. FIXME: Is a deep copy 'right' */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
99 strncpy(this->path, path, MAX_PATH_LEN); |
0 | 100 |
101 /* Pre-open and close a file so that the CSS-keys are cached. */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
102 this->file = DVDOpenFile(vm_get_dvd_reader(this->vm), 0, DVD_READ_MENU_VOBS); |
0 | 103 |
34
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
104 /* Start the read-ahead cache. */ |
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
105 this->cache = dvdnav_read_cache_new(this); |
84 | 106 |
114 | 107 /* Seed the random numbers. So that the DVD VM Command rand() |
108 * gives a different start value each time a DVD is played. */ | |
109 gettimeofday(&time, NULL); | |
84 | 110 srand(time.tv_usec); |
111 | |
114 | 112 dvdnav_clear(this); |
113 | |
114 (*dest) = this; | |
193 | 115 return DVDNAV_STATUS_OK; |
0 | 116 } |
117 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
118 dvdnav_status_t dvdnav_close(dvdnav_t *this) { |
114 | 119 |
31 | 120 #ifdef LOG_DEBUG |
76 | 121 fprintf(MSG_OUT, "libdvdnav: close:called\n"); |
31 | 122 #endif |
34
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
123 |
114 | 124 if(!this) { |
125 printerr("Passed a NULL pointer."); | |
193 | 126 return DVDNAV_STATUS_ERR; |
114 | 127 } |
128 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
129 if (this->file) { |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
130 DVDCloseFile(this->file); |
31 | 131 #ifdef LOG_DEBUG |
76 | 132 fprintf(MSG_OUT, "libdvdnav: close:file closing\n"); |
31 | 133 #endif |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
134 this->file = NULL; |
0 | 135 } |
136 | |
137 /* Free the VM */ | |
114 | 138 if(this->vm) |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
139 vm_free_vm(this->vm); |
114 | 140 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
141 pthread_mutex_destroy(&this->vm_lock); |
60 | 142 |
143 /* We leave the final freeing of the entire structure to the cache, | |
144 * because we don't know, if there are still buffers out in the wild, | |
145 * that must return first. */ | |
114 | 146 if(this->cache) |
60 | 147 dvdnav_read_cache_free(this->cache); |
114 | 148 else |
149 free(this); | |
0 | 150 |
193 | 151 return DVDNAV_STATUS_OK; |
0 | 152 } |
153 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
154 dvdnav_status_t dvdnav_reset(dvdnav_t *this) { |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
155 dvdnav_status_t result; |
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
156 |
31 | 157 #ifdef LOG_DEBUG |
76 | 158 fprintf(MSG_OUT, "libdvdnav: reset:called\n"); |
31 | 159 #endif |
114 | 160 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
161 if(!this) { |
114 | 162 printerr("Passed a NULL pointer."); |
193 | 163 return DVDNAV_STATUS_ERR; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
164 } |
114 | 165 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
166 pthread_mutex_lock(&this->vm_lock); |
114 | 167 |
31 | 168 #ifdef LOG_DEBUG |
76 | 169 fprintf(MSG_OUT, "libdvdnav: reseting vm\n"); |
31 | 170 #endif |
114 | 171 if(!vm_reset(this->vm, NULL)) { |
172 printerr("Error restarting the VM."); | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
173 pthread_mutex_unlock(&this->vm_lock); |
193 | 174 return DVDNAV_STATUS_ERR; |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
175 } |
31 | 176 #ifdef LOG_DEBUG |
76 | 177 fprintf(MSG_OUT, "libdvdnav: clearing dvdnav\n"); |
31 | 178 #endif |
114 | 179 result = dvdnav_clear(this); |
180 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
181 pthread_mutex_unlock(&this->vm_lock); |
4
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
182 return result; |
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
183 } |
99bed5d6db2f
Added reset patch from Kees Cook <kees@outflux.net>
richwareham
parents:
3
diff
changeset
|
184 |
114 | 185 dvdnav_status_t dvdnav_path(dvdnav_t *this, const char** path) { |
186 | |
187 if(!this || !path) { | |
188 printerr("Passed a NULL pointer."); | |
193 | 189 return DVDNAV_STATUS_ERR; |
0 | 190 } |
191 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
192 (*path) = this->path; |
0 | 193 |
193 | 194 return DVDNAV_STATUS_OK; |
0 | 195 } |
196 | |
114 | 197 const char* dvdnav_err_to_string(dvdnav_t *this) { |
198 | |
199 if(!this) | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
200 return "Hey! You gave me a NULL pointer you naughty person!"; |
0 | 201 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
202 return this->err_str; |
0 | 203 } |
204 | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
205 /* converts a dvd_time_t to PTS ticks */ |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
206 static int64_t dvdnav_convert_time(dvd_time_t *time) { |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
207 int64_t result; |
195 | 208 int64_t frames; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
209 |
135 | 210 result = (time->hour >> 4 ) * 10 * 60 * 60 * 90000; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
211 result += (time->hour & 0x0f) * 60 * 60 * 90000; |
135 | 212 result += (time->minute >> 4 ) * 10 * 60 * 90000; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
213 result += (time->minute & 0x0f) * 60 * 90000; |
135 | 214 result += (time->second >> 4 ) * 10 * 90000; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
215 result += (time->second & 0x0f) * 90000; |
135 | 216 |
217 frames = ((time->frame_u & 0x30) >> 4) * 10; | |
218 frames += ((time->frame_u & 0x0f) ) ; | |
219 | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
220 if (time->frame_u & 0x80) |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
221 result += frames * 3000; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
222 else |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
223 result += frames * 3600; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
224 |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
225 return result; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
226 } |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
227 |
114 | 228 /* |
0 | 229 * Returns 1 if block contains NAV packet, 0 otherwise. |
217 | 230 * Processes said NAV packet if present. |
0 | 231 * |
232 * Most of the code in here is copied from xine's MPEG demuxer | |
233 * so any bugs which are found in that should be corrected here also. | |
234 */ | |
195 | 235 static int32_t dvdnav_decode_packet(dvdnav_t *this, uint8_t *p, dsi_t *nav_dsi, pci_t *nav_pci) { |
236 int32_t bMpeg1 = 0; | |
0 | 237 uint32_t nHeaderLen; |
238 uint32_t nPacketLen; | |
239 uint32_t nStreamID; | |
240 | |
241 if (p[3] == 0xBA) { /* program stream pack header */ | |
195 | 242 int32_t nStuffingBytes; |
0 | 243 |
244 bMpeg1 = (p[4] & 0x40) == 0; | |
245 | |
246 if (bMpeg1) { | |
114 | 247 p += 12; |
0 | 248 } else { /* mpeg2 */ |
249 nStuffingBytes = p[0xD] & 0x07; | |
250 p += 14 + nStuffingBytes; | |
251 } | |
252 } | |
253 | |
254 if (p[3] == 0xbb) { /* program stream system header */ | |
255 nHeaderLen = (p[4] << 8) | p[5]; | |
256 p += 6 + nHeaderLen; | |
257 } | |
258 | |
259 /* we should now have a PES packet here */ | |
260 if (p[0] || p[1] || (p[2] != 1)) { | |
76 | 261 fprintf(MSG_OUT, "libdvdnav: demux error! %02x %02x %02x (should be 0x000001) \n",p[0],p[1],p[2]); |
0 | 262 return 0; |
263 } | |
264 | |
265 nPacketLen = p[4] << 8 | p[5]; | |
266 nStreamID = p[3]; | |
267 | |
268 nHeaderLen = 6; | |
269 p += nHeaderLen; | |
270 | |
271 if (nStreamID == 0xbf) { /* Private stream 2 */ | |
114 | 272 #if 0 |
195 | 273 int32_t i; |
114 | 274 fprintf(MSG_OUT, "libdvdnav: nav packet=%u\n",p-p_start-6); |
275 for(i=0;i<80;i++) | |
276 fprintf(MSG_OUT, "%02x ",p[i-6]); | |
277 fprintf(MSG_OUT, "\n"); | |
278 #endif | |
279 | |
0 | 280 if(p[0] == 0x00) { |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
281 navRead_PCI(nav_pci, p+1); |
0 | 282 } |
283 | |
284 p += nPacketLen; | |
285 | |
286 /* We should now have a DSI packet. */ | |
287 if(p[6] == 0x01) { | |
288 nPacketLen = p[4] << 8 | p[5]; | |
289 p += 6; | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
290 navRead_DSI(nav_dsi, p+1); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
291 } |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
292 return 1; |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
293 } |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
294 return 0; |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
295 } |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
296 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
297 /* DSI is used for most angle stuff. |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
298 * PCI is used for only non-seemless angle stuff |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
299 */ |
195 | 300 static int32_t dvdnav_get_vobu(dvdnav_t *this, dsi_t *nav_dsi, pci_t *nav_pci, dvdnav_vobu_t *vobu) { |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
301 uint32_t next; |
195 | 302 int32_t angle, num_angle; |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
303 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
304 vobu->vobu_start = nav_dsi->dsi_gi.nv_pck_lbn; /* Absolute offset from start of disk */ |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
305 vobu->vobu_length = nav_dsi->dsi_gi.vobu_ea; /* Relative offset from vobu_start */ |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
306 |
43
0ba15bf3dc25
Biiiiiiig change to let doxygen generate some docs for the library. Note that I'm in no way sure that the autoconf stuff plays nice.
richwareham
parents:
42
diff
changeset
|
307 /* |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
308 * If we're not at the end of this cell, we can determine the next |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
309 * VOBU to display using the VOBU_SRI information section of the |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
310 * DSI. Using this value correctly follows the current angle, |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
311 * avoiding the doubled scenes in The Matrix, and makes our life |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
312 * really happy. |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
313 * |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
314 * vobu_next is an offset value, 0x3fffffff = SRI_END_OF_CELL |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
315 * DVDs are about 6 Gigs, which is only up to 0x300000 blocks |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
316 * Should really assert if bit 31 != 1 |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
317 */ |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
318 |
114 | 319 #if 0 |
320 /* Old code -- may still be useful one day */ | |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
321 if(nav_dsi->vobu_sri.next_vobu != SRI_END_OF_CELL ) { |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
322 vobu->vobu_next = ( nav_dsi->vobu_sri.next_vobu & 0x3fffffff ); |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
323 } else { |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
324 vobu->vobu_next = vobu->vobu_length; |
114 | 325 } |
326 #else | |
327 /* Relative offset from vobu_start */ | |
328 vobu->vobu_next = ( nav_dsi->vobu_sri.next_vobu & 0x3fffffff ); | |
329 #endif | |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
330 |
114 | 331 vm_get_angle_info(this->vm, &angle, &num_angle); |
332 | |
333 /* FIMXE: The angle reset doesn't work for some reason for the moment */ | |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
334 #if 0 |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
335 if((num_angle < angle) && (angle != 1)) { |
114 | 336 fprintf(MSG_OUT, "libdvdnav: angle ends!\n"); |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
337 |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
338 /* This is to switch back to angle one when we |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
339 * finish with angles. */ |
114 | 340 dvdnav_angle_change(this, 1); |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
341 } |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
342 #endif |
0 | 343 |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
344 if(num_angle != 0) { |
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
345 |
114 | 346 if((next = nav_pci->nsml_agli.nsml_agl_dsta[angle-1]) != 0) { |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
347 if((next & 0x3fffffff) != 0) { |
114 | 348 if(next & 0x80000000) |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
349 vobu->vobu_next = - (int32_t)(next & 0x3fffffff); |
114 | 350 else |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
351 vobu->vobu_next = + (int32_t)(next & 0x3fffffff); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
352 } |
114 | 353 } else if((next = nav_dsi->sml_agli.data[angle-1].address) != 0) { |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
354 vobu->vobu_length = nav_dsi->sml_pbi.ilvu_ea; |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
355 |
114 | 356 if((next & 0x80000000) && (next != 0x7fffffff)) |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
357 vobu->vobu_next = - (int32_t)(next & 0x3fffffff); |
114 | 358 else |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
359 vobu->vobu_next = + (int32_t)(next & 0x3fffffff); |
0 | 360 } |
361 } | |
33
ef2136c4e7b2
Angles now work (still a few wrinkles though -- e.g. angle does not reset to '1' when returning to menus)
richwareham
parents:
31
diff
changeset
|
362 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
363 return 1; |
0 | 364 } |
60 | 365 |
114 | 366 /* |
367 * These are the main get_next_block function which actually get the media stream video and audio etc. | |
368 * | |
369 * There are two versions: The second one is using the zero-copy read ahead cache and therefore | |
370 * hands out pointers targetting directly into the cache. | |
371 * The first one uses a memcopy to fill this cache block into the application provided memory. | |
372 * The benefit of this first one is that no special memory management is needed. The application is | |
373 * the only one responsible of allocating and freeing the memory associated with the pointer. | |
374 * The drawback is the additional memcopy. | |
28 | 375 */ |
60 | 376 |
195 | 377 dvdnav_status_t dvdnav_get_next_block(dvdnav_t *this, uint8_t *buf, |
378 int32_t *event, int32_t *len) { | |
60 | 379 unsigned char *block; |
380 dvdnav_status_t status; | |
381 | |
382 block = buf; | |
383 status = dvdnav_get_next_cache_block(this, &block, event, len); | |
193 | 384 if (status == DVDNAV_STATUS_OK && block != buf) { |
60 | 385 /* we received a block from the cache, copy it, so we can give it back */ |
386 memcpy(buf, block, DVD_VIDEO_LB_LEN); | |
387 dvdnav_free_cache_block(this, block); | |
388 } | |
389 return status; | |
390 } | |
391 | |
195 | 392 dvdnav_status_t dvdnav_get_next_cache_block(dvdnav_t *this, uint8_t **buf, |
393 int32_t *event, int32_t *len) { | |
0 | 394 dvd_state_t *state; |
195 | 395 int32_t result; |
114 | 396 |
60 | 397 if(!this || !event || !len || !buf || !*buf) { |
114 | 398 printerr("Passed a NULL pointer."); |
193 | 399 return DVDNAV_STATUS_ERR; |
0 | 400 } |
114 | 401 |
402 pthread_mutex_lock(&this->vm_lock); | |
0 | 403 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
404 if(!this->started) { |
0 | 405 /* Start the VM */ |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
406 vm_start(this->vm); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
407 this->started = 1; |
0 | 408 } |
409 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
410 state = &(this->vm->state); |
0 | 411 (*event) = DVDNAV_NOP; |
412 (*len) = 0; | |
413 | |
414 /* Check the STOP flag */ | |
114 | 415 if(this->vm->stopped) { |
121 | 416 vm_stop(this->vm); |
0 | 417 (*event) = DVDNAV_STOP; |
114 | 418 this->started = 0; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
419 pthread_mutex_unlock(&this->vm_lock); |
193 | 420 return DVDNAV_STATUS_OK; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
421 } |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
422 |
114 | 423 vm_position_get(this->vm, &this->position_next); |
0 | 424 |
126 | 425 #ifdef LOG_DEBUG |
114 | 426 fprintf(MSG_OUT, "libdvdnav: POS-NEXT "); |
427 vm_position_print(this->vm, &this->position_next); | |
116 | 428 fprintf(MSG_OUT, "libdvdnav: POS-CUR "); |
114 | 429 vm_position_print(this->vm, &this->position_current); |
31 | 430 #endif |
114 | 431 |
432 /* did we hop? */ | |
433 if(this->position_current.hop_channel != this->position_next.hop_channel) { | |
434 (*event) = DVDNAV_HOP_CHANNEL; | |
58 | 435 #ifdef LOG_DEBUG |
114 | 436 fprintf(MSG_OUT, "libdvdnav: HOP_CHANNEL\n"); |
31 | 437 #endif |
115 | 438 if (this->position_next.hop_channel - this->position_current.hop_channel >= HOP_SEEK) { |
195 | 439 int32_t num_angles = 0, current; |
114 | 440 |
441 /* we seeked -> check for multiple angles */ | |
442 vm_get_angle_info(this->vm, ¤t, &num_angles); | |
443 if (num_angles > 1) { | |
195 | 444 int32_t result, block; |
114 | 445 /* we have to skip the first VOBU when seeking in a multiangle feature, |
446 * because it might belong to the wrong angle */ | |
447 block = this->position_next.cell_start + this->position_next.block; | |
448 result = dvdnav_read_cache_block(this->cache, block, 1, buf); | |
449 if(result <= 0) { | |
450 printerr("Error reading NAV packet."); | |
451 pthread_mutex_unlock(&this->vm_lock); | |
193 | 452 return DVDNAV_STATUS_ERR; |
114 | 453 } |
454 /* Decode nav into pci and dsi. Then get next VOBU info. */ | |
455 if(!dvdnav_decode_packet(this, *buf, &this->dsi, &this->pci)) { | |
456 printerr("Expected NAV packet but none found."); | |
457 pthread_mutex_unlock(&this->vm_lock); | |
193 | 458 return DVDNAV_STATUS_ERR; |
114 | 459 } |
460 dvdnav_get_vobu(this, &this->dsi, &this->pci, &this->vobu); | |
461 /* skip to next, if there is a next */ | |
462 if (this->vobu.vobu_next != SRI_END_OF_CELL) { | |
463 this->vobu.vobu_start += this->vobu.vobu_next; | |
464 this->vobu.vobu_next = 0; | |
465 } | |
466 /* update VM state */ | |
467 this->vm->state.blockN = this->vobu.vobu_start - this->position_next.cell_start; | |
468 } | |
469 } | |
470 this->position_current.hop_channel = this->position_next.hop_channel; | |
141
8f63f4c25f2f
update position on HOP_CHANNEL, do not rely on a following CELL_CHANGE
mroi
parents:
135
diff
changeset
|
471 /* update VOBU info */ |
8f63f4c25f2f
update position on HOP_CHANNEL, do not rely on a following CELL_CHANGE
mroi
parents:
135
diff
changeset
|
472 this->vobu.vobu_start = this->position_next.cell_start + this->position_next.block; |
8f63f4c25f2f
update position on HOP_CHANNEL, do not rely on a following CELL_CHANGE
mroi
parents:
135
diff
changeset
|
473 this->vobu.vobu_next = 0; |
127 | 474 /* Make blockN == vobu_length to do expected_nav */ |
114 | 475 this->vobu.vobu_length = 0; |
127 | 476 this->vobu.blockN = 0; |
116 | 477 this->sync_wait = 0; |
30 | 478 pthread_mutex_unlock(&this->vm_lock); |
193 | 479 return DVDNAV_STATUS_OK; |
0 | 480 } |
481 | |
116 | 482 /* Check the HIGHLIGHT flag */ |
483 if(this->position_current.button != this->position_next.button) { | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
484 dvdnav_highlight_event_t *hevent = (dvdnav_highlight_event_t *)*buf; |
116 | 485 |
486 (*event) = DVDNAV_HIGHLIGHT; | |
487 #ifdef LOG_DEBUG | |
488 fprintf(MSG_OUT, "libdvdnav: HIGHLIGHT\n"); | |
489 #endif | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
490 (*len) = sizeof(dvdnav_highlight_event_t); |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
491 hevent->display = 1; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
492 hevent->buttonN = this->position_next.button; |
116 | 493 this->position_current.button = this->position_next.button; |
494 pthread_mutex_unlock(&this->vm_lock); | |
193 | 495 return DVDNAV_STATUS_OK; |
116 | 496 } |
497 | |
498 /* Check the WAIT flag */ | |
499 if(this->sync_wait) { | |
500 (*event) = DVDNAV_WAIT; | |
501 #ifdef LOG_DEBUG | |
502 fprintf(MSG_OUT, "libdvdnav: WAIT\n"); | |
503 #endif | |
504 (*len) = 0; | |
505 pthread_mutex_unlock(&this->vm_lock); | |
193 | 506 return DVDNAV_STATUS_OK; |
116 | 507 } |
508 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
509 /* Check to see if we need to change the currently opened VOB */ |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
510 if((this->position_current.vts != this->position_next.vts) || |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
511 (this->position_current.domain != this->position_next.domain)) { |
0 | 512 dvd_read_domain_t domain; |
195 | 513 int32_t vtsN; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
514 dvdnav_vts_change_event_t *vts_event = (dvdnav_vts_change_event_t *)*buf; |
0 | 515 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
516 if(this->file) { |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
517 DVDCloseFile(this->file); |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
518 this->file = NULL; |
0 | 519 } |
520 | |
217 | 521 vts_event->old_vtsN = this->position_current.vts; |
522 vts_event->old_domain = this->position_current.domain; | |
0 | 523 |
114 | 524 /* Use the DOMAIN to find whether to open menu or title VOBs */ |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
525 switch(this->position_next.domain) { |
114 | 526 case FP_DOMAIN: |
527 case VMGM_DOMAIN: | |
0 | 528 domain = DVD_READ_MENU_VOBS; |
529 vtsN = 0; | |
530 break; | |
114 | 531 case VTSM_DOMAIN: |
0 | 532 domain = DVD_READ_MENU_VOBS; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
533 vtsN = this->position_next.vts; |
0 | 534 break; |
114 | 535 case VTS_DOMAIN: |
0 | 536 domain = DVD_READ_TITLE_VOBS; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
537 vtsN = this->position_next.vts; |
0 | 538 break; |
114 | 539 default: |
0 | 540 printerr("Unknown domain when changing VTS."); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
541 pthread_mutex_unlock(&this->vm_lock); |
193 | 542 return DVDNAV_STATUS_ERR; |
0 | 543 } |
544 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
545 this->position_current.vts = this->position_next.vts; |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
546 this->position_current.domain = this->position_next.domain; |
34
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
547 dvdnav_read_cache_clear(this->cache); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
548 this->file = DVDOpenFile(vm_get_dvd_reader(this->vm), vtsN, domain); |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
549 vts_event->new_vtsN = this->position_next.vts; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
550 vts_event->new_domain = this->position_next.domain; |
0 | 551 |
552 /* If couldn't open the file for some reason, moan */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
553 if(this->file == NULL) { |
0 | 554 printerrf("Error opening vtsN=%i, domain=%i.", vtsN, domain); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
555 pthread_mutex_unlock(&this->vm_lock); |
193 | 556 return DVDNAV_STATUS_ERR; |
0 | 557 } |
558 | |
559 /* File opened successfully so return a VTS change event */ | |
560 (*event) = DVDNAV_VTS_CHANGE; | |
114 | 561 #ifdef LOG_DEBUG |
562 fprintf(MSG_OUT, "libdvdnav: VTS_CHANGE\n"); | |
563 #endif | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
564 (*len) = sizeof(dvdnav_vts_change_event_t); |
0 | 565 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
566 this->spu_clut_changed = 1; |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
567 this->position_current.cell = -1; /* Force an update */ |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
568 this->position_current.spu_channel = -1; /* Force an update */ |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
569 this->position_current.audio_channel = -1; /* Force an update */; |
0 | 570 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
571 pthread_mutex_unlock(&this->vm_lock); |
193 | 572 return DVDNAV_STATUS_OK; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
573 } |
114 | 574 |
575 /* Check if the cell changed */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
576 if( (this->position_current.cell != this->position_next.cell) || |
50
578ce1d41479
Rename some of the functions in vm.c to help readability.
jcdutton
parents:
45
diff
changeset
|
577 (this->position_current.cell_restart != this->position_next.cell_restart) || |
114 | 578 (this->position_current.cell_start != this->position_next.cell_start) ) { |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
579 dvdnav_cell_change_event_t *cell_event = (dvdnav_cell_change_event_t *)*buf; |
195 | 580 int32_t first_cell_nr, last_cell_nr, i; |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
581 dvd_state_t *state = &this->vm->state; |
114 | 582 |
583 (*event) = DVDNAV_CELL_CHANGE; | |
584 #ifdef LOG_DEBUG | |
585 fprintf(MSG_OUT, "libdvdnav: CELL_CHANGE\n"); | |
586 #endif | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
587 (*len) = sizeof(dvdnav_cell_change_event_t); |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
588 |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
589 cell_event->cellN = state->cellN; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
590 cell_event->pgN = state->pgN; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
591 cell_event->cell_length = |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
592 dvdnav_convert_time(&state->pgc->cell_playback[state->cellN-1].playback_time); |
161 | 593 |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
594 cell_event->pg_length = 0; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
595 /* Find start cell of program. */ |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
596 first_cell_nr = state->pgc->program_map[state->pgN-1]; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
597 /* Find end cell of program */ |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
598 if(state->pgN < state->pgc->nr_of_programs) |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
599 last_cell_nr = state->pgc->program_map[state->pgN] - 1; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
600 else |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
601 last_cell_nr = state->pgc->nr_of_cells; |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
602 for (i = first_cell_nr; i <= last_cell_nr; i++) |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
603 cell_event->pg_length += |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
604 dvdnav_convert_time(&state->pgc->cell_playback[i - 1].playback_time); |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
605 cell_event->pgc_length = dvdnav_convert_time(&state->pgc->playback_time); |
151 | 606 |
607 cell_event->cell_start = 0; | |
608 for (i = 1; i < state->cellN; i++) | |
609 cell_event->cell_start += | |
610 dvdnav_convert_time(&state->pgc->cell_playback[i - 1].playback_time); | |
161 | 611 |
612 cell_event->pg_start = 0; | |
613 for (i = 1; i < state->pgc->program_map[state->pgN-1]; i++) | |
614 cell_event->pg_start += | |
615 dvdnav_convert_time(&state->pgc->cell_playback[i - 1].playback_time); | |
616 | |
114 | 617 this->position_current.cell = this->position_next.cell; |
50
578ce1d41479
Rename some of the functions in vm.c to help readability.
jcdutton
parents:
45
diff
changeset
|
618 this->position_current.cell_restart = this->position_next.cell_restart; |
114 | 619 this->position_current.cell_start = this->position_next.cell_start; |
620 this->position_current.block = this->position_next.block; | |
621 | |
622 /* vobu info is used for mid cell resumes */ | |
623 this->vobu.vobu_start = this->position_next.cell_start + this->position_next.block; | |
624 this->vobu.vobu_next = 0; | |
127 | 625 /* Make blockN == vobu_length to do expected_nav */ |
114 | 626 this->vobu.vobu_length = 0; |
127 | 627 this->vobu.blockN = 0; |
114 | 628 |
629 /* update the spu palette at least on PGC changes */ | |
630 this->spu_clut_changed = 1; | |
631 this->position_current.spu_channel = -1; /* Force an update */ | |
632 this->position_current.audio_channel = -1; /* Force an update */ | |
633 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
634 pthread_mutex_unlock(&this->vm_lock); |
193 | 635 return DVDNAV_STATUS_OK; |
0 | 636 } |
637 | |
114 | 638 /* has the CLUT changed? */ |
639 if(this->spu_clut_changed) { | |
640 (*event) = DVDNAV_SPU_CLUT_CHANGE; | |
641 #ifdef LOG_DEBUG | |
642 fprintf(MSG_OUT, "libdvdnav: SPU_CLUT_CHANGE\n"); | |
643 #endif | |
644 (*len) = 16 * sizeof(uint32_t); | |
645 memcpy(*buf, &(state->pgc->palette), 16 * sizeof(uint32_t)); | |
646 this->spu_clut_changed = 0; | |
647 pthread_mutex_unlock(&this->vm_lock); | |
193 | 648 return DVDNAV_STATUS_OK; |
114 | 649 } |
650 | |
651 /* has the SPU channel changed? */ | |
652 if(this->position_current.spu_channel != this->position_next.spu_channel) { | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
653 dvdnav_spu_stream_change_event_t *stream_change = (dvdnav_spu_stream_change_event_t *)*buf; |
114 | 654 |
655 (*event) = DVDNAV_SPU_STREAM_CHANGE; | |
656 #ifdef LOG_DEBUG | |
657 fprintf(MSG_OUT, "libdvdnav: SPU_STREAM_CHANGE\n"); | |
658 #endif | |
659 (*len) = sizeof(dvdnav_spu_stream_change_event_t); | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
660 stream_change->physical_wide = vm_get_subp_active_stream(this->vm, 0); |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
661 stream_change->physical_letterbox = vm_get_subp_active_stream(this->vm, 1); |
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
662 stream_change->physical_pan_scan = vm_get_subp_active_stream(this->vm, 2); |
114 | 663 this->position_current.spu_channel = this->position_next.spu_channel; |
664 #ifdef LOG_DEBUG | |
143
0b302ca31859
merge James fixes from xine-lib cvs back into libdvdnav cvs so they will not be lost
mroi
parents:
142
diff
changeset
|
665 fprintf(MSG_OUT, "libdvdnav: SPU_STREAM_CHANGE stream_id_wide=%d\n",stream_change->physical_wide); |
0b302ca31859
merge James fixes from xine-lib cvs back into libdvdnav cvs so they will not be lost
mroi
parents:
142
diff
changeset
|
666 fprintf(MSG_OUT, "libdvdnav: SPU_STREAM_CHANGE stream_id_letterbox=%d\n",stream_change->physical_letterbox); |
0b302ca31859
merge James fixes from xine-lib cvs back into libdvdnav cvs so they will not be lost
mroi
parents:
142
diff
changeset
|
667 fprintf(MSG_OUT, "libdvdnav: SPU_STREAM_CHANGE stream_id_pan_scan=%d\n",stream_change->physical_pan_scan); |
249
5d643668f1e3
I added this code myself a long time ago, but now I am quite convinced that
mroi
parents:
231
diff
changeset
|
668 fprintf(MSG_OUT, "libdvdnav: SPU_STREAM_CHANGE returning DVDNAV_STATUS_OK\n"); |
114 | 669 #endif |
249
5d643668f1e3
I added this code myself a long time ago, but now I am quite convinced that
mroi
parents:
231
diff
changeset
|
670 pthread_mutex_unlock(&this->vm_lock); |
5d643668f1e3
I added this code myself a long time ago, but now I am quite convinced that
mroi
parents:
231
diff
changeset
|
671 return DVDNAV_STATUS_OK; |
114 | 672 } |
0 | 673 |
114 | 674 /* has the audio channel changed? */ |
675 if(this->position_current.audio_channel != this->position_next.audio_channel) { | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
676 dvdnav_audio_stream_change_event_t *stream_change = (dvdnav_audio_stream_change_event_t *)*buf; |
114 | 677 |
678 (*event) = DVDNAV_AUDIO_STREAM_CHANGE; | |
679 #ifdef LOG_DEBUG | |
680 fprintf(MSG_OUT, "libdvdnav: AUDIO_STREAM_CHANGE\n"); | |
681 #endif | |
682 (*len) = sizeof(dvdnav_audio_stream_change_event_t); | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
683 stream_change->physical = vm_get_audio_active_stream( this->vm ); |
114 | 684 this->position_current.audio_channel = this->position_next.audio_channel; |
685 #ifdef LOG_DEBUG | |
193 | 686 fprintf(MSG_OUT, "libdvdnav: AUDIO_STREAM_CHANGE stream_id=%d returning DVDNAV_STATUS_OK\n",stream_change->physical); |
114 | 687 #endif |
688 pthread_mutex_unlock(&this->vm_lock); | |
193 | 689 return DVDNAV_STATUS_OK; |
114 | 690 } |
691 | |
692 /* Check the STILLFRAME flag */ | |
693 if(this->position_current.still != 0) { | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
694 dvdnav_still_event_t *still_event = (dvdnav_still_event_t *)*buf; |
114 | 695 |
696 (*event) = DVDNAV_STILL_FRAME; | |
697 #ifdef LOG_DEBUG | |
698 fprintf(MSG_OUT, "libdvdnav: STILL_FRAME\n"); | |
699 #endif | |
700 (*len) = sizeof(dvdnav_still_event_t); | |
134
d9d75a22a061
- new event on cell changes to report program and cell number and some time info
mroi
parents:
127
diff
changeset
|
701 still_event->length = this->position_current.still; |
114 | 702 pthread_mutex_unlock(&this->vm_lock); |
194 | 703 return DVDNAV_STATUS_OK; |
114 | 704 } |
705 | |
706 /* Have we reached the end of a VOBU? */ | |
707 if (this->vobu.blockN >= this->vobu.vobu_length) { | |
708 | |
709 /* Have we reached the end of a cell? */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
710 if(this->vobu.vobu_next == SRI_END_OF_CELL) { |
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
711 /* End of Cell from NAV DSI info */ |
31 | 712 #ifdef LOG_DEBUG |
76 | 713 fprintf(MSG_OUT, "libdvdnav: Still set to %x\n", this->position_next.still); |
31 | 714 #endif |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
715 this->position_current.still = this->position_next.still; |
0 | 716 |
116 | 717 /* we are about to leave a cell, so a lot of state changes could occur; |
718 * under certain conditions, the application should get in sync with us before this, | |
719 * otherwise it might show stills or menus too shortly */ | |
720 if ((this->position_current.still || this->pci.hli.hl_gi.hli_ss) && !this->sync_wait_skip) { | |
721 this->sync_wait = 1; | |
722 } else { | |
723 if( this->position_current.still == 0 || this->skip_still ) { | |
724 /* no active cell still -> get us to the next cell */ | |
725 vm_get_next_cell(this->vm); | |
726 this->position_current.still = 0; /* still gets activated at end of cell */ | |
727 this->skip_still = 0; | |
728 this->sync_wait_skip = 0; | |
729 } | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
730 } |
114 | 731 /* handle related state changes in next iteration */ |
732 (*event) = DVDNAV_NOP; | |
733 (*len) = 0; | |
734 pthread_mutex_unlock(&this->vm_lock); | |
193 | 735 return DVDNAV_STATUS_OK; |
114 | 736 } |
0 | 737 |
114 | 738 /* Perform remapping jump if necessary (this is always a |
0 | 739 * VOBU boundary). */ |
114 | 740 if (this->vm->map) { |
741 this->vobu.vobu_next = remap_block( this->vm->map, | |
742 this->vm->state.domain, this->vm->state.TTN_REG, | |
743 this->vm->state.pgN, | |
744 this->vobu.vobu_start, this->vobu.vobu_next); | |
745 } | |
0 | 746 |
114 | 747 /* at the start of the next VOBU -> expecting NAV packet */ |
45 | 748 result = dvdnav_read_cache_block(this->cache, this->vobu.vobu_start + this->vobu.vobu_next, 1, buf); |
0 | 749 |
750 if(result <= 0) { | |
751 printerr("Error reading NAV packet."); | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
752 pthread_mutex_unlock(&this->vm_lock); |
193 | 753 return DVDNAV_STATUS_ERR; |
0 | 754 } |
114 | 755 /* Decode nav into pci and dsi. Then get next VOBU info. */ |
756 if(!dvdnav_decode_packet(this, *buf, &this->dsi, &this->pci)) { | |
0 | 757 printerr("Expected NAV packet but none found."); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
758 pthread_mutex_unlock(&this->vm_lock); |
193 | 759 return DVDNAV_STATUS_ERR; |
0 | 760 } |
114 | 761 /* We need to update the vm state->blockN with which VOBU we are in. |
762 * This is so RSM resumes to the VOBU level and not just the CELL level. | |
28 | 763 */ |
114 | 764 this->vm->state.blockN = this->vobu.vobu_start - this->position_current.cell_start; |
765 | |
766 dvdnav_get_vobu(this, &this->dsi, &this->pci, &this->vobu); | |
767 this->vobu.blockN = 0; | |
768 /* Give the cache a hint about the size of next VOBU. | |
769 * This improves pre-caching, because the VOBU will almost certainly be read entirely. | |
45 | 770 */ |
771 dvdnav_pre_cache_blocks(this->cache, this->vobu.vobu_start+1, this->vobu.vobu_length+1); | |
0 | 772 |
191
dbea22936623
when a command has been issued to leave a menu, filter all further commands
mroi
parents:
179
diff
changeset
|
773 /* release NAV menu filter, when we reach the same NAV packet again */ |
dbea22936623
when a command has been issued to leave a menu, filter all further commands
mroi
parents:
179
diff
changeset
|
774 if (this->last_cmd_nav_lbn == this->pci.pci_gi.nv_pck_lbn) |
198
373f27da196b
This one should also be reset to an invalid value, but 0 is not invalid.
mroi
parents:
197
diff
changeset
|
775 this->last_cmd_nav_lbn = SRI_END_OF_CELL; |
191
dbea22936623
when a command has been issued to leave a menu, filter all further commands
mroi
parents:
179
diff
changeset
|
776 |
0 | 777 /* Successfully got a NAV packet */ |
778 (*event) = DVDNAV_NAV_PACKET; | |
114 | 779 #ifdef LOG_DEBUG |
780 fprintf(MSG_OUT, "libdvdnav: NAV_PACKET\n"); | |
781 #endif | |
3
328eadb3f37e
Added initial example programs directory and make sure all debug/error output goes to stderr.
richwareham
parents:
0
diff
changeset
|
782 (*len) = 2048; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
783 pthread_mutex_unlock(&this->vm_lock); |
193 | 784 return DVDNAV_STATUS_OK; |
0 | 785 } |
786 | |
787 /* If we've got here, it must just be a normal block. */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
788 if(!this->file) { |
114 | 789 printerr("Attempting to read without opening file."); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
790 pthread_mutex_unlock(&this->vm_lock); |
193 | 791 return DVDNAV_STATUS_ERR; |
0 | 792 } |
793 | |
114 | 794 this->vobu.blockN++; |
34
1f29402ef2ef
'Objectified' the read-ahead cache in preparation to implement a 'proper' threaded cache a-la that recommended in the DVD Demystified book.
richwareham
parents:
33
diff
changeset
|
795 result = dvdnav_read_cache_block(this->cache, this->vobu.vobu_start + this->vobu.blockN, 1, buf); |
0 | 796 if(result <= 0) { |
797 printerr("Error reading from DVD."); | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
798 pthread_mutex_unlock(&this->vm_lock); |
193 | 799 return DVDNAV_STATUS_ERR; |
0 | 800 } |
114 | 801 (*event) = DVDNAV_BLOCK_OK; |
0 | 802 (*len) = 2048; |
803 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
804 pthread_mutex_unlock(&this->vm_lock); |
193 | 805 return DVDNAV_STATUS_OK; |
0 | 806 } |
807 | |
114 | 808 dvdnav_status_t dvdnav_get_title_string(dvdnav_t *this, const char **title_str) { |
809 | |
810 if(!this || !title_str) { | |
811 printerr("Passed a NULL pointer."); | |
193 | 812 return DVDNAV_STATUS_ERR; |
114 | 813 } |
814 | |
815 (*title_str) = this->vm->dvd_name; | |
193 | 816 return DVDNAV_STATUS_OK; |
114 | 817 } |
818 | |
819 uint8_t dvdnav_get_video_aspect(dvdnav_t *this) { | |
820 uint8_t retval; | |
821 | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
822 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
823 printerr("Passed a NULL pointer."); |
114 | 824 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
825 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
826 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
827 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
828 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
829 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
830 |
114 | 831 pthread_mutex_lock(&this->vm_lock); |
832 retval = (uint8_t)vm_get_video_aspect(this->vm); | |
833 pthread_mutex_unlock(&this->vm_lock); | |
834 | |
835 return retval; | |
836 } | |
837 | |
838 uint8_t dvdnav_get_video_scale_permission(dvdnav_t *this) { | |
839 uint8_t retval; | |
840 | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
841 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
842 printerr("Passed a NULL pointer."); |
114 | 843 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
844 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
845 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
846 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
847 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
848 } |
114 | 849 |
850 pthread_mutex_lock(&this->vm_lock); | |
851 retval = (uint8_t)vm_get_video_scale_permission(this->vm); | |
852 pthread_mutex_unlock(&this->vm_lock); | |
853 | |
854 return retval; | |
855 } | |
856 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
857 uint16_t dvdnav_audio_stream_to_lang(dvdnav_t *this, uint8_t stream) { |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
858 audio_attr_t attr; |
0 | 859 |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
860 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
861 printerr("Passed a NULL pointer."); |
0 | 862 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
863 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
864 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
865 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
866 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
867 } |
0 | 868 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
869 pthread_mutex_lock(&this->vm_lock); |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
870 attr = vm_get_audio_attr(this->vm, stream); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
871 pthread_mutex_unlock(&this->vm_lock); |
0 | 872 |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
873 if(attr.lang_type != 1) |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
874 return 0xffff; |
0 | 875 |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
876 return attr.lang_code; |
0 | 877 } |
878 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
879 uint16_t dvdnav_spu_stream_to_lang(dvdnav_t *this, uint8_t stream) { |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
880 subp_attr_t attr; |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
881 |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
882 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
883 printerr("Passed a NULL pointer."); |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
884 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
885 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
886 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
887 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
888 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
889 } |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
890 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
891 pthread_mutex_lock(&this->vm_lock); |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
892 attr = vm_get_subp_attr(this->vm, stream); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
893 pthread_mutex_unlock(&this->vm_lock); |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
894 |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
895 if(attr.type != 1) |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
896 return 0xffff; |
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
897 |
25
df024077cbc1
Why rewrite vm function, use it instead (this remark is for me, of course ;-) ).
f1rmb
parents:
24
diff
changeset
|
898 return attr.lang_code; |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
899 } |
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
900 |
114 | 901 int8_t dvdnav_get_audio_logical_stream(dvdnav_t *this, uint8_t audio_num) { |
902 int8_t retval; | |
903 | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
904 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
905 printerr("Passed a NULL pointer."); |
114 | 906 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
907 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
908 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
909 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
910 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
911 } |
114 | 912 |
913 pthread_mutex_lock(&this->vm_lock); | |
914 if (!this->vm->state.pgc) { | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
915 printerr("No current PGC."); |
114 | 916 pthread_mutex_unlock(&this->vm_lock); |
917 return -1; | |
918 } | |
919 retval = vm_get_audio_stream(this->vm, audio_num); | |
920 pthread_mutex_unlock(&this->vm_lock); | |
921 | |
922 return retval; | |
923 } | |
924 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
925 int8_t dvdnav_get_spu_logical_stream(dvdnav_t *this, uint8_t subp_num) { |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
926 int8_t retval; |
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
927 |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
928 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
929 printerr("Passed a NULL pointer."); |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
930 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
931 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
932 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
933 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
934 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
935 } |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
936 |
114 | 937 pthread_mutex_lock(&this->vm_lock); |
938 if (!this->vm->state.pgc) { | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
939 printerr("No current PGC."); |
114 | 940 pthread_mutex_unlock(&this->vm_lock); |
941 return -1; | |
942 } | |
943 retval = vm_get_subp_stream(this->vm, subp_num, 0); | |
944 pthread_mutex_unlock(&this->vm_lock); | |
945 | |
946 return retval; | |
947 } | |
948 | |
949 int8_t dvdnav_get_active_audio_stream(dvdnav_t *this) { | |
950 int8_t retval; | |
951 | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
952 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
953 printerr("Passed a NULL pointer."); |
114 | 954 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
955 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
956 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
957 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
958 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
959 } |
114 | 960 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
961 pthread_mutex_lock(&this->vm_lock); |
114 | 962 if (!this->vm->state.pgc) { |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
963 printerr("No current PGC."); |
114 | 964 pthread_mutex_unlock(&this->vm_lock); |
965 return -1; | |
966 } | |
967 retval = vm_get_audio_active_stream(this->vm); | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
968 pthread_mutex_unlock(&this->vm_lock); |
114 | 969 |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
970 return retval; |
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
971 } |
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
972 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
973 int8_t dvdnav_get_active_spu_stream(dvdnav_t *this) { |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
974 int8_t retval; |
0 | 975 |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
976 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
977 printerr("Passed a NULL pointer."); |
0 | 978 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
979 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
980 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
981 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
982 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
983 } |
0 | 984 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
985 pthread_mutex_lock(&this->vm_lock); |
114 | 986 if (!this->vm->state.pgc) { |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
987 printerr("No current PGC."); |
114 | 988 pthread_mutex_unlock(&this->vm_lock); |
989 return -1; | |
990 } | |
991 retval = vm_get_subp_active_stream(this->vm, 0); | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
992 pthread_mutex_unlock(&this->vm_lock); |
0 | 993 |
21
d2d73f2ad8d3
Change/fix SPU active stream id. Same for audio. Few new functions, largely
f1rmb
parents:
17
diff
changeset
|
994 return retval; |
0 | 995 } |
996 | |
114 | 997 static int8_t dvdnav_is_domain(dvdnav_t *this, domain_t domain) { |
998 int8_t retval; | |
999 | |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1000 if(!this) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1001 printerr("Passed a NULL pointer."); |
114 | 1002 return -1; |
142
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1003 } |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1004 if(!this->started) { |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1005 printerr("Virtual DVD machine not started."); |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1006 return -1; |
e375b765ebf5
some more sanity checking will prevent segfaults in these functions
mroi
parents:
141
diff
changeset
|
1007 } |
114 | 1008 |
1009 pthread_mutex_lock(&this->vm_lock); | |
1010 retval = (this->vm->state.domain == domain); | |
1011 pthread_mutex_unlock(&this->vm_lock); | |
1012 | |
1013 return retval; | |
1014 } | |
1015 | |
0 | 1016 /* First Play domain. (Menu) */ |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1017 int8_t dvdnav_is_domain_fp(dvdnav_t *this) { |
114 | 1018 return dvdnav_is_domain(this, FP_DOMAIN); |
0 | 1019 } |
1020 /* Video management Menu domain. (Menu) */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1021 int8_t dvdnav_is_domain_vmgm(dvdnav_t *this) { |
114 | 1022 return dvdnav_is_domain(this, VMGM_DOMAIN); |
0 | 1023 } |
1024 /* Video Title Menu domain (Menu) */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1025 int8_t dvdnav_is_domain_vtsm(dvdnav_t *this) { |
114 | 1026 return dvdnav_is_domain(this, VTSM_DOMAIN); |
0 | 1027 } |
1028 /* Video Title domain (playing movie). */ | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1029 int8_t dvdnav_is_domain_vts(dvdnav_t *this) { |
114 | 1030 return dvdnav_is_domain(this, VTS_DOMAIN); |
0 | 1031 } |
1032 | |
114 | 1033 /* Generally delegate angle information handling to VM */ |
195 | 1034 dvdnav_status_t dvdnav_angle_change(dvdnav_t *this, int32_t angle) { |
1035 int32_t num, current; | |
0 | 1036 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1037 if(!this) { |
114 | 1038 printerr("Passed a NULL pointer."); |
193 | 1039 return DVDNAV_STATUS_ERR; |
0 | 1040 } |
1041 | |
114 | 1042 pthread_mutex_lock(&this->vm_lock); |
1043 vm_get_angle_info(this->vm, ¤t, &num); | |
0 | 1044 /* Set angle SPRM if valid */ |
1045 if((angle > 0) && (angle <= num)) { | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1046 this->vm->state.AGL_REG = angle; |
0 | 1047 } else { |
114 | 1048 printerr("Passed an invalid angle number."); |
1049 pthread_mutex_unlock(&this->vm_lock); | |
193 | 1050 return DVDNAV_STATUS_ERR; |
0 | 1051 } |
114 | 1052 pthread_mutex_unlock(&this->vm_lock); |
0 | 1053 |
193 | 1054 return DVDNAV_STATUS_OK; |
0 | 1055 } |
1056 | |
195 | 1057 dvdnav_status_t dvdnav_get_angle_info(dvdnav_t *this, int32_t *current_angle, |
1058 int32_t *number_of_angles) { | |
114 | 1059 if(!this || !current_angle || !number_of_angles) { |
1060 printerr("Passed a NULL pointer."); | |
193 | 1061 return DVDNAV_STATUS_ERR; |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
21
diff
changeset
|
1062 } |
114 | 1063 |
1064 pthread_mutex_lock(&this->vm_lock); | |
1065 vm_get_angle_info(this->vm, current_angle, number_of_angles); | |
1066 pthread_mutex_unlock(&this->vm_lock); | |
1067 | |
193 | 1068 return DVDNAV_STATUS_OK; |
114 | 1069 } |
0 | 1070 |
67
61c0ee1bbb7a
Moved get_current_nav_pci into dvdnac.c, changed example to use it instead of 'home-rolled'
richwareham
parents:
66
diff
changeset
|
1071 pci_t* dvdnav_get_current_nav_pci(dvdnav_t *this) { |
114 | 1072 if(!this) return 0; |
67
61c0ee1bbb7a
Moved get_current_nav_pci into dvdnac.c, changed example to use it instead of 'home-rolled'
richwareham
parents:
66
diff
changeset
|
1073 return &this->pci; |
61c0ee1bbb7a
Moved get_current_nav_pci into dvdnac.c, changed example to use it instead of 'home-rolled'
richwareham
parents:
66
diff
changeset
|
1074 } |
61c0ee1bbb7a
Moved get_current_nav_pci into dvdnac.c, changed example to use it instead of 'home-rolled'
richwareham
parents:
66
diff
changeset
|
1075 |
66
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1076 dsi_t* dvdnav_get_current_nav_dsi(dvdnav_t *this) { |
114 | 1077 if(!this) return 0; |
66
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1078 return &this->dsi; |
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1079 } |
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1080 |
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1081 uint32_t dvdnav_get_next_still_flag(dvdnav_t *this) { |
114 | 1082 if(!this) return -1; |
66
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1083 return this->position_next.still; |
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1084 } |
2bd4a78eefce
Patch from aschultz@cs.uni-magdeburg.de to allow for still-frame 'peek-ahead'
richwareham
parents:
60
diff
changeset
|
1085 |