Mercurial > mplayer.hg
annotate stream/stream_vcd.c @ 30884:53901d222e8a
Announce SMP support for Win32.
Don't hardcode dwNumberOfProcessors=1 for Win32 anymore; the mutex/event code
is still far from perfect, but now good enough that I can't find any codecs
that breaks with this (tested on a quad with various codecs). This tells
codecs they can use more than one core if they want to (some already did, by
launching multiple threads even when told there was only a single core).
author | sesse |
---|---|
date | Wed, 17 Mar 2010 23:33:26 +0000 |
parents | 079be31079d3 |
children | 0b45d6af9ffe |
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 |
10591 | 55 extern char *cdrom_device; |
56 | |
9886 | 57 static struct stream_priv_s { |
58 int track; | |
59 char* device; | |
60 } stream_priv_dflts = { | |
61 1, | |
10591 | 62 NULL |
9886 | 63 }; |
64 | |
65 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
66 /// URL definition | |
25242 | 67 static const m_option_t stream_opts_fields[] = { |
9886 | 68 { "track", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, |
69 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
70 /// For url parsing | |
71 { "hostname", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, | |
72 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
73 { NULL, NULL, 0, 0, 0, 0, NULL } | |
74 }; | |
25691 | 75 static const struct m_struct_st stream_opts = { |
9886 | 76 "vcd", |
77 sizeof(struct stream_priv_s), | |
78 &stream_priv_dflts, | |
79 stream_opts_fields | |
80 }; | |
81 | |
82 static int fill_buffer(stream_t *s, char* buffer, int max_len){ | |
15912 | 83 if(s->pos > s->end_pos) /// don't past end of current track |
84 return 0; | |
9886 | 85 return vcd_read(s->priv,buffer); |
86 } | |
87 | |
88 static int seek(stream_t *s,off_t newpos) { | |
89 s->pos = newpos; | |
90 vcd_set_msf(s->priv,s->pos/VCD_SECTOR_DATA); | |
91 return 1; | |
92 } | |
93 | |
94 static void close_s(stream_t *stream) { | |
95 free(stream->priv); | |
96 } | |
97 | |
98 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { | |
30752 | 99 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
|
100 int ret,ret2,f,sect,tmp; |
9886 | 101 mp_vcd_priv_t* vcd; |
21848 | 102 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 103 int bsize = VCD_SECTOR_SIZE; |
104 #endif | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
105 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 106 HANDLE hd; |
107 char device[] = "\\\\.\\?:"; | |
108 #endif | |
30777 | 109 #if defined(__OS2__) |
110 char device[] = "X:"; | |
111 HFILE hcd; | |
112 ULONG ulAction; | |
113 ULONG rc; | |
114 #endif | |
9886 | 115 |
22506 | 116 if(mode != STREAM_READ |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
117 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 118 || GetVersion() > 0x80000000 // Win9x |
119 #endif | |
120 ) { | |
9886 | 121 m_struct_free(&stream_opts,opts); |
24257 | 122 return STREAM_UNSUPPORTED; |
9886 | 123 } |
124 | |
10591 | 125 if (!p->device) { |
126 if(cdrom_device) | |
127 p->device = strdup(cdrom_device); | |
128 else | |
129 p->device = strdup(DEFAULT_CDROM_DEVICE); | |
130 } | |
131 | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
132 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 133 device[4] = p->device[0]; |
134 /* open() can't be used for devices so do it the complicated way */ | |
135 hd = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, | |
136 OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); | |
137 f = _open_osfhandle((long)hd, _O_RDONLY); | |
30777 | 138 #elif defined(__OS2__) |
139 device[0] = p->device[0]; | |
140 rc = DosOpen(device, &hcd, &ulAction, 0, FILE_NORMAL, | |
141 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, | |
142 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, | |
143 NULL); | |
144 f = rc ? -1 : hcd; | |
22506 | 145 #else |
9886 | 146 f=open(p->device,O_RDONLY); |
22506 | 147 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
148 if(f<0){ |
9886 | 149 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device); |
150 m_struct_free(&stream_opts,opts); | |
151 return STREAM_ERROR; | |
152 } | |
153 | |
154 vcd = vcd_read_toc(f); | |
155 if(!vcd) { | |
156 mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n"); | |
157 close(f); | |
158 m_struct_free(&stream_opts,opts); | |
159 return STREAM_ERROR; | |
160 } | |
161 ret2=vcd_get_track_end(vcd,p->track); | |
162 if(ret2<0){ | |
163 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n"); | |
164 close(f); | |
165 free(vcd); | |
166 m_struct_free(&stream_opts,opts); | |
167 return STREAM_ERROR; | |
168 } | |
169 ret=vcd_seek_to_track(vcd,p->track); | |
170 if(ret<0){ | |
171 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n"); | |
172 close(f); | |
173 free(vcd); | |
174 m_struct_free(&stream_opts,opts); | |
175 return STREAM_ERROR; | |
176 } | |
22775
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
177 /* 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
|
178 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
|
179 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
|
180 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
|
181 //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
|
182 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
|
183 break; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
184 } |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 |
9886 | 189 mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X end: 0x%X\n",ret,ret2); |
190 | |
21848 | 191 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 192 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) { |
193 mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE"); | |
194 } | |
195 #endif | |
196 | |
197 stream->fd = f; | |
198 stream->type = STREAMTYPE_VCD; | |
199 stream->sector_size = VCD_SECTOR_DATA; | |
200 stream->start_pos=ret; | |
201 stream->end_pos=ret2; | |
202 stream->priv = vcd; | |
203 | |
204 stream->fill_buffer = fill_buffer; | |
205 stream->seek = seek; | |
206 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
|
207 *file_format = DEMUXER_TYPE_MPEG_PS; |
9886 | 208 |
209 m_struct_free(&stream_opts,opts); | |
210 return STREAM_OK; | |
211 } | |
212 | |
25211 | 213 const stream_info_t stream_info_vcd = { |
9886 | 214 "Video CD", |
215 "vcd", | |
216 "Albeu", | |
217 "based on the code from ???", | |
218 open_s, | |
219 { "vcd", NULL }, | |
220 &stream_opts, | |
221 1 // Urls are an option string | |
222 }; |