Mercurial > mplayer.hg
annotate stream/stream_dvd.c @ 30811:50e0f6942e43
Implement Win32 mutexes.
Implement Win32 mutexes; they used to just be mapped on top of events, which
is not the same thing at all.
The implementation is pretty much the obvious one, similar to the
current critical section implementation and the semaphore implementation;
a single lock count protected by a pthread mutex, and an event lockers can
sleep on to know when the mutex is available.
Also make CreateMutexA and ReleaseMutex available even if QuickTime codecs
support is not configured.
author | sesse |
---|---|
date | Sat, 06 Mar 2010 10:13:37 +0000 |
parents | 74a6c2a3dcce |
children | 61517b367d31 |
rev | line source |
---|---|
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
1 /* |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
2 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
7 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
12 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
13 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
17 */ |
15518 | 18 |
19 #include <ctype.h> | |
20 #include <stdio.h> | |
21 #include <stdlib.h> | |
22 #include <string.h> | |
23 #include <unistd.h> | |
24 #include <string.h> | |
25 | |
26 #include "config.h" | |
27 #include "mp_msg.h" | |
28 #include "help_mp.h" | |
29 | |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
30 #include <libgen.h> |
25031
5e1e61012a05
report why the dvd couldn't be opened. Patch by Jan Knutar jknutar+nic+fi
nicodvb
parents:
24986
diff
changeset
|
31 #include <errno.h> |
5e1e61012a05
report why the dvd couldn't be opened. Patch by Jan Knutar jknutar+nic+fi
nicodvb
parents:
24986
diff
changeset
|
32 |
16649
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
33 #define FIRST_AC3_AID 128 |
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
34 #define FIRST_DTS_AID 136 |
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
35 #define FIRST_MPG_AID 0 |
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
36 #define FIRST_PCM_AID 160 |
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
37 |
15518 | 38 #include "stream.h" |
17012 | 39 #include "m_option.h" |
40 #include "m_struct.h" | |
15518 | 41 |
18682
bee3186a06f7
include stream_dvd's interface from libmpdemux/stream_dvd.h
nicodvb
parents:
18366
diff
changeset
|
42 #include "stream_dvd.h" |
23993 | 43 #include "stream_dvd_common.h" |
21926
a8cd73869242
at open() assign *file_format=DEMUXER_TYPE_MPEG_PS to avoid useless demuxer probing
nicodvb
parents:
21731
diff
changeset
|
44 #include "libmpdemux/demuxer.h" |
18682
bee3186a06f7
include stream_dvd's interface from libmpdemux/stream_dvd.h
nicodvb
parents:
18366
diff
changeset
|
45 |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
46 static char* dvd_device_current; |
15518 | 47 int dvd_angle=1; |
48 | |
17257 | 49 #define LIBDVDREAD_VERSION(maj,min,micro) ((maj)*10000 + (min)*100 + (micro)) |
15518 | 50 /* |
51 * Try to autodetect the libdvd-0.9.0 library | |
52 * (0.9.0 removed the <dvdread/dvd_udf.h> header, and moved the two defines | |
53 * DVD_VIDEO_LB_LEN and MAX_UDF_FILE_NAME_LEN from it to | |
54 * <dvdread/dvd_reader.h>) | |
55 */ | |
17257 | 56 #ifndef DVDREAD_VERSION |
15518 | 57 #if defined(DVD_VIDEO_LB_LEN) && defined(MAX_UDF_FILE_NAME_LEN) |
17257 | 58 #define DVDREAD_VERSION LIBDVDREAD_VERSION(0,9,0) |
15518 | 59 #else |
17257 | 60 #define DVDREAD_VERSION LIBDVDREAD_VERSION(0,8,0) |
61 #endif | |
15518 | 62 #endif |
63 | |
64 | |
65 static struct stream_priv_s { | |
66 int title; | |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
67 char* device; |
15518 | 68 } stream_priv_dflts = { |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
69 1, |
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
70 NULL |
15518 | 71 }; |
72 | |
73 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
74 /// URL definition | |
25242 | 75 static const m_option_t stream_opts_fields[] = { |
27235
ea35e46aa7af
in dvd streams the title part ranges from 1 to 99
nicodvb
parents:
27194
diff
changeset
|
76 { "hostname", ST_OFF(title), CONF_TYPE_INT, M_OPT_RANGE, 1, 99, NULL}, |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
77 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
15518 | 78 { NULL, NULL, 0, 0, 0, 0, NULL } |
79 }; | |
25691 | 80 static const struct m_struct_st stream_opts = { |
15518 | 81 "dvd", |
82 sizeof(struct stream_priv_s), | |
83 &stream_priv_dflts, | |
84 stream_opts_fields | |
85 }; | |
86 | |
25232
893db6cc97b2
Add appropriate const specifiers to some custom parse functions.
reimar
parents:
25211
diff
changeset
|
87 int dvd_parse_chapter_range(const m_option_t *conf, const char *range) { |
15518 | 88 const char *s; |
89 char *t; | |
90 if (!range) | |
91 return M_OPT_MISSING_PARAM; | |
92 s = range; | |
93 dvd_chapter = 1; | |
94 dvd_last_chapter = 0; | |
95 if(*range && isdigit(*range)) { | |
96 dvd_chapter = strtol(range, &s, 10); | |
97 if(range == s) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
98 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_DVDinvalidChapterRange, range); |
15518 | 99 return M_OPT_INVALID; |
100 } | |
101 } | |
102 if(*s == 0) | |
103 return 0; | |
104 else if(*s != '-') { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
105 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_DVDinvalidChapterRange, range); |
15518 | 106 return M_OPT_INVALID; |
107 } | |
108 ++s; | |
109 if(*s == 0) | |
110 return 0; | |
111 if(! isdigit(*s)) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
112 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_DVDinvalidChapterRange, range); |
15518 | 113 return M_OPT_INVALID; |
114 } | |
115 dvd_last_chapter = strtol(s, &t, 10); | |
116 if (s == t || *t) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
117 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_DVDinvalidChapterRange, range); |
15518 | 118 return M_OPT_INVALID; |
119 } | |
120 return 0; | |
121 } | |
122 | |
123 int dvd_chapter_from_cell(dvd_priv_t* dvd,int title,int cell) | |
124 { | |
125 pgc_t * cur_pgc; | |
126 ptt_info_t* ptt; | |
127 int chapter = cell; | |
128 int pgc_id,pgn; | |
129 if(title < 0 || cell < 0){ | |
130 return 0; | |
131 } | |
132 /* for most DVD's chapter == cell */ | |
133 /* but there are more complecated cases... */ | |
134 if(chapter >= dvd->vmg_file->tt_srpt->title[title].nr_of_ptts) { | |
135 chapter = dvd->vmg_file->tt_srpt->title[title].nr_of_ptts-1; | |
136 } | |
137 title = dvd->tt_srpt->title[title].vts_ttn-1; | |
138 ptt = dvd->vts_file->vts_ptt_srpt->title[title].ptt; | |
139 while(chapter >= 0) { | |
140 pgc_id = ptt[chapter].pgcn; | |
141 pgn = ptt[chapter].pgn; | |
142 cur_pgc = dvd->vts_file->vts_pgcit->pgci_srp[pgc_id-1].pgc; | |
143 if(cell >= cur_pgc->program_map[pgn-1]-1) { | |
144 return chapter; | |
145 } | |
146 --chapter; | |
147 } | |
148 /* didn't find a chapter ??? */ | |
149 return chapter; | |
150 } | |
151 | |
20156 | 152 int dvd_lang_from_aid(stream_t *stream, int id) { |
153 dvd_priv_t *d; | |
20158 | 154 int i; |
20156 | 155 if (!stream) return 0; |
156 d = stream->priv; | |
157 if (!d) return 0; | |
158 for(i=0;i<d->nr_of_channels;i++) { | |
159 if(d->audio_streams[i].id==id) | |
160 return d->audio_streams[i].language; | |
161 } | |
162 return 0; | |
163 } | |
164 | |
15518 | 165 int dvd_aid_from_lang(stream_t *stream, unsigned char* lang) { |
166 dvd_priv_t *d=stream->priv; | |
167 int code,i; | |
168 if(lang) { | |
169 while(strlen(lang)>=2) { | |
170 code=lang[1]|(lang[0]<<8); | |
171 for(i=0;i<d->nr_of_channels;i++) { | |
172 if(d->audio_streams[i].language==code) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
173 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_DVDaudioChannel, |
15518 | 174 d->audio_streams[i].id, lang[0],lang[1]); |
175 return d->audio_streams[i].id; | |
176 } | |
177 //printf("%X != %X (%c%c)\n",code,d->audio_streams[i].language,lang[0],lang[1]); | |
178 } | |
179 lang+=2; while (lang[0]==',' || lang[0]==' ') ++lang; | |
180 } | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
181 mp_msg(MSGT_OPEN,MSGL_WARN,MSGTR_DVDnoMatchingAudio); |
15518 | 182 } |
183 return -1; | |
184 } | |
185 | |
186 int dvd_number_of_subs(stream_t *stream) { | |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
187 int i; |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
188 int maxid = -1; |
15518 | 189 dvd_priv_t *d; |
190 if (!stream) return -1; | |
191 d = stream->priv; | |
192 if (!d) return -1; | |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
193 for (i = 0; i < d->nr_of_subtitles; i++) |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
194 if (d->subtitles[i].id > maxid) maxid = d->subtitles[i].id; |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
195 return maxid + 1; |
15518 | 196 } |
197 | |
198 int dvd_lang_from_sid(stream_t *stream, int id) { | |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
199 int i; |
15518 | 200 dvd_priv_t *d; |
201 if (!stream) return 0; | |
202 d = stream->priv; | |
203 if (!d) return 0; | |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
204 for (i = 0; i < d->nr_of_subtitles; i++) |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
205 if (d->subtitles[i].id == id && d->subtitles[i].language) return d->subtitles[i].language; |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
206 return 0; |
15518 | 207 } |
208 | |
209 int dvd_sid_from_lang(stream_t *stream, unsigned char* lang) { | |
210 dvd_priv_t *d=stream->priv; | |
211 int code,i; | |
212 while(lang && strlen(lang)>=2) { | |
213 code=lang[1]|(lang[0]<<8); | |
214 for(i=0;i<d->nr_of_subtitles;i++) { | |
215 if(d->subtitles[i].language==code) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
216 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_DVDsubtitleChannel, i, lang[0],lang[1]); |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
217 return d->subtitles[i].id; |
15518 | 218 } |
219 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
220 lang+=2; |
15518 | 221 while (lang[0]==',' || lang[0]==' ') ++lang; |
222 } | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
223 mp_msg(MSGT_OPEN,MSGL_WARN,MSGTR_DVDnoMatchingSubtitle); |
15518 | 224 return -1; |
225 } | |
226 | |
227 static int dvd_next_cell(dvd_priv_t *d) { | |
228 int next_cell=d->cur_cell; | |
229 | |
15551
f62be65f7df3
Reduce senseless spamminess of DVD playback in verbose mode.
diego
parents:
15518
diff
changeset
|
230 mp_msg(MSGT_DVD,MSGL_DBG2, "dvd_next_cell: next1=0x%X \n",next_cell); |
15518 | 231 if( d->cur_pgc->cell_playback[ next_cell ].block_type == BLOCK_TYPE_ANGLE_BLOCK ) { |
232 while(next_cell<d->last_cell) { | |
233 if( d->cur_pgc->cell_playback[next_cell].block_mode == BLOCK_MODE_LAST_CELL ) | |
234 break; | |
235 ++next_cell; | |
236 } | |
237 } | |
15551
f62be65f7df3
Reduce senseless spamminess of DVD playback in verbose mode.
diego
parents:
15518
diff
changeset
|
238 mp_msg(MSGT_DVD,MSGL_DBG2, "dvd_next_cell: next2=0x%X \n",next_cell); |
15518 | 239 |
240 ++next_cell; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
241 if(next_cell>=d->last_cell) |
15518 | 242 return -1; // EOF |
243 if(d->cur_pgc->cell_playback[next_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK ) { | |
244 next_cell+=dvd_angle; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
245 if(next_cell>=d->last_cell) |
15518 | 246 return -1; // EOF |
247 } | |
15551
f62be65f7df3
Reduce senseless spamminess of DVD playback in verbose mode.
diego
parents:
15518
diff
changeset
|
248 mp_msg(MSGT_DVD,MSGL_DBG2, "dvd_next_cell: next3=0x%X \n",next_cell); |
15518 | 249 return next_cell; |
250 } | |
251 | |
30557
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
252 static int dvd_read_sector(dvd_priv_t *d, unsigned char *data) |
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
253 { |
15518 | 254 int len; |
255 | |
256 if(d->packs_left==0) { | |
257 /** | |
258 * If we're not at the end of this cell, we can determine the next | |
259 * VOBU to display using the VOBU_SRI information section of the | |
260 * DSI. Using this value correctly follows the current angle, | |
261 * avoiding the doubled scenes in The Matrix, and makes our life | |
262 * really happy. | |
263 * | |
264 * Otherwise, we set our next address past the end of this cell to | |
265 * force the code above to go to the next cell in the program. | |
266 */ | |
267 if(d->dsi_pack.vobu_sri.next_vobu != SRI_END_OF_CELL) { | |
268 d->cur_pack= d->dsi_pack.dsi_gi.nv_pck_lbn + ( d->dsi_pack.vobu_sri.next_vobu & 0x7fffffff ); | |
269 mp_msg(MSGT_DVD,MSGL_DBG2, "Navi new pos=0x%X \n",d->cur_pack); | |
270 } else { | |
271 // end of cell! find next cell! | |
272 mp_msg(MSGT_DVD,MSGL_V, "--- END OF CELL !!! ---\n"); | |
273 d->cur_pack=d->cell_last_pack+1; | |
274 } | |
275 } | |
276 | |
277 read_next: | |
278 if(d->cur_pack>d->cell_last_pack) { | |
279 // end of cell! | |
280 int next=dvd_next_cell(d); | |
281 if(next>=0) { | |
282 d->cur_cell=next; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
283 // if( d->cur_pgc->cell_playback[d->cur_cell].block_type |
15518 | 284 // == BLOCK_TYPE_ANGLE_BLOCK ) d->cur_cell+=dvd_angle; |
285 d->cur_pack = d->cur_pgc->cell_playback[ d->cur_cell ].first_sector; | |
286 d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector; | |
287 mp_msg(MSGT_DVD,MSGL_V, "DVD next cell: %d pack: 0x%X-0x%X \n",d->cur_cell,d->cur_pack,d->cell_last_pack); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
288 } else |
15518 | 289 return -1; // EOF |
290 } | |
291 | |
292 len = DVDReadBlocks(d->title, d->cur_pack, 1, data); | |
28181
a02653498c15
Work around a dvdread bug where DVDReadBlocks would return values < 0 on read error,
reimar
parents:
27773
diff
changeset
|
293 // only == 0 should indicate an error, but some dvdread version are buggy when used with dvdcss |
a02653498c15
Work around a dvdread bug where DVDReadBlocks would return values < 0 on read error,
reimar
parents:
27773
diff
changeset
|
294 if(len <= 0) return -1; //error |
15518 | 295 |
296 if(data[38]==0 && data[39]==0 && data[40]==1 && data[41]==0xBF && | |
297 data[1024]==0 && data[1025]==0 && data[1026]==1 && data[1027]==0xBF) { | |
298 // found a Navi packet!!! | |
17257 | 299 #if DVDREAD_VERSION >= LIBDVDREAD_VERSION(0,9,0) |
15518 | 300 navRead_DSI(&d->dsi_pack, &(data[ DSI_START_BYTE ])); |
301 #else | |
302 navRead_DSI(&d->dsi_pack, &(data[ DSI_START_BYTE ]), sizeof(dsi_t)); | |
303 #endif | |
304 if(d->cur_pack != d->dsi_pack.dsi_gi.nv_pck_lbn ) { | |
305 mp_msg(MSGT_DVD,MSGL_V, "Invalid NAVI packet! lba=0x%X navi=0x%X \n", | |
306 d->cur_pack,d->dsi_pack.dsi_gi.nv_pck_lbn); | |
307 } else { | |
308 // process! | |
309 d->packs_left = d->dsi_pack.dsi_gi.vobu_ea; | |
310 mp_msg(MSGT_DVD,MSGL_DBG2, "Found NAVI packet! lba=0x%X len=%d \n",d->cur_pack,d->packs_left); | |
311 //navPrint_DSI(&d->dsi_pack); | |
312 mp_msg(MSGT_DVD,MSGL_DBG3,"\r### CELL %d: Navi: %d/%d IFO: %d/%d \n",d->cur_cell, | |
313 d->dsi_pack.dsi_gi.vobu_c_idn,d->dsi_pack.dsi_gi.vobu_vob_idn, | |
314 d->cur_pgc->cell_position[d->cur_cell].cell_nr, | |
315 d->cur_pgc->cell_position[d->cur_cell].vob_id_nr); | |
316 | |
317 if(d->angle_seek) { | |
318 int i,skip=0; | |
319 #if defined(__GNUC__) && ( defined(__sparc__) || defined(hpux) ) | |
320 // workaround for a bug in the sparc/hpux version of gcc 2.95.X ... 3.2, | |
321 // it generates incorrect code for unaligned access to a packed | |
322 // structure member, resulting in an mplayer crash with a SIGBUS | |
323 // signal. | |
324 // | |
325 // See also gcc problem report PR c/7847: | |
326 // http://gcc.gnu.org/cgi-bin/gnatsweb.pl?database=gcc&cmd=view+audit-trail&pr=7847 | |
327 for(i=0;i<9;i++) { // check if all values zero: | |
27773
55571c85e40e
Replace typeof by __typeof__, the former is a non-portable GNU extension.
diego
parents:
27599
diff
changeset
|
328 __typeof__(d->dsi_pack.sml_agli.data[i].address) tmp_addr; |
15518 | 329 memcpy(&tmp_addr,&d->dsi_pack.sml_agli.data[i].address,sizeof(tmp_addr)); |
330 if((skip=tmp_addr)!=0) break; | |
331 } | |
332 #else | |
333 for(i=0;i<9;i++) // check if all values zero: | |
334 if((skip=d->dsi_pack.sml_agli.data[i].address)!=0) break; | |
335 #endif | |
25569
1ab8dade208c
fixed bug when playing multi-angle titles: the address field in the agli data
nicodvb
parents:
25342
diff
changeset
|
336 if(skip && skip!=0x7fffffff) { |
15518 | 337 // sml_agli table has valid data (at least one non-zero): |
338 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+ | |
339 d->dsi_pack.sml_agli.data[dvd_angle].address; | |
340 d->angle_seek=0; | |
25569
1ab8dade208c
fixed bug when playing multi-angle titles: the address field in the agli data
nicodvb
parents:
25342
diff
changeset
|
341 d->cur_pack--; |
15518 | 342 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced using sml_agli map! new_lba=0x%X \n",d->cur_pack); |
343 } else { | |
344 // check if we're in the right cell, jump otherwise: | |
345 if( (d->dsi_pack.dsi_gi.vobu_c_idn==d->cur_pgc->cell_position[d->cur_cell].cell_nr) && | |
346 (d->dsi_pack.dsi_gi.vobu_vob_idn==d->cur_pgc->cell_position[d->cur_cell].vob_id_nr) ){ | |
347 d->angle_seek=0; | |
348 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced by cell/vob IDN search! \n"); | |
349 } else { | |
350 // wrong angle, skip this vobu: | |
351 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+ | |
352 d->dsi_pack.dsi_gi.vobu_ea; | |
353 d->angle_seek=2; // DEBUG | |
354 } | |
355 } | |
356 } | |
357 } | |
358 ++d->cur_pack; | |
359 goto read_next; | |
360 } | |
361 | |
362 ++d->cur_pack; | |
363 if(d->packs_left>=0) --d->packs_left; | |
364 | |
365 if(d->angle_seek) { | |
366 if(d->angle_seek==2) mp_msg(MSGT_DVD,MSGL_V, "!!! warning! reading packet while angle_seek !!!\n"); | |
367 goto read_next; // searching for Navi packet | |
368 } | |
369 | |
370 return d->cur_pack-1; | |
371 } | |
372 | |
30557
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
373 static void dvd_seek(dvd_priv_t *d, int pos) |
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
374 { |
15518 | 375 d->packs_left=-1; |
376 d->cur_pack=pos; | |
377 | |
378 // check if we stay in current cell (speedup things, and avoid angle skip) | |
379 if(d->cur_pack>d->cell_last_pack || | |
380 d->cur_pack<d->cur_pgc->cell_playback[ d->cur_cell ].first_sector) { | |
381 | |
382 // ok, cell change, find the right cell! | |
383 d->cur_cell=0; | |
384 if(d->cur_pgc->cell_playback[d->cur_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK ) | |
385 d->cur_cell+=dvd_angle; | |
386 | |
387 while(1) { | |
388 int next; | |
389 d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector; | |
390 if(d->cur_pack<d->cur_pgc->cell_playback[ d->cur_cell ].first_sector) { | |
391 d->cur_pack=d->cur_pgc->cell_playback[ d->cur_cell ].first_sector; | |
392 break; | |
393 } | |
394 if(d->cur_pack<=d->cell_last_pack) break; // ok, we find it! :) | |
395 next=dvd_next_cell(d); | |
396 if(next<0) { | |
397 //d->cur_pack=d->cell_last_pack+1; | |
398 break; // we're after the last cell | |
399 } | |
400 d->cur_cell=next; | |
401 } | |
402 } | |
403 | |
404 mp_msg(MSGT_DVD,MSGL_V, "DVD Seek! lba=0x%X cell=%d packs: 0x%X-0x%X \n", | |
405 d->cur_pack,d->cur_cell,d->cur_pgc->cell_playback[ d->cur_cell ].first_sector,d->cell_last_pack); | |
406 | |
407 // if we're in interleaved multi-angle cell, find the right angle chain! | |
408 // (read Navi block, and use the seamless angle jump table) | |
409 d->angle_seek=1; | |
410 } | |
411 | |
30557
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
412 static void dvd_close(dvd_priv_t *d) |
74a6c2a3dcce
stream: Mark functions not used outside of their files as static.
diego
parents:
30426
diff
changeset
|
413 { |
15518 | 414 ifoClose(d->vts_file); |
415 ifoClose(d->vmg_file); | |
416 DVDCloseFile(d->title); | |
417 DVDClose(d->dvd); | |
418 dvd_chapter = 1; | |
419 dvd_last_chapter = 0; | |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
420 dvd_set_speed(dvd_device_current, -1); /* -1 => restore default */ |
15518 | 421 } |
422 | |
423 static int fill_buffer(stream_t *s, char *but, int len) | |
424 { | |
425 if(s->type == STREAMTYPE_DVD) { | |
426 off_t pos=dvd_read_sector(s->priv,s->buffer); | |
427 if(pos>=0) { | |
428 len=2048; // full sector | |
429 s->pos=2048*pos-len; | |
430 } else len=-1; // error | |
431 } | |
432 return len; | |
433 } | |
434 | |
435 static int seek(stream_t *s, off_t newpos) { | |
436 s->pos=newpos; // real seek | |
437 dvd_seek(s->priv,s->pos/2048); | |
438 return 1; | |
439 } | |
440 | |
441 static void stream_dvd_close(stream_t *s) { | |
442 dvd_close(s->priv); | |
443 } | |
444 | |
18091
71f9a4e7fd9d
remove vts_no parameter from mp_get_titleset_length - it is not only useless,
reimar
parents:
18078
diff
changeset
|
445 static int mp_get_titleset_length(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no) |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
446 { |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
447 int vts_ttn; ///< title number within video title set |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
448 int pgc_no; ///< program chain number |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
449 int msec; ///< time length in milliseconds |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
450 |
17817
560617cdcc3b
init msec in mp_get_titleset_length() before using it; closes cid 251
nicodvb
parents:
17698
diff
changeset
|
451 msec=0; |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
452 if(!vts_file || !tt_srpt) |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
453 return 0; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
454 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
455 if(vts_file->vtsi_mat && vts_file->vts_pgcit) |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
456 { |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
457 vts_ttn = tt_srpt->title[title_no].vts_ttn - 1; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
458 pgc_no = vts_file->vts_ptt_srpt->title[vts_ttn].ptt[0].pgcn - 1; |
23993 | 459 msec = mp_dvdtimetomsec(&vts_file->vts_pgcit->pgci_srp[pgc_no].pgc->playback_time); |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
460 } |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
461 return msec; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
462 } |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
463 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
464 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
465 static int mp_describe_titleset(dvd_reader_t *dvd, tt_srpt_t *tt_srpt, int vts_no) |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
466 { |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
467 ifo_handle_t *vts_file; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
468 int title_no, msec=0; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
469 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
470 vts_file = ifoOpen(dvd, vts_no); |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
471 if(!vts_file) |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
472 return 0; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
473 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
474 if(!vts_file->vtsi_mat || !vts_file->vts_pgcit) |
18078
aeb937690d3d
missing ifoClose and return 1. Patch by kiriuja (mplayer-patches at en-directo net)
reimar
parents:
18071
diff
changeset
|
475 { |
aeb937690d3d
missing ifoClose and return 1. Patch by kiriuja (mplayer-patches at en-directo net)
reimar
parents:
18071
diff
changeset
|
476 ifoClose(vts_file); |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
477 return 0; |
18078
aeb937690d3d
missing ifoClose and return 1. Patch by kiriuja (mplayer-patches at en-directo net)
reimar
parents:
18071
diff
changeset
|
478 } |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
479 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
480 for(title_no = 0; title_no < tt_srpt->nr_of_srpts; title_no++) |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
481 { |
18071
1e144ef9759b
do not print the title length from a non-matching titleset.
reimar
parents:
17817
diff
changeset
|
482 if (tt_srpt->title[title_no].title_set_nr != vts_no) |
1e144ef9759b
do not print the title length from a non-matching titleset.
reimar
parents:
17817
diff
changeset
|
483 continue; |
18091
71f9a4e7fd9d
remove vts_no parameter from mp_get_titleset_length - it is not only useless,
reimar
parents:
18078
diff
changeset
|
484 msec = mp_get_titleset_length(vts_file, tt_srpt, title_no); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
485 mp_msg(MSGT_IDENTIFY, MSGL_V, "ID_DVD_TITLE_%d_LENGTH=%d.%03d\n", title_no + 1, msec / 1000, msec % 1000); |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
486 } |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
487 ifoClose(vts_file); |
18078
aeb937690d3d
missing ifoClose and return 1. Patch by kiriuja (mplayer-patches at en-directo net)
reimar
parents:
18071
diff
changeset
|
488 return 1; |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
489 } |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
490 |
19440
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
491 static int seek_to_chapter(stream_t *stream, ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no, int chapter) |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
492 { |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
493 int cell; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
494 ptt_info_t ptt; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
495 pgc_t *pgc; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
496 off_t pos; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
497 |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
498 if(!vts_file || !tt_srpt) |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
499 return 0; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
500 |
28191
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
501 if(title_no < 0 || title_no >= tt_srpt->nr_of_srpts) |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
502 return 0; |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
503 |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
504 // map global title to vts title |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
505 title_no = tt_srpt->title[title_no].vts_ttn - 1; |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
506 |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
507 if(title_no < 0 || title_no >= vts_file->vts_ptt_srpt->nr_of_srpts) |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
508 return 0; |
a39df27439b9
Fix DVD seek_to_chapter: the title number must be converted to a per-VTS
reimar
parents:
28181
diff
changeset
|
509 |
19442
ab91d0304070
sanity check: since chapter is 0-based it can't exceed nr_of_ptts-1
nicodvb
parents:
19440
diff
changeset
|
510 if(chapter < 0 || chapter > vts_file->vts_ptt_srpt->title[title_no].nr_of_ptts-1) //no such chapter |
19440
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
511 return 0; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
512 |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
513 ptt = vts_file->vts_ptt_srpt->title[title_no].ptt[chapter]; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
514 pgc = vts_file->vts_pgcit->pgci_srp[ptt.pgcn-1].pgc; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
515 |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
516 cell = pgc->program_map[ptt.pgn - 1] - 1; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
517 pos = (off_t) pgc->cell_playback[cell].first_sector * 2048; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
518 mp_msg(MSGT_OPEN,MSGL_V,"\r\nSTREAM_DVD, seeked to chapter: %d, cell: %u, pos: %"PRIu64"\n", |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
519 chapter, pgc->cell_playback[cell].first_sector, pos); |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
520 stream_seek(stream, pos); |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
521 |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
522 return chapter; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
523 } |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
524 |
20812
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
525 static void list_chapters(pgc_t *pgc) |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
526 { |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
527 unsigned int i, cell; |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
528 unsigned int t=0, t2=0; |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
529 |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
530 if(pgc->nr_of_programs < 2) |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
531 return; |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
532 |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
533 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "CHAPTERS: "); |
23368
cef784b467ac
fixed off-by-one bug during chapter-listing; fixed by Jared Breland (list-mplayer@legroom.net) and me
nicodvb
parents:
22412
diff
changeset
|
534 for(i=0; i<pgc->nr_of_programs; i++) |
20812
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
535 { |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
536 cell = pgc->program_map[i]; //here the cell is 1-based |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
537 t2 = t/1000; |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
538 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "%02d:%02d:%02d,", t2/3600, (t2/60)%60, t2%60); |
23368
cef784b467ac
fixed off-by-one bug during chapter-listing; fixed by Jared Breland (list-mplayer@legroom.net) and me
nicodvb
parents:
22412
diff
changeset
|
539 while(i+1<pgc->nr_of_programs && cell < pgc->program_map[i+1]) { |
20812
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
540 if(!(pgc->cell_playback[cell-1].block_type == BLOCK_TYPE_ANGLE_BLOCK && |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
541 pgc->cell_playback[cell-1].block_mode != BLOCK_MODE_FIRST_CELL) |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
542 ) |
23993 | 543 t += mp_dvdtimetomsec(&pgc->cell_playback[cell-1].playback_time); |
20812
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
544 cell++; |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
545 } |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
546 } |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
547 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "\n"); |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
548 } |
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
549 |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
550 static double dvd_get_current_time(stream_t *stream, int cell) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
551 { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
552 int i, tm; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
553 dvd_priv_t *d = stream->priv; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
554 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
555 tm=0; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
556 if(!cell) cell=d->cur_cell; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
557 for(i=0; i<d->cur_cell; i++) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
558 if(d->cur_pgc->cell_playback[i].block_type == BLOCK_TYPE_ANGLE_BLOCK && |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
559 d->cur_pgc->cell_playback[i].block_mode != BLOCK_MODE_FIRST_CELL |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
560 ) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
561 continue; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
562 tm += d->cell_times_table[i]; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
563 } |
23993 | 564 tm += mp_dvdtimetomsec(&d->dsi_pack.dsi_gi.c_eltm); |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
565 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
566 return (double)tm/1000.0; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
567 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
568 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
569 static int dvd_seek_to_time(stream_t *stream, ifo_handle_t *vts_file, double sec) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
570 { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
571 unsigned int i, j, k, timeunit, ac_time, tmap_sector=0, cell_sector=0, vobu_sector=0; |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23368
diff
changeset
|
572 int t=0; |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
573 double tm, duration; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
574 off_t pos = -1; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
575 dvd_priv_t *d = stream->priv; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
576 vts_tmapt_t *vts_tmapt = vts_file->vts_tmapt; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
577 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
578 if(!vts_file->vts_tmapt || sec < 0) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
579 return 0; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
580 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
581 duration = (double) mp_get_titleset_length(d->vts_file, d->tt_srpt, d->cur_title-1) / 1000.0f; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
582 if(sec > duration) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
583 return 0; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
584 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
585 i=d->cur_pgc_idx; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
586 timeunit = vts_tmapt->tmap[i].tmu; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
587 for(j = 0; j < vts_tmapt->tmap[i].nr_of_entries; j++) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
588 ac_time = timeunit * (j + 1); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
589 if(ac_time >= sec) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
590 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
591 tmap_sector = vts_tmapt->tmap[i].map_ent[j] & 0x7fffffff; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
592 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
593 //search enclosing cell |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
594 for(i=0; i<d->cur_pgc->nr_of_cells; i++) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
595 if(tmap_sector >= d->cur_pgc->cell_playback[i].first_sector && tmap_sector <= d->cur_pgc->cell_playback[i].last_sector) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
596 cell_sector = d->cur_pgc->cell_playback[i].first_sector; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
597 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
598 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
599 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
600 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
601 pos = ((off_t)cell_sector)<<11; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
602 stream_seek(stream, pos); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
603 do { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
604 stream_skip(stream, 2048); |
23993 | 605 t = mp_dvdtimetomsec(&d->dsi_pack.dsi_gi.c_eltm); |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
606 } while(!t); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
607 tm = dvd_get_current_time(stream, 0); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
608 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
609 pos = ((off_t)tmap_sector)<<11; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
610 stream_seek(stream, pos); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
611 //now get current time in terms of the cell+cell time offset |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
612 memset(&d->dsi_pack.dsi_gi.c_eltm, 0, sizeof(dvd_time_t)); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
613 while(tm <= sec) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
614 if(!stream_skip(stream, 2048)) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
615 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
616 tm = dvd_get_current_time(stream, 0); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
617 }; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
618 tmap_sector = stream->pos >> 11; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
619 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
620 //search closest VOBU sector |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
621 k=(vts_file->vts_vobu_admap->last_byte + 1 - VOBU_ADMAP_SIZE)/4; //entries in the vobu admap |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
622 for(i=1; i<k; i++) { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
623 if(vts_file->vts_vobu_admap->vobu_start_sectors[i] > tmap_sector) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
624 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
625 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
626 vobu_sector = vts_file->vts_vobu_admap->vobu_start_sectors[i-1]; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
627 pos = ((off_t)vobu_sector) << 11; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
628 stream_seek(stream, pos); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
629 |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
630 return 1; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
631 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
632 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
633 static int control(stream_t *stream,int cmd,void* arg) |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
634 { |
19440
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
635 dvd_priv_t *d = stream->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
636 switch(cmd) |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
637 { |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
638 case STREAM_CTRL_GET_TIME_LENGTH: |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
639 { |
20851
6602a90a06ec
consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents:
20840
diff
changeset
|
640 *((double *)arg) = (double) mp_get_titleset_length(d->vts_file, d->tt_srpt, d->cur_title-1)/1000.0; |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
641 return 1; |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
642 } |
19476 | 643 case STREAM_CTRL_GET_NUM_CHAPTERS: |
644 { | |
24257 | 645 if(! d->cur_pgc->nr_of_programs) return STREAM_UNSUPPORTED; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
646 *((unsigned int *)arg) = d->cur_pgc->nr_of_programs; |
19476 | 647 return 1; |
648 } | |
19440
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
649 case STREAM_CTRL_SEEK_TO_CHAPTER: |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
650 { |
20840
70b6f88bd23c
make fail STREAM_CTRLs related to seeking/fetching time/chapter when the cache is enabled: they can't work atm
nicodvb
parents:
20812
diff
changeset
|
651 int r; |
70b6f88bd23c
make fail STREAM_CTRLs related to seeking/fetching time/chapter when the cache is enabled: they can't work atm
nicodvb
parents:
20812
diff
changeset
|
652 r = seek_to_chapter(stream, d->vts_file, d->tt_srpt, d->cur_title-1, *((unsigned int *)arg)); |
24257 | 653 if(! r) return STREAM_UNSUPPORTED; |
19440
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
654 |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
655 return 1; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
656 } |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
657 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
658 { |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
659 *((unsigned int *)arg) = dvd_chapter_from_cell(d, d->cur_title-1, d->cur_cell); |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
660 return 1; |
9847a1bd66a0
support for seeking to chapter and getting current playing chapter
nicodvb
parents:
19271
diff
changeset
|
661 } |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
662 case STREAM_CTRL_GET_CURRENT_TIME: |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
663 { |
20840
70b6f88bd23c
make fail STREAM_CTRLs related to seeking/fetching time/chapter when the cache is enabled: they can't work atm
nicodvb
parents:
20812
diff
changeset
|
664 double tm; |
70b6f88bd23c
make fail STREAM_CTRLs related to seeking/fetching time/chapter when the cache is enabled: they can't work atm
nicodvb
parents:
20812
diff
changeset
|
665 tm = dvd_get_current_time(stream, 0); |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
666 if(tm != -1) { |
20851
6602a90a06ec
consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents:
20840
diff
changeset
|
667 *((double *)arg) = tm; |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
668 return 1; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
669 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
670 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
671 } |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
672 case STREAM_CTRL_SEEK_TO_TIME: |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
673 { |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
674 if(dvd_seek_to_time(stream, d->vts_file, *((double*)arg))) |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
675 return 1; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
676 break; |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
677 } |
24298 | 678 case STREAM_CTRL_GET_ASPECT_RATIO: |
679 { | |
680 *((double *)arg) = !d->vts_file->vtsi_mat->vts_video_attr.display_aspect_ratio ? 4.0/3.0 : 16.0/9.0; | |
681 return 1; | |
682 } | |
25573
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
683 case STREAM_CTRL_GET_NUM_ANGLES: |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
684 { |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
685 *((int *)arg) = d->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
686 return 1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
687 } |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
688 case STREAM_CTRL_GET_ANGLE: |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
689 { |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
690 *((int *)arg) = dvd_angle+1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
691 return 1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
692 } |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
693 case STREAM_CTRL_SET_ANGLE: |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
694 { |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
695 int ang = *((int *)arg); |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
696 if(ang>d->vmg_file->tt_srpt->title[dvd_title].nr_of_angles || ang<=0) |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
697 break; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
698 dvd_angle = ang - 1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
699 d->angle_seek = 1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
700 return 1; |
a27aae25dd75
implemented _ANGLE STREAM_CTRLs, patch by oattila chello hu
nicodvb
parents:
25569
diff
changeset
|
701 } |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
702 } |
24257 | 703 return STREAM_UNSUPPORTED; |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
704 } |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
705 |
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
706 |
15518 | 707 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { |
708 struct stream_priv_s* p = (struct stream_priv_s*)opts; | |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
709 int k; |
15518 | 710 |
25187 | 711 mp_msg(MSGT_OPEN,MSGL_V,"URL: %s\n", stream->url); |
15518 | 712 dvd_title = p->title; |
713 if(1){ | |
714 //int ret,ret2; | |
715 dvd_priv_t *d; | |
716 int ttn,pgc_id,pgn; | |
717 dvd_reader_t *dvd; | |
718 dvd_file_t *title; | |
719 ifo_handle_t *vmg_file; | |
720 tt_srpt_t *tt_srpt; | |
721 ifo_handle_t *vts_file; | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
722 pgc_t *pgc; |
15518 | 723 /** |
724 * Open the disc. | |
725 */ | |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
726 if(p->device) |
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
727 dvd_device_current = p->device; |
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
728 else if(dvd_device) |
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
729 dvd_device_current = dvd_device; |
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
730 else |
27194 | 731 dvd_device_current = DEFAULT_DVD_DEVICE; |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
732 dvd_set_speed(dvd_device_current, dvd_speed); |
25342
23f02d6ac901
Replace SYS_DARWIN by __APPLE__ and __DARWIN__ where appropriate.
diego
parents:
25242
diff
changeset
|
733 #if defined(__APPLE__) || defined(__DARWIN__) |
15518 | 734 /* Dynamic DVD drive selection on Darwin */ |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
735 if(!strcmp(dvd_device_current, "/dev/rdiskN")) { |
15518 | 736 int i; |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
737 size_t len = strlen(dvd_device_current)+1; |
22403
11e7787eb78b
replaced 1 instances of sprintf() with snprintf(); patch by njkain gmail com.
nicodvb
parents:
22204
diff
changeset
|
738 char *temp_device = malloc(len); |
15518 | 739 |
740 for (i = 1; i < 10; i++) { | |
22403
11e7787eb78b
replaced 1 instances of sprintf() with snprintf(); patch by njkain gmail com.
nicodvb
parents:
22204
diff
changeset
|
741 snprintf(temp_device, len, "/dev/rdisk%d", i); |
15518 | 742 dvd = DVDOpen(temp_device); |
743 if(!dvd) { | |
25031
5e1e61012a05
report why the dvd couldn't be opened. Patch by Jan Knutar jknutar+nic+fi
nicodvb
parents:
24986
diff
changeset
|
744 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,temp_device, strerror(errno)); |
15518 | 745 } else { |
17490
acef9166db2f
MPlayer OSX port: Add a call to UDFFindFile to verify that we are opening a valid udf image. Patch by Emanuele Giaquita <emanuele.giaquinta@gmail.com>
nplourde
parents:
17257
diff
changeset
|
746 #if DVDREAD_VERSION <= LIBDVDREAD_VERSION(0,9,4) |
21731
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
747 dvd_file_t *dvdfile = DVDOpenFile(dvd,dvd_title,DVD_READ_INFO_FILE); |
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
748 if(!dvdfile) { |
25031
5e1e61012a05
report why the dvd couldn't be opened. Patch by Jan Knutar jknutar+nic+fi
nicodvb
parents:
24986
diff
changeset
|
749 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,temp_device, strerror(errno)); |
17490
acef9166db2f
MPlayer OSX port: Add a call to UDFFindFile to verify that we are opening a valid udf image. Patch by Emanuele Giaquita <emanuele.giaquinta@gmail.com>
nplourde
parents:
17257
diff
changeset
|
750 DVDClose(dvd); |
21731
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
751 continue; |
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
752 } |
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
753 DVDCloseFile(dvdfile); |
17490
acef9166db2f
MPlayer OSX port: Add a call to UDFFindFile to verify that we are opening a valid udf image. Patch by Emanuele Giaquita <emanuele.giaquinta@gmail.com>
nplourde
parents:
17257
diff
changeset
|
754 #endif |
15518 | 755 break; |
756 } | |
757 } | |
21731
61c0bae18c23
replace call to UDFFindFile() (that is not part of the public API) with DVDOpenFile()
nicodvb
parents:
21636
diff
changeset
|
758 free(temp_device); |
15518 | 759 |
760 if(!dvd) { | |
761 m_struct_free(&stream_opts,opts); | |
24257 | 762 return STREAM_UNSUPPORTED; |
15518 | 763 } |
764 } else | |
25342
23f02d6ac901
Replace SYS_DARWIN by __APPLE__ and __DARWIN__ where appropriate.
diego
parents:
25242
diff
changeset
|
765 #endif /* defined(__APPLE__) || defined(__DARWIN__) */ |
15518 | 766 { |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
767 dvd = DVDOpen(dvd_device_current); |
15518 | 768 if(!dvd) { |
27163
704a4fdb762a
added support for the device part in the url; patch by
nicodvb
parents:
26833
diff
changeset
|
769 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CantOpenDVD,dvd_device_current, strerror(errno)); |
15518 | 770 m_struct_free(&stream_opts,opts); |
24257 | 771 return STREAM_UNSUPPORTED; |
15518 | 772 } |
773 } | |
774 | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
775 mp_msg(MSGT_OPEN,MSGL_V,"Reading disc structure, please wait...\n"); |
15518 | 776 |
777 /** | |
778 * Load the video manager to find out the information about the titles on | |
779 * this disc. | |
780 */ | |
781 vmg_file = ifoOpen(dvd, 0); | |
782 if(!vmg_file) { | |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
783 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoVMG); |
15518 | 784 DVDClose( dvd ); |
785 m_struct_free(&stream_opts,opts); | |
24257 | 786 return STREAM_UNSUPPORTED; |
15518 | 787 } |
788 tt_srpt = vmg_file->tt_srpt; | |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
789 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
790 { |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
791 int title_no; ///< title number |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
792 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLES=%d\n", tt_srpt->nr_of_srpts); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
793 for (title_no = 0; title_no < tt_srpt->nr_of_srpts; title_no++) |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
794 { |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
795 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLE_%d_CHAPTERS=%d\n", title_no + 1, tt_srpt->title[title_no].nr_of_ptts); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
796 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_TITLE_%d_ANGLES=%d\n", title_no + 1, tt_srpt->title[title_no].nr_of_angles); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
797 } |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
798 } |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
799 if (mp_msg_test(MSGT_IDENTIFY, MSGL_V)) |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
800 { |
27465 | 801 char volid[32]; |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
802 unsigned char discid [16]; ///< disk ID, a 128 bit MD5 sum |
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
803 int vts_no; ///< video title set number |
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
804 for (vts_no = 1; vts_no <= vmg_file->vts_atrt->nr_of_vtss; vts_no++) |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
805 mp_describe_titleset(dvd, tt_srpt, vts_no); |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
806 if (DVDDiscID(dvd, discid) >= 0) |
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
807 { |
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
808 int i; |
22412 | 809 mp_msg(MSGT_IDENTIFY, MSGL_V, "ID_DVD_DISC_ID="); |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
810 for (i = 0; i < 16; i ++) |
22412 | 811 mp_msg(MSGT_IDENTIFY, MSGL_V, "%02X", discid[i]); |
812 mp_msg(MSGT_IDENTIFY, MSGL_V, "\n"); | |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
813 } |
27599
9821950a390d
With -identify, ID_DVD_VOLUME_ID is not shown on some systems.
diego
parents:
27465
diff
changeset
|
814 if (DVDUDFVolumeInfo(dvd, volid, sizeof(volid), NULL, 0) >= 0 || DVDISOVolumeInfo(dvd, volid, sizeof(volid), NULL, 0) >= 0) |
27465 | 815 mp_msg(MSGT_IDENTIFY, MSGL_V, "ID_DVD_VOLUME_ID=%s\n", volid); |
16544
a10adcba312f
Prints the number of titles, DVD disk ID, the numbers of chapters and
gpoirier
parents:
15551
diff
changeset
|
816 } |
15518 | 817 /** |
818 * Make sure our title number is valid. | |
819 */ | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
820 mp_msg(MSGT_OPEN,MSGL_STATUS, MSGTR_DVDnumTitles, tt_srpt->nr_of_srpts ); |
15518 | 821 if(dvd_title < 1 || dvd_title > tt_srpt->nr_of_srpts) { |
822 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidTitle, dvd_title); | |
823 ifoClose( vmg_file ); | |
824 DVDClose( dvd ); | |
825 m_struct_free(&stream_opts,opts); | |
24257 | 826 return STREAM_UNSUPPORTED; |
15518 | 827 } |
20086 | 828 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_CURRENT_TITLE=%d\n", dvd_title); |
15518 | 829 --dvd_title; // remap 1.. -> 0.. |
830 /** | |
831 * Make sure the angle number is valid for this title. | |
832 */ | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
833 mp_msg(MSGT_OPEN,MSGL_STATUS, MSGTR_DVDnumAngles, tt_srpt->title[dvd_title].nr_of_angles); |
15518 | 834 if(dvd_angle<1 || dvd_angle>tt_srpt->title[dvd_title].nr_of_angles) { |
835 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidAngle, dvd_angle); | |
24228 | 836 goto fail; |
15518 | 837 } |
838 --dvd_angle; // remap 1.. -> 0.. | |
16649
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
839 |
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
840 ttn = tt_srpt->title[dvd_title].vts_ttn - 1; |
15518 | 841 /** |
842 * Load the VTS information for the title set our title is in. | |
843 */ | |
844 vts_file = ifoOpen( dvd, tt_srpt->title[dvd_title].title_set_nr ); | |
845 if(!vts_file) { | |
846 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoIFO, tt_srpt->title[dvd_title].title_set_nr ); | |
24228 | 847 goto fail; |
15518 | 848 } |
849 /** | |
850 * We've got enough info, time to open the title set data. | |
851 */ | |
852 title = DVDOpenFile(dvd, tt_srpt->title[dvd_title].title_set_nr, DVD_READ_TITLE_VOBS); | |
853 if(!title) { | |
854 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoVOBs, tt_srpt->title[dvd_title].title_set_nr); | |
855 ifoClose( vts_file ); | |
24228 | 856 goto fail; |
15518 | 857 } |
858 | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
859 mp_msg(MSGT_OPEN,MSGL_V, "DVD successfully opened.\n"); |
15518 | 860 // store data |
861 d=malloc(sizeof(dvd_priv_t)); memset(d,0,sizeof(dvd_priv_t)); | |
862 d->dvd=dvd; | |
863 d->title=title; | |
864 d->vmg_file=vmg_file; | |
865 d->tt_srpt=tt_srpt; | |
866 d->vts_file=vts_file; | |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
867 d->cur_title = dvd_title+1; |
15518 | 868 |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
869 pgc = vts_file->vts_pgcit ? vts_file->vts_pgcit->pgci_srp[ttn].pgc : NULL; |
15518 | 870 /** |
871 * Check number of audio channels and types | |
872 */ | |
873 { | |
874 d->nr_of_channels=0; | |
875 if(vts_file->vts_pgcit) { | |
876 int i; | |
877 for(i=0;i<8;i++) | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
878 if(pgc->audio_control[i] & 0x8000) { |
15518 | 879 audio_attr_t * audio = &vts_file->vtsi_mat->vts_audio_attr[i]; |
880 int language = 0; | |
881 char tmp[] = "unknown"; | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
882 stream_language_t *audio_stream = &d->audio_streams[d->nr_of_channels]; |
15518 | 883 |
884 if(audio->lang_type == 1) { | |
885 language=audio->lang_code; | |
886 tmp[0]=language>>8; | |
887 tmp[1]=language&0xff; | |
888 tmp[2]=0; | |
889 } | |
890 | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
891 audio_stream->language=language; |
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
892 audio_stream->id=pgc->audio_control[i] >> 8 & 7; |
15518 | 893 switch(audio->audio_format) { |
894 case 0: // ac3 | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
895 audio_stream->id+=FIRST_AC3_AID; |
15518 | 896 break; |
897 case 6: // dts | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
898 audio_stream->id+=FIRST_DTS_AID; |
15518 | 899 break; |
900 case 2: // mpeg layer 1/2/3 | |
901 case 3: // mpeg2 ext | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
902 audio_stream->id+=FIRST_MPG_AID; |
15518 | 903 break; |
904 case 4: // lpcm | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
905 audio_stream->id+=FIRST_PCM_AID; |
15518 | 906 break; |
907 } | |
908 | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
909 audio_stream->type=audio->audio_format; |
15518 | 910 // Pontscho: to my mind, tha channels: |
911 // 1 - stereo | |
912 // 5 - 5.1 | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
913 audio_stream->channels=audio->channels; |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
914 mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDaudioStreamInfo, |
15518 | 915 d->nr_of_channels, |
916 dvd_audio_stream_types[ audio->audio_format ], | |
917 dvd_audio_stream_channels[ audio->channels ], | |
918 tmp, | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
919 audio_stream->id |
15518 | 920 ); |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
921 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", audio_stream->id); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
922 if(language && tmp[0]) |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
923 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", audio_stream->id, tmp); |
15518 | 924 |
925 d->nr_of_channels++; | |
926 } | |
927 } | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
928 mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDnumAudioChannels,d->nr_of_channels ); |
15518 | 929 } |
930 | |
931 /** | |
932 * Check number of subtitles and language | |
933 */ | |
934 { | |
935 int i; | |
936 | |
937 d->nr_of_subtitles=0; | |
938 for(i=0;i<32;i++) | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
939 if(pgc->subp_control[i] & 0x80000000) { |
15518 | 940 subp_attr_t * subtitle = &vts_file->vtsi_mat->vts_subp_attr[i]; |
16649
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
941 video_attr_t *video = &vts_file->vtsi_mat->vts_video_attr; |
15518 | 942 int language = 0; |
943 char tmp[] = "unknown"; | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
944 stream_language_t *sub_stream = &d->subtitles[d->nr_of_subtitles]; |
15518 | 945 |
946 if(subtitle->type == 1) { | |
947 language=subtitle->lang_code; | |
948 tmp[0]=language>>8; | |
949 tmp[1]=language&0xff; | |
950 tmp[2]=0; | |
951 } | |
952 | |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
953 sub_stream->language=language; |
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
954 sub_stream->id=d->nr_of_subtitles; |
16649
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
955 if(video->display_aspect_ratio == 0) /* 4:3 */ |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
956 sub_stream->id = pgc->subp_control[i] >> 24 & 31; |
16649
e1d6fbd607e0
Fix DVD audio and subtitle stream mapping, esp. for DVD with both 4:3 and
reimar
parents:
16544
diff
changeset
|
957 else if(video->display_aspect_ratio == 3) /* 16:9 */ |
22204
da9d0425a72a
Simplify code by using separate variables for large common expressions.
reimar
parents:
21926
diff
changeset
|
958 sub_stream->id = pgc->subp_control[i] >> 8 & 31; |
15518 | 959 |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
960 mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDsubtitleLanguage, sub_stream->id, tmp); |
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
961 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sub_stream->id); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18091
diff
changeset
|
962 if(language && tmp[0]) |
23601
0f1c9cf1752d
Fix dvd:// subtitle handling to always report the MPEG stream id, because
reimar
parents:
23381
diff
changeset
|
963 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sub_stream->id, tmp); |
15518 | 964 d->nr_of_subtitles++; |
965 } | |
19448
ebaf8067faae
Print DVD audio channel and subtitle track information in non-verbose mode,
diego
parents:
19442
diff
changeset
|
966 mp_msg(MSGT_OPEN,MSGL_STATUS,MSGTR_DVDnumSubtitles,d->nr_of_subtitles); |
15518 | 967 } |
968 | |
969 /** | |
970 * Determine which program chain we want to watch. This is based on the | |
971 * chapter number. | |
972 */ | |
25955
eff9e1b25743
-chapter is now handled uniformly calling demuxer_seek_chapter() instead
nicodvb
parents:
25691
diff
changeset
|
973 pgc_id = vts_file->vts_ptt_srpt->title[ttn].ptt[0].pgcn; // local |
eff9e1b25743
-chapter is now handled uniformly calling demuxer_seek_chapter() instead
nicodvb
parents:
25691
diff
changeset
|
974 pgn = vts_file->vts_ptt_srpt->title[ttn].ptt[0].pgn; // local |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
975 d->cur_pgc_idx = pgc_id-1; |
15518 | 976 d->cur_pgc = vts_file->vts_pgcit->pgci_srp[pgc_id-1].pgc; |
977 d->cur_cell = d->cur_pgc->program_map[pgn-1] - 1; // start playback here | |
978 d->packs_left=-1; // for Navi stuff | |
979 d->angle_seek=0; | |
980 d->last_cell=d->cur_pgc->nr_of_cells; | |
981 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29083
diff
changeset
|
982 if(d->cur_pgc->cell_playback[d->cur_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK ) |
15518 | 983 d->cur_cell+=dvd_angle; |
984 d->cur_pack = d->cur_pgc->cell_playback[ d->cur_cell ].first_sector; | |
985 d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector; | |
986 mp_msg(MSGT_DVD,MSGL_V, "DVD start cell: %d pack: 0x%X-0x%X \n",d->cur_cell,d->cur_pack,d->cell_last_pack); | |
987 | |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
988 //assign cell_times_table |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
989 d->cell_times_table = malloc(sizeof(unsigned int) * d->cur_pgc->nr_of_cells); |
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
990 if(d->cell_times_table == NULL) |
24257 | 991 return STREAM_UNSUPPORTED; |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
992 for(k=0; k<d->cur_pgc->nr_of_cells; k++) |
23993 | 993 d->cell_times_table[k] = mp_dvdtimetomsec(&d->cur_pgc->cell_playback[k].playback_time); |
20812
2e78c538db90
idenfify now shows the timings of chapters of the chosen pgc
nicodvb
parents:
20746
diff
changeset
|
994 list_chapters(d->cur_pgc); |
20746
a40246d0c941
implemented STREAM_CTRL_GET_CURRENT_TIME and STREAM_CTRL_SEEK_TO_TIME (precise seeking)
nicodvb
parents:
20635
diff
changeset
|
995 |
15518 | 996 // ... (unimplemented) |
997 // return NULL; | |
998 stream->type = STREAMTYPE_DVD; | |
999 stream->sector_size = 2048; | |
29920
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29852
diff
changeset
|
1000 stream->flags = STREAM_READ | MP_STREAM_SEEK; |
15518 | 1001 stream->fill_buffer = fill_buffer; |
1002 stream->seek = seek; | |
17698
14830cce6098
implement STREAM_CTRL_GET_TIME_LENGTH to return the duration of the dvd currently playing
nicodvb
parents:
17490
diff
changeset
|
1003 stream->control = control; |
15518 | 1004 stream->close = stream_dvd_close; |
1005 stream->start_pos = (off_t)d->cur_pack*2048; | |
1006 stream->end_pos = (off_t)(d->cur_pgc->cell_playback[d->last_cell-1].last_sector)*2048; | |
21926
a8cd73869242
at open() assign *file_format=DEMUXER_TYPE_MPEG_PS to avoid useless demuxer probing
nicodvb
parents:
21731
diff
changeset
|
1007 *file_format = DEMUXER_TYPE_MPEG_PS; |
15518 | 1008 mp_msg(MSGT_DVD,MSGL_V,"DVD start=%d end=%d \n",d->cur_pack,d->cur_pgc->cell_playback[d->last_cell-1].last_sector); |
1009 stream->priv = (void*)d; | |
1010 return STREAM_OK; | |
24228 | 1011 |
1012 fail: | |
1013 ifoClose(vmg_file); | |
1014 DVDClose(dvd); | |
1015 m_struct_free(&stream_opts, opts); | |
24257 | 1016 return STREAM_UNSUPPORTED; |
15518 | 1017 } |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16770
diff
changeset
|
1018 mp_msg(MSGT_DVD,MSGL_ERR,MSGTR_NoDVDSupport); |
15518 | 1019 m_struct_free(&stream_opts,opts); |
24257 | 1020 return STREAM_UNSUPPORTED; |
15518 | 1021 } |
1022 | |
27166
e1619590ef03
cosmetics: in ifo_stream_oped() aligned the prototype to the style
nicodvb
parents:
27165
diff
changeset
|
1023 static int ifo_stream_open (stream_t *stream, int mode, void *opts, int *file_format) |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1024 { |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1025 char* filename; |
27166
e1619590ef03
cosmetics: in ifo_stream_oped() aligned the prototype to the style
nicodvb
parents:
27165
diff
changeset
|
1026 struct stream_priv_s *spriv; |
29041 | 1027 int len = strlen(stream->url); |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1028 |
29041 | 1029 if (len < 4 || strcasecmp (stream->url + len - 4, ".ifo")) |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1030 return STREAM_UNSUPPORTED; |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1031 |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1032 mp_msg(MSGT_DVD, MSGL_INFO, ".IFO detected. Redirecting to dvd://\n"); |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1033 |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1034 filename = strdup(basename(stream->url)); |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1035 |
27166
e1619590ef03
cosmetics: in ifo_stream_oped() aligned the prototype to the style
nicodvb
parents:
27165
diff
changeset
|
1036 spriv=calloc(1, sizeof(struct stream_priv_s)); |
e1619590ef03
cosmetics: in ifo_stream_oped() aligned the prototype to the style
nicodvb
parents:
27165
diff
changeset
|
1037 spriv->device = strdup(dirname(stream->url)); |
29045
bcc35d0962d6
100l, revert r29082, I missed that the vts comparison should be case-insensitive.
reimar
parents:
29044
diff
changeset
|
1038 if(!strncasecmp(filename,"vts_",4)) |
bcc35d0962d6
100l, revert r29082, I missed that the vts comparison should be case-insensitive.
reimar
parents:
29044
diff
changeset
|
1039 { |
bcc35d0962d6
100l, revert r29082, I missed that the vts comparison should be case-insensitive.
reimar
parents:
29044
diff
changeset
|
1040 if(sscanf(filename+3, "_%02d_", &spriv->title)!=1) |
bcc35d0962d6
100l, revert r29082, I missed that the vts comparison should be case-insensitive.
reimar
parents:
29044
diff
changeset
|
1041 spriv->title=1; |
bcc35d0962d6
100l, revert r29082, I missed that the vts comparison should be case-insensitive.
reimar
parents:
29044
diff
changeset
|
1042 }else |
29044 | 1043 spriv->title=1; |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1044 |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1045 free(filename); |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1046 free(stream->url); |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1047 stream->url=strdup("dvd://"); |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1048 |
27166
e1619590ef03
cosmetics: in ifo_stream_oped() aligned the prototype to the style
nicodvb
parents:
27165
diff
changeset
|
1049 return open_s(stream, mode, spriv, file_format); |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1050 } |
15518 | 1051 |
25211 | 1052 const stream_info_t stream_info_dvd = { |
15518 | 1053 "DVD stream", |
1054 "null", | |
1055 "", | |
1056 "", | |
1057 open_s, | |
1058 { "dvd", NULL }, | |
1059 &stream_opts, | |
1060 1 // Urls are an option string | |
1061 }; | |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1062 |
25211 | 1063 const stream_info_t stream_info_ifo = { |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1064 "DVD IFO input", |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1065 "ifo", |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1066 "Benjamin Zores", |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1067 "Mostly used to play DVDs on disk through OSD Menu", |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1068 ifo_stream_open, |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1069 { "file", "", NULL }, |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1070 NULL, |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1071 0 |
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25187
diff
changeset
|
1072 }; |