Mercurial > mplayer.hg
annotate stream/stream.c @ 25210:92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
directory and start dvd:// stream instead of file://.
If VTS_<N>_*.IFO is opened, open stream as dvd://<N>
As Nico Sabbi said:
There is no no guarantie that title N is in titleset N,
but there are at least good chances.
The main purpose of this patch is ability to load DVDs, stored on HDD,
using OSD menu.
Modified patch from Benjamin Zores ben at geexbox dot org
author | voroshil |
---|---|
date | Sun, 02 Dec 2007 13:13:02 +0000 |
parents | 7d2a9ae30c67 |
children | c1d17bd6683c |
rev | line source |
---|---|
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
1 |
1430 | 2 #include <stdio.h> |
3 #include <stdlib.h> | |
4 #include <unistd.h> | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
5 |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
6 #include <sys/types.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
7 #include <sys/stat.h> |
9798 | 8 #ifndef __MINGW32__ |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
9 #include <sys/ioctl.h> |
6814 | 10 #include <sys/wait.h> |
9798 | 11 #endif |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
12 #include <fcntl.h> |
2322 | 13 #include <signal.h> |
9794 | 14 #include <strings.h> |
578 | 15 |
1430 | 16 #include "config.h" |
10281 | 17 |
18 #ifndef HAVE_WINSOCK2 | |
19 #define closesocket close | |
20 #else | |
21 #include <winsock2.h> | |
22 #endif | |
23 | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
24 #include "mp_msg.h" |
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
25 #include "help_mp.h" |
17012 | 26 #include "osdep/shmem.h" |
578 | 27 |
28 #include "stream.h" | |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19301
diff
changeset
|
29 #include "libmpdemux/demuxer.h" |
578 | 30 |
17012 | 31 #include "m_option.h" |
32 #include "m_struct.h" | |
9794 | 33 |
19808
5385740067a1
* remove extern definitions of functions in .c files
attila
parents:
19568
diff
changeset
|
34 #include "cache2.h" |
1 | 35 |
8812 | 36 //#include "vcd_read_bincue.h" |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
37 |
9886 | 38 #ifdef HAVE_VCD |
39 extern stream_info_t stream_info_vcd; | |
40 #endif | |
9810 | 41 #ifdef HAVE_CDDA |
9801 | 42 extern stream_info_t stream_info_cdda; |
9810 | 43 #endif |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
44 #ifdef MPLAYER_NETWORK |
9853 | 45 extern stream_info_t stream_info_netstream; |
15585 | 46 extern stream_info_t stream_info_pnm; |
47 extern stream_info_t stream_info_asf; | |
48 extern stream_info_t stream_info_rtsp; | |
19313
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
49 extern stream_info_t stream_info_rtp; |
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
50 extern stream_info_t stream_info_udp; |
15585 | 51 extern stream_info_t stream_info_http1; |
52 extern stream_info_t stream_info_http2; | |
9853 | 53 #endif |
10560 | 54 #ifdef HAS_DVBIN_SUPPORT |
55 extern stream_info_t stream_info_dvb; | |
56 #endif | |
19273
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
57 #ifdef USE_TV |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
58 extern stream_info_t stream_info_tv; |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
59 #endif |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
60 #ifdef USE_RADIO |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
61 extern stream_info_t stream_info_radio; |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
62 #endif |
18997 | 63 #ifdef HAVE_PVR |
64 extern stream_info_t stream_info_pvr; | |
65 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
66 #ifdef HAVE_FTP |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
67 extern stream_info_t stream_info_ftp; |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
68 #endif |
14836
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
69 #ifdef HAVE_VSTREAM |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
70 extern stream_info_t stream_info_vstream; |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
71 #endif |
15518 | 72 #ifdef USE_DVDNAV |
73 extern stream_info_t stream_info_dvdnav; | |
74 #endif | |
15520 | 75 #ifdef LIBSMBCLIENT |
76 extern stream_info_t stream_info_smb; | |
77 #endif | |
16572
56a5f69e9b35
"LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents:
15585
diff
changeset
|
78 #ifdef STREAMING_LIVE555 |
15585 | 79 extern stream_info_t stream_info_sdp; |
80 extern stream_info_t stream_info_rtsp_sip; | |
16762 | 81 #endif |
10560 | 82 |
15476
5eb4994a691f
ported cue:// to the new stream api; note: this stream must still be optimized in its read() and seek() functions
nicodvb
parents:
15421
diff
changeset
|
83 extern stream_info_t stream_info_cue; |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
84 extern stream_info_t stream_info_null; |
19301 | 85 extern stream_info_t stream_info_mf; |
9794 | 86 extern stream_info_t stream_info_file; |
20635
9ed557ae1383
Streamline and simplify internal vs external libdvdread handling.
diego
parents:
19808
diff
changeset
|
87 #ifdef USE_DVDREAD |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25209
diff
changeset
|
88 extern stream_info_t stream_info_ifo; |
15518 | 89 extern stream_info_t stream_info_dvd; |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
90 #endif |
9794 | 91 |
25209 | 92 static const stream_info_t* const auto_open_streams[] = { |
9886 | 93 #ifdef HAVE_VCD |
94 &stream_info_vcd, | |
95 #endif | |
9810 | 96 #ifdef HAVE_CDDA |
9801 | 97 &stream_info_cdda, |
9810 | 98 #endif |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
99 #ifdef MPLAYER_NETWORK |
9853 | 100 &stream_info_netstream, |
15585 | 101 &stream_info_http1, |
102 &stream_info_asf, | |
103 &stream_info_pnm, | |
104 &stream_info_rtsp, | |
16572
56a5f69e9b35
"LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents:
15585
diff
changeset
|
105 #ifdef STREAMING_LIVE555 |
15585 | 106 &stream_info_sdp, |
107 &stream_info_rtsp_sip, | |
108 #endif | |
19313
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
109 &stream_info_rtp, |
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
110 &stream_info_udp, |
15585 | 111 &stream_info_http2, |
9853 | 112 #endif |
10560 | 113 #ifdef HAS_DVBIN_SUPPORT |
114 &stream_info_dvb, | |
115 #endif | |
19273
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
116 #ifdef USE_TV |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
117 &stream_info_tv, |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
118 #endif |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
119 #ifdef USE_RADIO |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
120 &stream_info_radio, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
121 #endif |
18997 | 122 #ifdef HAVE_PVR |
123 &stream_info_pvr, | |
124 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
125 #ifdef HAVE_FTP |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
126 &stream_info_ftp, |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
127 #endif |
14836
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
128 #ifdef HAVE_VSTREAM |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
129 &stream_info_vstream, |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
130 #endif |
15520 | 131 #ifdef LIBSMBCLIENT |
132 &stream_info_smb, | |
133 #endif | |
15476
5eb4994a691f
ported cue:// to the new stream api; note: this stream must still be optimized in its read() and seek() functions
nicodvb
parents:
15421
diff
changeset
|
134 &stream_info_cue, |
20635
9ed557ae1383
Streamline and simplify internal vs external libdvdread handling.
diego
parents:
19808
diff
changeset
|
135 #ifdef USE_DVDREAD |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25209
diff
changeset
|
136 &stream_info_ifo, |
15518 | 137 &stream_info_dvd, |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
138 #endif |
15518 | 139 #ifdef USE_DVDNAV |
18712
cb7da1894b00
restored support for dvdnav only in the stream layer; all other functionalities are disabled
nicodvb
parents:
18558
diff
changeset
|
140 &stream_info_dvdnav, |
15518 | 141 #endif |
142 | |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
143 &stream_info_null, |
19301 | 144 &stream_info_mf, |
9794 | 145 &stream_info_file, |
146 NULL | |
147 }; | |
148 | |
25207
21d672c608ef
auto_open_streams should have const type, fix also the places where it is used
reimar
parents:
25186
diff
changeset
|
149 stream_t* open_stream_plugin(const stream_info_t* sinfo,char* filename,int mode, |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
150 char** options, int* file_format, int* ret, |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
151 char** redirected_url) { |
9794 | 152 void* arg = NULL; |
153 stream_t* s; | |
154 m_struct_t* desc = (m_struct_t*)sinfo->opts; | |
155 | |
156 // Parse options | |
157 if(desc) { | |
158 arg = m_struct_alloc(desc); | |
159 if(sinfo->opts_url) { | |
160 m_option_t url_opt = | |
161 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; | |
162 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { | |
163 mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); | |
164 m_struct_free(desc,arg); | |
165 return NULL; | |
166 } | |
167 } | |
168 if(options) { | |
169 int i; | |
170 for(i = 0 ; options[i] != NULL ; i += 2) { | |
171 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", | |
172 options[i],options[i+1]); | |
173 if(!m_struct_set(desc,arg,options[i],options[i+1])) | |
174 mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n", | |
175 options[i],options[i+1]); | |
176 } | |
177 } | |
178 } | |
179 s = new_stream(-2,-2); | |
180 s->url=strdup(filename); | |
181 s->flags |= mode; | |
182 *ret = sinfo->open(s,mode,arg,file_format); | |
183 if((*ret) != STREAM_OK) { | |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
184 #ifdef MPLAYER_NETWORK |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
185 if (*ret == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
186 if (s->streaming_ctrl && s->streaming_ctrl->url |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
187 && s->streaming_ctrl->url->url) |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
188 *redirected_url = strdup(s->streaming_ctrl->url->url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
189 else |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
190 *redirected_url = NULL; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
191 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
192 streaming_ctrl_free(s->streaming_ctrl); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
193 #endif |
9794 | 194 free(s->url); |
195 free(s); | |
196 return NULL; | |
197 } | |
198 if(s->type <= -2) | |
199 mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); | |
200 if(s->flags & STREAM_SEEK && !s->seek) | |
201 s->flags &= ~STREAM_SEEK; | |
202 if(s->seek && !(s->flags & STREAM_SEEK)) | |
9853 | 203 s->flags |= STREAM_SEEK; |
9794 | 204 |
21659 | 205 s->mode = mode; |
9794 | 206 |
207 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); | |
208 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); | |
209 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); | |
210 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); | |
211 | |
212 return s; | |
213 } | |
214 | |
215 | |
216 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format) { | |
217 int i,j,l,r; | |
25207
21d672c608ef
auto_open_streams should have const type, fix also the places where it is used
reimar
parents:
25186
diff
changeset
|
218 const stream_info_t* sinfo; |
9794 | 219 stream_t* s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
220 char *redirected_url = NULL; |
9794 | 221 |
222 for(i = 0 ; auto_open_streams[i] ; i++) { | |
223 sinfo = auto_open_streams[i]; | |
224 if(!sinfo->protocols) { | |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10625
diff
changeset
|
225 mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name); |
9794 | 226 continue; |
227 } | |
228 for(j = 0 ; sinfo->protocols[j] ; j++) { | |
229 l = strlen(sinfo->protocols[j]); | |
230 // l == 0 => Don't do protocol matching (ie network and filenames) | |
21493
8ca0be3a46a0
Make sure invalid protocols are rejected instead of treated
reimar
parents:
20635
diff
changeset
|
231 if((l == 0 && !strstr(filename, "://")) || |
8ca0be3a46a0
Make sure invalid protocols are rejected instead of treated
reimar
parents:
20635
diff
changeset
|
232 ((strncmp(sinfo->protocols[j],filename,l) == 0) && |
9794 | 233 (strncmp("://",filename+l,3) == 0))) { |
234 *file_format = DEMUXER_TYPE_UNKNOWN; | |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
235 s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r, |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
236 &redirected_url); |
9794 | 237 if(s) return s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
238 if(r == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
239 mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n", |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
240 sinfo->info, filename, redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
241 s = open_stream_full(redirected_url, mode, options, file_format); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
242 free(redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
243 return s; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
244 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
245 else if(r != STREAM_UNSUPPORTED) { |
16793
8d4fb5469efb
Make a few more messages translatable by moving them into help_mp-en.h.
diego
parents:
16762
diff
changeset
|
246 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); |
9794 | 247 return NULL; |
248 } | |
249 break; | |
250 } | |
251 } | |
252 } | |
253 | |
254 mp_msg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n",filename); | |
255 return NULL; | |
256 } | |
257 | |
21659 | 258 stream_t* open_output_stream(char* filename,char** options) { |
259 int file_format; //unused | |
260 if(!filename) { | |
261 mp_msg(MSGT_OPEN,MSGL_ERR,"open_output_stream(), NULL filename, report this bug\n"); | |
262 return NULL; | |
263 } | |
264 | |
265 return open_stream_full(filename,STREAM_WRITE,options,&file_format); | |
266 } | |
267 | |
1 | 268 //=================== STREAMER ========================= |
269 | |
270 int stream_fill_buffer(stream_t *s){ | |
271 int len; | |
9874
55a43ae66ceb
Oops, I just noticed albeu's revision 1.58 - so I backed out the
rsf
parents:
9873
diff
changeset
|
272 if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } |
1 | 273 switch(s->type){ |
692 | 274 case STREAMTYPE_STREAM: |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
275 #ifdef MPLAYER_NETWORK |
24963
0a733c2c577e
Fix possible null-pointer-dereference in stream_fill_buffer().
cehoyos
parents:
24257
diff
changeset
|
276 if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_read ) { |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
277 len=s->streaming_ctrl->streaming_read(s->fd,s->buffer,STREAM_BUFFER_SIZE, s->streaming_ctrl);break; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
278 } else { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
279 len=read(s->fd,s->buffer,STREAM_BUFFER_SIZE);break; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
280 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
281 #else |
1 | 282 len=read(s->fd,s->buffer,STREAM_BUFFER_SIZE);break; |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
283 #endif |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
284 case STREAMTYPE_DS: |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
285 len = demux_read_data((demux_stream_t*)s->priv,s->buffer,STREAM_BUFFER_SIZE); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
286 break; |
9610 | 287 |
288 | |
9794 | 289 default: |
290 len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0; | |
1 | 291 } |
292 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } | |
293 s->buf_pos=0; | |
294 s->buf_len=len; | |
295 s->pos+=len; | |
296 // printf("[%d]",len);fflush(stdout); | |
297 return len; | |
298 } | |
299 | |
21659 | 300 int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { |
301 int rd; | |
302 if(!s->write_buffer) | |
303 return -1; | |
304 rd = s->write_buffer(s, buf, len); | |
305 if(rd < 0) | |
306 return -1; | |
307 s->pos += rd; | |
308 return rd; | |
309 } | |
310 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
311 int stream_seek_long(stream_t *s,off_t pos){ |
6814 | 312 off_t newpos=0; |
1 | 313 |
17932 | 314 // if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos); |
1 | 315 |
316 s->buf_pos=s->buf_len=0; | |
317 | |
21659 | 318 if(s->mode == STREAM_WRITE) { |
319 if(!s->seek || !s->seek(s,pos)) | |
320 return 0; | |
321 return 1; | |
322 } | |
323 | |
22362
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
324 if(s->sector_size) |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
325 newpos = (pos/s->sector_size)*s->sector_size; |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
326 else |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
327 newpos = pos&(~((off_t)STREAM_BUFFER_SIZE-1)); |
1 | 328 |
17932 | 329 if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ){ |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17932
diff
changeset
|
330 mp_msg(MSGT_STREAM,MSGL_DBG3, "s->pos=%"PRIX64" newpos=%"PRIX64" new_bufpos=%"PRIX64" buflen=%X \n", |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
331 (int64_t)s->pos,(int64_t)newpos,(int64_t)pos,s->buf_len); |
2050 | 332 } |
1 | 333 pos-=newpos; |
334 | |
335 if(newpos==0 || newpos!=s->pos){ | |
336 switch(s->type){ | |
692 | 337 case STREAMTYPE_STREAM: |
338 //s->pos=newpos; // real seek | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
339 // Some streaming protocol allow to seek backward and forward |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
340 // A function call that return -1 can tell that the protocol |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
341 // doesn't support seeking. |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
342 #ifdef MPLAYER_NETWORK |
11965 | 343 if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one |
344 if(!s->seek(s,newpos)) { | |
345 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
12018 | 346 return 0; |
11965 | 347 } |
348 break; | |
349 } | |
350 | |
8929
c5ca1ae42555
check if seeking supported, otherwise fallback to null reading
arpi
parents:
8812
diff
changeset
|
351 if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_seek ) { |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
352 if( s->streaming_ctrl->streaming_seek( s->fd, pos, s->streaming_ctrl )<0 ) { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
353 mp_msg(MSGT_STREAM,MSGL_INFO,"Stream not seekable!\n"); |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
354 return 1; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
355 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
356 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
357 #else |
692 | 358 if(newpos<s->pos){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
359 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); |
692 | 360 return 1; |
361 } | |
362 while(s->pos<newpos){ | |
363 if(stream_fill_buffer(s)<=0) break; // EOF | |
364 } | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
365 #endif |
692 | 366 break; |
7408 | 367 default: |
9794 | 368 // This should at the beginning as soon as all streams are converted |
369 if(!s->seek) | |
370 return 0; | |
371 // Now seek | |
372 if(!s->seek(s,newpos)) { | |
373 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
374 return 0; | |
375 } | |
1 | 376 } |
377 // putchar('.');fflush(stdout); | |
378 //} else { | |
379 // putchar('%');fflush(stdout); | |
380 } | |
381 | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
382 while(stream_fill_buffer(s) > 0 && pos >= 0) { |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
383 if(pos<=s->buf_len){ |
1 | 384 s->buf_pos=pos; // byte position in sector |
385 return 1; | |
386 } | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
387 pos -= s->buf_len; |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
388 } |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
389 |
1999 | 390 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n"); |
391 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
392 mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
1 | 393 return 0; |
394 } | |
395 | |
396 | |
397 void stream_reset(stream_t *s){ | |
398 if(s->eof){ | |
399 s->pos=0; //ftell(f); | |
400 // s->buf_pos=s->buf_len=0; | |
401 s->eof=0; | |
402 } | |
9853 | 403 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL); |
1 | 404 //stream_seek(s,0); |
405 } | |
406 | |
17712 | 407 int stream_control(stream_t *s, int cmd, void *arg){ |
24257 | 408 if(!s->control) return STREAM_UNSUPPORTED; |
17696
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
409 return s->control(s, cmd, arg); |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
410 } |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
411 |
2144 | 412 stream_t* new_memory_stream(unsigned char* data,int len){ |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
413 stream_t *s; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
414 |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
415 if(len < 0) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
416 return NULL; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
417 s=malloc(sizeof(stream_t)+len); |
6892
b8e0b1c54940
10000l - didn't clear new stream struct, causing possible sig11 in cache layer
arpi
parents:
6814
diff
changeset
|
418 memset(s,0,sizeof(stream_t)); |
2144 | 419 s->fd=-1; |
420 s->type=STREAMTYPE_MEMORY; | |
421 s->buf_pos=0; s->buf_len=len; | |
422 s->start_pos=0; s->end_pos=len; | |
423 stream_reset(s); | |
424 s->pos=len; | |
425 memcpy(s->buffer,data,len); | |
426 return s; | |
427 } | |
428 | |
1 | 429 stream_t* new_stream(int fd,int type){ |
430 stream_t *s=malloc(sizeof(stream_t)); | |
3291 | 431 if(s==NULL) return NULL; |
432 memset(s,0,sizeof(stream_t)); | |
10281 | 433 |
434 #ifdef HAVE_WINSOCK2 | |
435 { | |
436 WSADATA wsdata; | |
437 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later) | |
438 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp); | |
439 } | |
440 #endif | |
3291 | 441 |
1 | 442 s->fd=fd; |
443 s->type=type; | |
180 | 444 s->buf_pos=s->buf_len=0; |
598 | 445 s->start_pos=s->end_pos=0; |
1642 | 446 s->priv=NULL; |
7407 | 447 s->url=NULL; |
2322 | 448 s->cache_pid=0; |
1 | 449 stream_reset(s); |
450 return s; | |
451 } | |
452 | |
453 void free_stream(stream_t *s){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5982
diff
changeset
|
454 // printf("\n*** free_stream() called ***\n"); |
9798 | 455 #ifdef USE_STREAM_CACHE |
4893 | 456 if(s->cache_pid) { |
9915 | 457 cache_uninit(s); |
4893 | 458 } |
9798 | 459 #endif |
15520 | 460 if(s->close) s->close(s); |
15421
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
461 if(s->fd>0){ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
462 /* on unix we define closesocket to close |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
463 on windows however we have to distinguish between |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
464 network socket and file */ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
465 if(s->url && strstr(s->url,"://")) |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
466 closesocket(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
467 else close(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
468 } |
10281 | 469 #ifdef HAVE_WINSOCK2 |
470 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n"); | |
471 WSACleanup(); // there might be a better place for this (-> later) | |
472 #endif | |
9794 | 473 // Disabled atm, i don't like that. s->priv can be anything after all |
474 // streams should destroy their priv on close | |
475 //if(s->priv) free(s->priv); | |
476 if(s->url) free(s->url); | |
1 | 477 free(s); |
478 } | |
479 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
480 stream_t* new_ds_stream(demux_stream_t *ds) { |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
481 stream_t* s = new_stream(-1,STREAMTYPE_DS); |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
482 s->priv = ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
483 return s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
484 } |