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