Mercurial > mplayer.hg
annotate stream/stream_vcd.c @ 36721:e9044aed2250
Fix issue with testing of the help message header files.
In order for all definitions to be checked properly, we cannot rely
on config.h, but must assure that all conditional symbolic constants
are defined.
author | ib |
---|---|
date | Sun, 09 Feb 2014 09:22:09 +0000 |
parents | 00e6d020db41 |
children |
rev | line source |
---|---|
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
diff
changeset
|
1 /* |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
7 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
13 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
17 */ |
9886 | 18 |
19 #include "config.h" | |
20 | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
21 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 22 #include <windows.h> |
23 #endif | |
24 | |
30777 | 25 #include "osdep/osdep.h" |
26 | |
9886 | 27 #include "mp_msg.h" |
28 #include "stream.h" | |
29 #include "help_mp.h" | |
17012 | 30 #include "m_option.h" |
31 #include "m_struct.h" | |
9886 | 32 |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9886
diff
changeset
|
33 #include <fcntl.h> |
9886 | 34 #include <stdlib.h> |
35 #include <unistd.h> | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
36 #if !defined(__MINGW32__) && !defined(__CYGWIN__) |
9886 | 37 #include <sys/ioctl.h> |
22506 | 38 #endif |
9886 | 39 #include <errno.h> |
40 | |
23857 | 41 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
42 #include "vcd_read_fbsd.h" |
25342
23f02d6ac901
Replace SYS_DARWIN by __APPLE__ and __DARWIN__ where appropriate.
diego
parents:
25242
diff
changeset
|
43 #elif defined(__APPLE__) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
44 #include "vcd_read_darwin.h" |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
45 #elif defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 46 #include "vcd_read_win32.h" |
30777 | 47 #elif defined(__OS2__) |
48 #include "vcd_read_os2.h" | |
9886 | 49 #else |
50 #include "vcd_read.h" | |
51 #endif | |
52 | |
21926
a8cd73869242
at open() assign *file_format=DEMUXER_TYPE_MPEG_PS to avoid useless demuxer probing
nicodvb
parents:
21848
diff
changeset
|
53 #include "libmpdemux/demuxer.h" |
a8cd73869242
at open() assign *file_format=DEMUXER_TYPE_MPEG_PS to avoid useless demuxer probing
nicodvb
parents:
21848
diff
changeset
|
54 |
9886 | 55 static struct stream_priv_s { |
56 int track; | |
57 char* device; | |
58 } stream_priv_dflts = { | |
59 1, | |
10591 | 60 NULL |
9886 | 61 }; |
62 | |
63 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
64 /// URL definition | |
25242 | 65 static const m_option_t stream_opts_fields[] = { |
9886 | 66 { "track", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, |
67 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
68 /// For url parsing | |
69 { "hostname", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, | |
70 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
71 { NULL, NULL, 0, 0, 0, 0, NULL } | |
72 }; | |
25691 | 73 static const struct m_struct_st stream_opts = { |
9886 | 74 "vcd", |
75 sizeof(struct stream_priv_s), | |
76 &stream_priv_dflts, | |
77 stream_opts_fields | |
78 }; | |
79 | |
80 static int fill_buffer(stream_t *s, char* buffer, int max_len){ | |
15912 | 81 if(s->pos > s->end_pos) /// don't past end of current track |
82 return 0; | |
9886 | 83 return vcd_read(s->priv,buffer); |
84 } | |
85 | |
35885
3389262720da
Fix previous commit, off_t must be replaced by int64_t
reimar
parents:
35881
diff
changeset
|
86 static int seek(stream_t *s, int64_t newpos) { |
9886 | 87 s->pos = newpos; |
88 vcd_set_msf(s->priv,s->pos/VCD_SECTOR_DATA); | |
89 return 1; | |
90 } | |
91 | |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
92 static int control(stream_t *stream, int cmd, void *arg) { |
36433 | 93 mp_vcd_priv_t *vcd = stream->priv; |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
94 switch(cmd) { |
34386
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
31433
diff
changeset
|
95 case STREAM_CTRL_GET_NUM_TITLES: |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
96 case STREAM_CTRL_GET_NUM_CHAPTERS: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
97 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
98 if (!vcd) |
36433 | 99 return STREAM_ERROR; |
30981 | 100 *(unsigned int *)arg = vcd_end_track(vcd); |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
101 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
102 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
103 case STREAM_CTRL_SEEK_TO_CHAPTER: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
104 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
105 int r; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
106 unsigned int track = *(unsigned int *)arg + 1; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
107 if (!vcd) |
36433 | 108 return STREAM_ERROR; |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
109 r = vcd_seek_to_track(vcd, track); |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
110 if (r >= 0) { |
36433 | 111 vcd->track = track; |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
112 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
113 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
114 break; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
115 } |
36436
00e6d020db41
Add stream control command STREAM_CTRL_GET_CURRENT_TITLE for VCD.
ib
parents:
36433
diff
changeset
|
116 case STREAM_CTRL_GET_CURRENT_TITLE: |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
117 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
118 { |
36433 | 119 *(unsigned int *)arg = vcd->track - 1; |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
120 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
121 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
122 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
123 return STREAM_UNSUPPORTED; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
124 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
125 |
9886 | 126 static void close_s(stream_t *stream) { |
127 free(stream->priv); | |
128 } | |
129 | |
130 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { | |
30752 | 131 struct stream_priv_s* p = opts; |
22775
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
132 int ret,ret2,f,sect,tmp; |
9886 | 133 mp_vcd_priv_t* vcd; |
21848 | 134 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 135 int bsize = VCD_SECTOR_SIZE; |
136 #endif | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
137 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 138 HANDLE hd; |
139 char device[] = "\\\\.\\?:"; | |
140 #endif | |
30777 | 141 #if defined(__OS2__) |
142 char device[] = "X:"; | |
143 HFILE hcd; | |
144 ULONG ulAction; | |
145 ULONG rc; | |
146 #endif | |
9886 | 147 |
22506 | 148 if(mode != STREAM_READ |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
149 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 150 || GetVersion() > 0x80000000 // Win9x |
151 #endif | |
152 ) { | |
9886 | 153 m_struct_free(&stream_opts,opts); |
24257 | 154 return STREAM_UNSUPPORTED; |
9886 | 155 } |
156 | |
10591 | 157 if (!p->device) { |
158 if(cdrom_device) | |
159 p->device = strdup(cdrom_device); | |
160 else | |
161 p->device = strdup(DEFAULT_CDROM_DEVICE); | |
162 } | |
163 | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
164 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 165 device[4] = p->device[0]; |
166 /* open() can't be used for devices so do it the complicated way */ | |
167 hd = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, | |
168 OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); | |
169 f = _open_osfhandle((long)hd, _O_RDONLY); | |
30777 | 170 #elif defined(__OS2__) |
171 device[0] = p->device[0]; | |
172 rc = DosOpen(device, &hcd, &ulAction, 0, FILE_NORMAL, | |
173 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, | |
174 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, | |
175 NULL); | |
176 f = rc ? -1 : hcd; | |
22506 | 177 #else |
9886 | 178 f=open(p->device,O_RDONLY); |
22506 | 179 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
180 if(f<0){ |
9886 | 181 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device); |
182 m_struct_free(&stream_opts,opts); | |
183 return STREAM_ERROR; | |
184 } | |
185 | |
186 vcd = vcd_read_toc(f); | |
187 if(!vcd) { | |
188 mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n"); | |
189 close(f); | |
190 m_struct_free(&stream_opts,opts); | |
191 return STREAM_ERROR; | |
192 } | |
193 ret2=vcd_get_track_end(vcd,p->track); | |
194 if(ret2<0){ | |
195 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n"); | |
196 close(f); | |
197 free(vcd); | |
198 m_struct_free(&stream_opts,opts); | |
199 return STREAM_ERROR; | |
200 } | |
201 ret=vcd_seek_to_track(vcd,p->track); | |
202 if(ret<0){ | |
203 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n"); | |
204 close(f); | |
205 free(vcd); | |
206 m_struct_free(&stream_opts,opts); | |
207 return STREAM_ERROR; | |
208 } | |
22775
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
209 /* search forward up to at most 3 seconds to skip leading margin */ |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
210 sect = ret / VCD_SECTOR_DATA; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
211 for (tmp = sect; tmp < sect + 3 * 75; tmp++) { |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
212 char mem[VCD_SECTOR_DATA]; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
213 //since MPEG packs are block-aligned we stop discarding sectors if they are non-null |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
214 if (vcd_read(vcd, mem) != VCD_SECTOR_DATA || mem[2] || mem[3]) |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
215 break; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
216 } |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
217 mp_msg(MSGT_OPEN, MSGL_DBG2, "%d leading sectors skipped\n", tmp - sect); |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
218 vcd_set_msf(vcd, tmp); |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
219 ret = tmp * VCD_SECTOR_DATA; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
220 |
9886 | 221 mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X end: 0x%X\n",ret,ret2); |
222 | |
21848 | 223 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 224 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) { |
225 mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE"); | |
226 } | |
227 #endif | |
228 | |
36433 | 229 vcd->track = p->track; |
230 | |
9886 | 231 stream->fd = f; |
232 stream->type = STREAMTYPE_VCD; | |
233 stream->sector_size = VCD_SECTOR_DATA; | |
234 stream->start_pos=ret; | |
235 stream->end_pos=ret2; | |
236 stream->priv = vcd; | |
237 | |
238 stream->fill_buffer = fill_buffer; | |
239 stream->seek = seek; | |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
240 stream->control = control; |
9886 | 241 stream->close = close_s; |
21926
a8cd73869242
at open() assign *file_format=DEMUXER_TYPE_MPEG_PS to avoid useless demuxer probing
nicodvb
parents:
21848
diff
changeset
|
242 *file_format = DEMUXER_TYPE_MPEG_PS; |
9886 | 243 |
244 m_struct_free(&stream_opts,opts); | |
245 return STREAM_OK; | |
246 } | |
247 | |
25211 | 248 const stream_info_t stream_info_vcd = { |
9886 | 249 "Video CD", |
250 "vcd", | |
251 "Albeu", | |
252 "based on the code from ???", | |
253 open_s, | |
254 { "vcd", NULL }, | |
255 &stream_opts, | |
256 1 // Urls are an option string | |
257 }; |