annotate stream/stream_dvd.c @ 35419:d86249ebbcca

Don't unconditionally reset Track, Chapter and Angle after playback. Only do so if they had been used (i.e. the current StreamType makes use of them).
author ib
date Thu, 29 Nov 2012 14:23:26 +0000
parents 3b2c280da1af
children b5abdfe9bc61
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
18
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
19 #include <ctype.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
20 #include <stdio.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
21 #include <stdlib.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
22 #include <string.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
23 #include <unistd.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
24 #include <string.h>
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
25
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
26 #include "config.h"
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
27 #include "mp_msg.h"
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
38 #include "stream.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
39 #include "m_option.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
40 #include "m_struct.h"
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
41
18682
bee3186a06f7 include stream_dvd's interface from libmpdemux/stream_dvd.h
nicodvb
parents: 18366
diff changeset
42 #include "stream_dvd.h"
23993
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
ade40c1d69b8 Get rid of global variable dvd_title in GUI.
ib
parents: 34895
diff changeset
47 static int dvd_title;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
48 int dvd_angle=1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
49
17257
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
50 #define LIBDVDREAD_VERSION(maj,min,micro) ((maj)*10000 + (min)*100 + (micro))
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
51 /*
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
52 * Try to autodetect the libdvd-0.9.0 library
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
53 * (0.9.0 removed the <dvdread/dvd_udf.h> header, and moved the two defines
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
54 * DVD_VIDEO_LB_LEN and MAX_UDF_FILE_NAME_LEN from it to
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
55 * <dvdread/dvd_reader.h>)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
56 */
17257
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
57 #ifndef DVDREAD_VERSION
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
58 #if defined(DVD_VIDEO_LB_LEN) && defined(MAX_UDF_FILE_NAME_LEN)
17257
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
59 #define DVDREAD_VERSION LIBDVDREAD_VERSION(0,9,0)
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
60 #else
17257
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
61 #define DVDREAD_VERSION LIBDVDREAD_VERSION(0,8,0)
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
62 #endif
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
63 #endif
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
64
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
65
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
66 static struct stream_priv_s {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
72 };
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
73
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
74 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
75 /// URL definition
25242
371a40dcc1cc stream_opts arrays should be const
reimar
parents: 25232
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
79 { NULL, NULL, 0, 0, 0, 0, NULL }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
80 };
25691
68015115f63a stream_opts should be const
reimar
parents: 25685
diff changeset
81 static const struct m_struct_st stream_opts = {
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
82 "dvd",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
83 sizeof(struct stream_priv_s),
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
84 &stream_priv_dflts,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
85 stream_opts_fields
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
86 };
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
89 const char *s;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
90 char *t;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
91 if (!range)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
92 return M_OPT_MISSING_PARAM;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
93 s = range;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
94 dvd_chapter = 1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
95 dvd_last_chapter = 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
100 return M_OPT_INVALID;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
101 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
102 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
103 if(*s == 0)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
104 return 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
107 return M_OPT_INVALID;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
108 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
109 ++s;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
110 if(*s == 0)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
111 return 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
114 return M_OPT_INVALID;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
115 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
116 dvd_last_chapter = strtol(s, &t, 10);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
119 return M_OPT_INVALID;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
120 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
121 return 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
122 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
123
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
124 int dvd_chapter_from_cell(dvd_priv_t* dvd,int title,int cell)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
125 {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
126 pgc_t * cur_pgc;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
127 ptt_info_t* ptt;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
128 int chapter = cell;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
129 int pgc_id,pgn;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
130 if(title < 0 || cell < 0){
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
131 return 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
132 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
133 /* for most DVD's chapter == cell */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
134 /* but there are more complecated cases... */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
135 if(chapter >= dvd->vmg_file->tt_srpt->title[title].nr_of_ptts) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
136 chapter = dvd->vmg_file->tt_srpt->title[title].nr_of_ptts-1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
137 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
138 title = dvd->tt_srpt->title[title].vts_ttn-1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
139 ptt = dvd->vts_file->vts_ptt_srpt->title[title].ptt;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
140 while(chapter >= 0) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
141 pgc_id = ptt[chapter].pgcn;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
142 pgn = ptt[chapter].pgn;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
143 cur_pgc = dvd->vts_file->vts_pgcit->pgci_srp[pgc_id-1].pgc;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
144 if(cell >= cur_pgc->program_map[pgn-1]-1) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
145 return chapter;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
146 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
147 --chapter;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
148 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
149 /* didn't find a chapter ??? */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
150 return chapter;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
151 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
154 dvd_priv_t *d;
20158
7297d76977be gcc 2.95 fix
ods15
parents: 20156
diff changeset
155 int i;
20156
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
156 if (!stream) return 0;
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
157 d = stream->priv;
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
158 if (!d) return 0;
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
159 for(i=0;i<d->nr_of_channels;i++) {
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
160 if(d->audio_streams[i].id==id)
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
161 return d->audio_streams[i].language;
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
162 }
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
163 return 0;
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
164 }
42b46a42f83b added OSD audio switching visualization
ptt
parents: 20086
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
167 dvd_priv_t *d=stream->priv;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
168 int code,i;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
169 if(lang) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
170 while(strlen(lang)>=2) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
171 code=lang[1]|(lang[0]<<8);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
172 for(i=0;i<d->nr_of_channels;i++) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
175 d->audio_streams[i].id, lang[0],lang[1]);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
176 return d->audio_streams[i].id;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
177 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
178 //printf("%X != %X (%c%c)\n",code,d->audio_streams[i].language,lang[0],lang[1]);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
179 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
180 lang+=2; while (lang[0]==',' || lang[0]==' ') ++lang;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
183 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
184 return -1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
185 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
186
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
190 dvd_priv_t *d;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
191 if (!stream) return -1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
192 d = stream->priv;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
197 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
201 dvd_priv_t *d;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
202 if (!stream) return 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
203 d = stream->priv;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
208 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
211 dvd_priv_t *d=stream->priv;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
212 int code,i;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
213 while(lang && strlen(lang)>=2) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
214 code=lang[1]|(lang[0]<<8);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
215 for(i=0;i<d->nr_of_subtitles;i++) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
219 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
220 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29083
diff changeset
221 lang+=2;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
222 while (lang[0]==',' || lang[0]==' ') ++lang;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
225 return -1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
226 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
227
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
228 static int dvd_next_cell(dvd_priv_t *d) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
229 int next_cell=d->cur_cell;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
232 if( d->cur_pgc->cell_playback[ next_cell ].block_type == BLOCK_TYPE_ANGLE_BLOCK ) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
233 while(next_cell<d->last_cell) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
234 if( d->cur_pgc->cell_playback[next_cell].block_mode == BLOCK_MODE_LAST_CELL )
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
235 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
236 ++next_cell;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
237 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
240
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
241 ++next_cell;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29083
diff changeset
242 if(next_cell>=d->last_cell)
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
243 return -1; // EOF
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
244 if(d->cur_pgc->cell_playback[next_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK ) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
247 return -1; // EOF
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
250 return next_cell;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
251 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
255 int len;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
256
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
257 if(d->packs_left==0) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
258 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
259 * If we're not at the end of this cell, we can determine the next
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
260 * VOBU to display using the VOBU_SRI information section of the
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
261 * DSI. Using this value correctly follows the current angle,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
262 * avoiding the doubled scenes in The Matrix, and makes our life
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
263 * really happy.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
264 *
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
265 * Otherwise, we set our next address past the end of this cell to
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
266 * force the code above to go to the next cell in the program.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
267 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
268 if(d->dsi_pack.vobu_sri.next_vobu != SRI_END_OF_CELL) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
269 d->cur_pack= d->dsi_pack.dsi_gi.nv_pck_lbn + ( d->dsi_pack.vobu_sri.next_vobu & 0x7fffffff );
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
270 mp_msg(MSGT_DVD,MSGL_DBG2, "Navi new pos=0x%X \n",d->cur_pack);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
271 } else {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
272 // end of cell! find next cell!
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
273 mp_msg(MSGT_DVD,MSGL_V, "--- END OF CELL !!! ---\n");
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
274 d->cur_pack=d->cell_last_pack+1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
275 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
276 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
277
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
278 read_next:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
279 if(d->cur_pack>d->cell_last_pack) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
280 // end of cell!
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
281 int next=dvd_next_cell(d);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
282 if(next>=0) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
285 // == BLOCK_TYPE_ANGLE_BLOCK ) d->cur_cell+=dvd_angle;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
286 d->cur_pack = d->cur_pgc->cell_playback[ d->cur_cell ].first_sector;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
287 d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
290 return -1; // EOF
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
291 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
292
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
296
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
297 if(data[38]==0 && data[39]==0 && data[40]==1 && data[41]==0xBF &&
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
298 data[1024]==0 && data[1025]==0 && data[1026]==1 && data[1027]==0xBF) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
299 // found a Navi packet!!!
17257
1188874fd68b fix dvdread version macro
rathann
parents: 17191
diff changeset
300 #if DVDREAD_VERSION >= LIBDVDREAD_VERSION(0,9,0)
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
301 navRead_DSI(&d->dsi_pack, &(data[ DSI_START_BYTE ]));
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
302 #else
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
303 navRead_DSI(&d->dsi_pack, &(data[ DSI_START_BYTE ]), sizeof(dsi_t));
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
304 #endif
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
305 if(d->cur_pack != d->dsi_pack.dsi_gi.nv_pck_lbn ) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
306 mp_msg(MSGT_DVD,MSGL_V, "Invalid NAVI packet! lba=0x%X navi=0x%X \n",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
307 d->cur_pack,d->dsi_pack.dsi_gi.nv_pck_lbn);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
308 } else {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
309 // process!
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
310 d->packs_left = d->dsi_pack.dsi_gi.vobu_ea;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
311 mp_msg(MSGT_DVD,MSGL_DBG2, "Found NAVI packet! lba=0x%X len=%d \n",d->cur_pack,d->packs_left);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
312 //navPrint_DSI(&d->dsi_pack);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
313 mp_msg(MSGT_DVD,MSGL_DBG3,"\r### CELL %d: Navi: %d/%d IFO: %d/%d \n",d->cur_cell,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
314 d->dsi_pack.dsi_gi.vobu_c_idn,d->dsi_pack.dsi_gi.vobu_vob_idn,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
315 d->cur_pgc->cell_position[d->cur_cell].cell_nr,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
316 d->cur_pgc->cell_position[d->cur_cell].vob_id_nr);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
317
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
318 if(d->angle_seek) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
319 int i,skip=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
320 #if defined(__GNUC__) && ( defined(__sparc__) || defined(hpux) )
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
321 // workaround for a bug in the sparc/hpux version of gcc 2.95.X ... 3.2,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
322 // it generates incorrect code for unaligned access to a packed
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
323 // structure member, resulting in an mplayer crash with a SIGBUS
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
324 // signal.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
325 //
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
326 // See also gcc problem report PR c/7847:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
327 // http://gcc.gnu.org/cgi-bin/gnatsweb.pl?database=gcc&cmd=view+audit-trail&pr=7847
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
330 memcpy(&tmp_addr,&d->dsi_pack.sml_agli.data[i].address,sizeof(tmp_addr));
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
331 if((skip=tmp_addr)!=0) break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
332 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
333 #else
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
334 for(i=0;i<9;i++) // check if all values zero:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
335 if((skip=d->dsi_pack.sml_agli.data[i].address)!=0) break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
338 // sml_agli table has valid data (at least one non-zero):
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
339 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
340 d->dsi_pack.sml_agli.data[dvd_angle].address;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
343 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced using sml_agli map! new_lba=0x%X \n",d->cur_pack);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
344 } else {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
345 // check if we're in the right cell, jump otherwise:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
346 if( (d->dsi_pack.dsi_gi.vobu_c_idn==d->cur_pgc->cell_position[d->cur_cell].cell_nr) &&
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
347 (d->dsi_pack.dsi_gi.vobu_vob_idn==d->cur_pgc->cell_position[d->cur_cell].vob_id_nr) ){
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
348 d->angle_seek=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
349 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced by cell/vob IDN search! \n");
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
350 } else {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
351 // wrong angle, skip this vobu:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
352 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
353 d->dsi_pack.dsi_gi.vobu_ea;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
354 d->angle_seek=2; // DEBUG
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
355 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
356 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
357 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
358 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
359 ++d->cur_pack;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
360 goto read_next;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
361 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
362
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
363 ++d->cur_pack;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
364 if(d->packs_left>=0) --d->packs_left;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
365
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
366 if(d->angle_seek) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
367 if(d->angle_seek==2) mp_msg(MSGT_DVD,MSGL_V, "!!! warning! reading packet while angle_seek !!!\n");
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
368 goto read_next; // searching for Navi packet
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
369 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
370
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
371 return d->cur_pack-1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
372 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
376 d->packs_left=-1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
377 d->cur_pack=pos;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
378
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
379 // check if we stay in current cell (speedup things, and avoid angle skip)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
380 if(d->cur_pack>d->cell_last_pack ||
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
381 d->cur_pack<d->cur_pgc->cell_playback[ d->cur_cell ].first_sector) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
382
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
383 // ok, cell change, find the right cell!
31817
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
384 cell_playback_t *cell;
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
385 for(d->cur_cell=0; d->cur_cell < d->cur_pgc->nr_of_cells; d->cur_cell++) {
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
386 cell = &(d->cur_pgc->cell_playback[d->cur_cell]);
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
387 if(cell->block_type == BLOCK_TYPE_ANGLE_BLOCK && cell->block_mode != BLOCK_MODE_FIRST_CELL)
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
388 continue;
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
389 d->cell_last_pack=cell->last_sector;
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
390 if(d->cur_pack<cell->first_sector) {
cb769a111f7a dvd: Improve seeking by position.
diego
parents: 31816
diff changeset
391 d->cur_pack=cell->first_sector;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
392 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
393 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
394 if(d->cur_pack<=d->cell_last_pack) break; // ok, we find it! :)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
395 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
396 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
397
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
398 mp_msg(MSGT_DVD,MSGL_V, "DVD Seek! lba=0x%X cell=%d packs: 0x%X-0x%X \n",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
399 d->cur_pack,d->cur_cell,d->cur_pgc->cell_playback[ d->cur_cell ].first_sector,d->cell_last_pack);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
400
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
401 // if we're in interleaved multi-angle cell, find the right angle chain!
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
402 // (read Navi block, and use the seamless angle jump table)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
403 d->angle_seek=1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
404 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
408 ifoClose(d->vts_file);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
409 ifoClose(d->vmg_file);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
410 DVDCloseFile(d->title);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
411 DVDClose(d->dvd);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
412 dvd_chapter = 1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
415 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
416
32504
5ab4633a9d4d Fix spelling.
reimar
parents: 32503
diff changeset
417 static int fill_buffer(stream_t *s, char *buf, int len)
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
5c4e7dcd8956 100l, add missing return.
reimar
parents: 32502
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
427 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
428
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
429 static int seek(stream_t *s, off_t newpos) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
430 s->pos=newpos; // real seek
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
431 dvd_seek(s->priv,s->pos/2048);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
432 return 1;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
433 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
434
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
435 static void stream_dvd_close(stream_t *s) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
436 dvd_close(s->priv);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
437 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
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
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
527 d->cur_cell = pgc->program_map[ptt.pgn - 1] - 1;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
528 if(pgc->cell_playback[d->cur_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK)
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
529 d->cur_cell += dvd_angle;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
530 d->cur_pack = pgc->cell_playback[d->cur_cell].first_sector;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
531 d->cell_last_pack = pgc->cell_playback[d->cur_cell].last_sector;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
532
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
533 d->packs_left = -1;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
534 d->angle_seek = 0;
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
535
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
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
ab9824b6acc7 dvd: Improve seeking by chapters.
diego
parents: 31815
diff changeset
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
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
edab36622800 implemented STREAM_CTRL_GET_NUM_CHAPTERS
nicodvb
parents: 19448
diff changeset
674 case STREAM_CTRL_GET_NUM_CHAPTERS:
edab36622800 implemented STREAM_CTRL_GET_NUM_CHAPTERS
nicodvb
parents: 19448
diff changeset
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
edab36622800 implemented STREAM_CTRL_GET_NUM_CHAPTERS
nicodvb
parents: 19448
diff changeset
680 return 1;
edab36622800 implemented STREAM_CTRL_GET_NUM_CHAPTERS
nicodvb
parents: 19448
diff changeset
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
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
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
068d5d4231e8 implemented STREAM_CTRL_GET_ASPECT_RATIO
nicodvb
parents: 24257
diff changeset
716 case STREAM_CTRL_GET_ASPECT_RATIO:
068d5d4231e8 implemented STREAM_CTRL_GET_ASPECT_RATIO
nicodvb
parents: 24257
diff changeset
717 {
068d5d4231e8 implemented STREAM_CTRL_GET_ASPECT_RATIO
nicodvb
parents: 24257
diff changeset
718 *((double *)arg) = !d->vts_file->vtsi_mat->vts_video_attr.display_aspect_ratio ? 4.0/3.0 : 16.0/9.0;
068d5d4231e8 implemented STREAM_CTRL_GET_ASPECT_RATIO
nicodvb
parents: 24257
diff changeset
719 return 1;
068d5d4231e8 implemented STREAM_CTRL_GET_ASPECT_RATIO
nicodvb
parents: 24257
diff changeset
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
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
764 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
767
25187
e2625ae16f56 this variable was nothing but a useless memleak
ben
parents: 25123
diff changeset
768 mp_msg(MSGT_OPEN,MSGL_V,"URL: %s\n", stream->url);
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
769 dvd_title = p->title;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
770 if(1){
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
771 //int ret,ret2;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
772 dvd_priv_t *d;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
773 int ttn,pgc_id,pgn;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
774 dvd_reader_t *dvd;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
775 dvd_file_t *title;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
776 ifo_handle_t *vmg_file;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
777 tt_srpt_t *tt_srpt;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
780 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
781 * Open the disc.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
fd1872d2b2d4 avoid unnecessary strdup(); patch by Aurel
nicodvb
parents: 27166
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
796
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
799 dvd = DVDOpen(temp_device);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
812 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
813 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
816
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
817 if(!dvd) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
818 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
819 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
820 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
827 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
828 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
829 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
830 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
833
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
834 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
835 * Load the video manager to find out the information about the titles on
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
836 * this disc.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
837 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
838 vmg_file = ifoOpen(dvd, 0);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
841 DVDClose( dvd );
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
842 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
843 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
844 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
b3bfe83d77f9 Print DVD volume ID with -identify.
reimar
parents: 27235
diff changeset
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
3fb1371e1697 print the disc_id without using a buffer
nicodvb
parents: 22404
diff changeset
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
3fb1371e1697 print the disc_id without using a buffer
nicodvb
parents: 22404
diff changeset
868 mp_msg(MSGT_IDENTIFY, MSGL_V, "%02X", discid[i]);
3fb1371e1697 print the disc_id without using a buffer
nicodvb
parents: 22404
diff changeset
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
b3bfe83d77f9 Print DVD volume ID with -identify.
reimar
parents: 27235
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
874 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
875 * Make sure our title number is valid.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
878 if(dvd_title < 1 || dvd_title > tt_srpt->nr_of_srpts) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
879 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidTitle, dvd_title);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
880 ifoClose( vmg_file );
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
881 DVDClose( dvd );
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
882 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
883 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
884 }
20086
94c1edffdf2f Print current DVD title as ID_DVD_CURRENT_TITLE.
corey
parents: 19476
diff changeset
885 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DVD_CURRENT_TITLE=%d\n", dvd_title);
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
886 --dvd_title; // remap 1.. -> 0..
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
887 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
888 * Make sure the angle number is valid for this title.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
891 if(dvd_angle<1 || dvd_angle>tt_srpt->title[dvd_title].nr_of_angles) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
892 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDinvalidAngle, dvd_angle);
24228
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
893 goto fail;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
894 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
898 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
899 * Load the VTS information for the title set our title is in.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
900 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
901 vts_file = ifoOpen( dvd, tt_srpt->title[dvd_title].title_set_nr );
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
902 if(!vts_file) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
903 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoIFO, tt_srpt->title[dvd_title].title_set_nr );
24228
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
904 goto fail;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
905 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
906 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
907 * We've got enough info, time to open the title set data.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
908 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
909 title = DVDOpenFile(dvd, tt_srpt->title[dvd_title].title_set_nr, DVD_READ_TITLE_VOBS);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
910 if(!title) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
911 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_DVDnoVOBs, tt_srpt->title[dvd_title].title_set_nr);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
912 ifoClose( vts_file );
24228
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
913 goto fail;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
914 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
917 // store data
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
918 d=malloc(sizeof(dvd_priv_t)); memset(d,0,sizeof(dvd_priv_t));
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
919 d->dvd=dvd;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
920 d->title=title;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
921 d->vmg_file=vmg_file;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
922 d->tt_srpt=tt_srpt;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
927 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
928 * Check number of audio channels and types
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
929 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
930 {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
931 d->nr_of_channels=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
932 if(vts_file->vts_pgcit) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
933 int i;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
936 audio_attr_t * audio = &vts_file->vtsi_mat->vts_audio_attr[i];
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
937 int language = 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
940
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
941 if(audio->lang_type == 1) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
942 language=audio->lang_code;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
943 tmp[0]=language>>8;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
944 tmp[1]=language&0xff;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
945 tmp[2]=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
946 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
950 switch(audio->audio_format) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
953 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
956 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
957 case 2: // mpeg layer 1/2/3
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
960 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
963 break;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
964 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
967 // Pontscho: to my mind, tha channels:
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
968 // 1 - stereo
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
972 d->nr_of_channels,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
973 dvd_audio_stream_types[ audio->audio_format ],
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
974 dvd_audio_stream_channels[ audio->channels ],
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
975 tmp,
22204
da9d0425a72a Simplify code by using separate variables for large common expressions.
reimar
parents: 21926
diff changeset
976 audio_stream->id
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
981
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
982 d->nr_of_channels++;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
983 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
986 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
987
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
988 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
989 * Check number of subtitles and language
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
990 */
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
991 {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
992 int i;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
993
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
994 d->nr_of_subtitles=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
999 int language = 0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1002
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1003 if(subtitle->type == 1) {
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1004 language=subtitle->lang_code;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1005 tmp[0]=language>>8;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1006 tmp[1]=language&0xff;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1007 tmp[2]=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1008 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1021 d->nr_of_subtitles++;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1024 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1025
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1026 /**
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1027 * Determine which program chain we want to watch. This is based on the
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1028 * chapter number.
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1033 d->cur_pgc = vts_file->vts_pgcit->pgci_srp[pgc_id-1].pgc;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1034 d->cur_cell = d->cur_pgc->program_map[pgn-1] - 1; // start playback here
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1035 d->packs_left=-1; // for Navi stuff
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1036 d->angle_seek=0;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1037 d->last_cell=d->cur_pgc->nr_of_cells;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1040 d->cur_cell+=dvd_angle;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1041 d->cur_pack = d->cur_pgc->cell_playback[ d->cur_cell ].first_sector;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1042 d->cell_last_pack=d->cur_pgc->cell_playback[ d->cur_cell ].last_sector;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
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
2107f38b6ca1 Moved dvdtimetomsec to stream_dvd_common.c.
cehoyos
parents: 23691
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1053 // ... (unimplemented)
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1054 // return NULL;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1055 stream->type = STREAMTYPE_DVD;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1058 stream->fill_buffer = fill_buffer;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1061 stream->close = stream_dvd_close;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1062 stream->start_pos = (off_t)d->cur_pack*2048;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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);
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1066 stream->priv = (void*)d;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1067 return STREAM_OK;
24228
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
1068
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
1069 fail:
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
1070 ifoClose(vmg_file);
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
1071 DVDClose(dvd);
b5406f2f5044 in open_s() unified failure code in fail:
nicodvb
parents: 24145
diff changeset
1072 m_struct_free(&stream_opts, opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
1073 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1076 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24229
diff changeset
1077 return STREAM_UNSUPPORTED;
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1078 }
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
1b8e2b6fa928 Simplify detection of .ifo extension.
reimar
parents: 28191
diff changeset
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
1b8e2b6fa928 Simplify detection of .ifo extension.
reimar
parents: 28191
diff changeset
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
5f860f568623 Reindent
reimar
parents: 29043
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1108
25211
c1d17bd6683c Mark all stream_info_t as const
reimar
parents: 25210
diff changeset
1109 const stream_info_t stream_info_dvd = {
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1110 "DVD stream",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1111 "null",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1112 "",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1113 "",
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1114 open_s,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1115 { "dvd", NULL },
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1116 &stream_opts,
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
1117 1 // Urls are an option string
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents:
diff changeset
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
c1d17bd6683c Mark all stream_info_t as const
reimar
parents: 25210
diff changeset
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 };