Mercurial > mplayer.hg
annotate stream/stream_vcd.c @ 35005:b1a1dcae9760
Replace MESA YCBCR support by the Apple variant.
This adds hardware support for yuy2 and uyvy color formats when running
on OSX.
In addition add some hacks to make it fast (at least on PPC Mac Mini running
OSX 10.5), ca. 20% faster than -vo corevideo.
The MESA YCBCR variant never worked properly and has become even more broken
and thus been disabled in most maintained drivers and thus is really
a dead-end.
author | reimar |
---|---|
date | Sat, 18 Aug 2012 15:54:34 +0000 |
parents | 206264c532f5 |
children | b5abdfe9bc61 |
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 | |
86 static int seek(stream_t *s,off_t newpos) { | |
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) { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
93 struct stream_priv_s *p = stream->priv; |
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 mp_vcd_priv_t *vcd = vcd_read_toc(stream->fd); |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
99 if (!vcd) |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
100 break; |
30981 | 101 *(unsigned int *)arg = vcd_end_track(vcd); |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
102 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
103 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
104 case STREAM_CTRL_SEEK_TO_CHAPTER: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
105 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
106 int r; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
107 unsigned int track = *(unsigned int *)arg + 1; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
108 mp_vcd_priv_t *vcd = vcd_read_toc(stream->fd); |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
109 if (!vcd) |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
110 break; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
111 r = vcd_seek_to_track(vcd, track); |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
112 if (r >= 0) { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
113 p->track = track; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
114 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
115 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
116 break; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
117 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
118 case STREAM_CTRL_GET_CURRENT_CHAPTER: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
119 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
120 *(unsigned int *)arg = p->track - 1; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
121 return STREAM_OK; |
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 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
124 return STREAM_UNSUPPORTED; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
125 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
126 |
9886 | 127 static void close_s(stream_t *stream) { |
128 free(stream->priv); | |
129 } | |
130 | |
131 static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { | |
30752 | 132 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
|
133 int ret,ret2,f,sect,tmp; |
9886 | 134 mp_vcd_priv_t* vcd; |
21848 | 135 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 136 int bsize = VCD_SECTOR_SIZE; |
137 #endif | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
138 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 139 HANDLE hd; |
140 char device[] = "\\\\.\\?:"; | |
141 #endif | |
30777 | 142 #if defined(__OS2__) |
143 char device[] = "X:"; | |
144 HFILE hcd; | |
145 ULONG ulAction; | |
146 ULONG rc; | |
147 #endif | |
9886 | 148 |
22506 | 149 if(mode != STREAM_READ |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
150 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 151 || GetVersion() > 0x80000000 // Win9x |
152 #endif | |
153 ) { | |
9886 | 154 m_struct_free(&stream_opts,opts); |
24257 | 155 return STREAM_UNSUPPORTED; |
9886 | 156 } |
157 | |
10591 | 158 if (!p->device) { |
159 if(cdrom_device) | |
160 p->device = strdup(cdrom_device); | |
161 else | |
162 p->device = strdup(DEFAULT_CDROM_DEVICE); | |
163 } | |
164 | |
27727
48c1ae64255b
Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents:
25691
diff
changeset
|
165 #if defined(__MINGW32__) || defined(__CYGWIN__) |
22506 | 166 device[4] = p->device[0]; |
167 /* open() can't be used for devices so do it the complicated way */ | |
168 hd = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, | |
169 OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); | |
170 f = _open_osfhandle((long)hd, _O_RDONLY); | |
30777 | 171 #elif defined(__OS2__) |
172 device[0] = p->device[0]; | |
173 rc = DosOpen(device, &hcd, &ulAction, 0, FILE_NORMAL, | |
174 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, | |
175 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD, | |
176 NULL); | |
177 f = rc ? -1 : hcd; | |
22506 | 178 #else |
9886 | 179 f=open(p->device,O_RDONLY); |
22506 | 180 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
181 if(f<0){ |
9886 | 182 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device); |
183 m_struct_free(&stream_opts,opts); | |
184 return STREAM_ERROR; | |
185 } | |
186 | |
187 vcd = vcd_read_toc(f); | |
188 if(!vcd) { | |
189 mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n"); | |
190 close(f); | |
191 m_struct_free(&stream_opts,opts); | |
192 return STREAM_ERROR; | |
193 } | |
194 ret2=vcd_get_track_end(vcd,p->track); | |
195 if(ret2<0){ | |
196 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n"); | |
197 close(f); | |
198 free(vcd); | |
199 m_struct_free(&stream_opts,opts); | |
200 return STREAM_ERROR; | |
201 } | |
202 ret=vcd_seek_to_track(vcd,p->track); | |
203 if(ret<0){ | |
204 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n"); | |
205 close(f); | |
206 free(vcd); | |
207 m_struct_free(&stream_opts,opts); | |
208 return STREAM_ERROR; | |
209 } | |
22775
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
210 /* 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
|
211 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
|
212 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
|
213 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
|
214 //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
|
215 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
|
216 break; |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
217 } |
f6dc5fd2b347
at open() discard front margin/empty sectors (fixes demuxing by libavformat); patch by Zuxy meng
nicodvb
parents:
22506
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 |
9886 | 222 mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X end: 0x%X\n",ret,ret2); |
223 | |
21848 | 224 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
9886 | 225 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) { |
226 mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE"); | |
227 } | |
228 #endif | |
229 | |
230 stream->fd = f; | |
231 stream->type = STREAMTYPE_VCD; | |
232 stream->sector_size = VCD_SECTOR_DATA; | |
233 stream->start_pos=ret; | |
234 stream->end_pos=ret2; | |
235 stream->priv = vcd; | |
236 | |
237 stream->fill_buffer = fill_buffer; | |
238 stream->seek = seek; | |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
239 stream->control = control; |
9886 | 240 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
|
241 *file_format = DEMUXER_TYPE_MPEG_PS; |
9886 | 242 |
243 m_struct_free(&stream_opts,opts); | |
244 return STREAM_OK; | |
245 } | |
246 | |
25211 | 247 const stream_info_t stream_info_vcd = { |
9886 | 248 "Video CD", |
249 "vcd", | |
250 "Albeu", | |
251 "based on the code from ???", | |
252 open_s, | |
253 { "vcd", NULL }, | |
254 &stream_opts, | |
255 1 // Urls are an option string | |
256 }; |