Mercurial > mplayer.hg
annotate stream/stream_vcd.c @ 33671:a460339acfdf
Fix volume and balance bug.
Changing the volume changed the balance as well,
because the calculation for the balance was wrong.
Additionally, use macro FFMAX() and replace
identical code by a call to existing code.
author | ib |
---|---|
date | Tue, 28 Jun 2011 17:52:30 +0000 |
parents | 045110c125c6 |
children | 206264c532f5 |
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) { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
95 case STREAM_CTRL_GET_NUM_CHAPTERS: |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
96 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
97 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
|
98 if (!vcd) |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
99 break; |
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 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
|
108 if (!vcd) |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
109 break; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
110 r = vcd_seek_to_track(vcd, track); |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
111 if (r >= 0) { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
112 p->track = track; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
113 return STREAM_OK; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
114 } |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
115 break; |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
116 } |
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 { |
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
119 *(unsigned int *)arg = p->track - 1; |
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 | |
229 stream->fd = f; | |
230 stream->type = STREAMTYPE_VCD; | |
231 stream->sector_size = VCD_SECTOR_DATA; | |
232 stream->start_pos=ret; | |
233 stream->end_pos=ret2; | |
234 stream->priv = vcd; | |
235 | |
236 stream->fill_buffer = fill_buffer; | |
237 stream->seek = seek; | |
30977
0b45d6af9ffe
Export VCD tracks as chapters, just like for cue:// URLs.
reimar
parents:
30777
diff
changeset
|
238 stream->control = control; |
9886 | 239 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
|
240 *file_format = DEMUXER_TYPE_MPEG_PS; |
9886 | 241 |
242 m_struct_free(&stream_opts,opts); | |
243 return STREAM_OK; | |
244 } | |
245 | |
25211 | 246 const stream_info_t stream_info_vcd = { |
9886 | 247 "Video CD", |
248 "vcd", | |
249 "Albeu", | |
250 "based on the code from ???", | |
251 open_s, | |
252 { "vcd", NULL }, | |
253 &stream_opts, | |
254 1 // Urls are an option string | |
255 }; |