Mercurial > mplayer.hg
annotate stream/stream.c @ 27409:e2de11109139
If (has outline) blur(outline) else blur(glyph).
If there is an outline, the glyph itself should not be blurred. Keeps
the border between glyph and outline clear (unblurred), which is
probably how it should be.
Patch by Diogo Franco (diogomfranco gmail com).
author | eugeni |
---|---|
date | Thu, 07 Aug 2008 22:20:58 +0000 |
parents | d47744b95b78 |
children | 5a30f5bc23a0 |
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> |
9794 | 13 #include <strings.h> |
578 | 14 |
1430 | 15 #include "config.h" |
10281 | 16 |
17 #ifndef HAVE_WINSOCK2 | |
18 #define closesocket close | |
19 #else | |
20 #include <winsock2.h> | |
21 #endif | |
22 | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
23 #include "mp_msg.h" |
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
24 #include "help_mp.h" |
17012 | 25 #include "osdep/shmem.h" |
578 | 26 |
27 #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
|
28 #include "libmpdemux/demuxer.h" |
578 | 29 |
17012 | 30 #include "m_option.h" |
31 #include "m_struct.h" | |
9794 | 32 |
19808
5385740067a1
* remove extern definitions of functions in .c files
attila
parents:
19568
diff
changeset
|
33 #include "cache2.h" |
1 | 34 |
8812 | 35 //#include "vcd_read_bincue.h" |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
36 |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
37 static int (*stream_check_interrupt_cb)(int time) = NULL; |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
38 |
25211 | 39 extern const stream_info_t stream_info_vcd; |
40 extern const stream_info_t stream_info_cdda; | |
41 extern const stream_info_t stream_info_netstream; | |
42 extern const stream_info_t stream_info_pnm; | |
43 extern const stream_info_t stream_info_asf; | |
44 extern const stream_info_t stream_info_rtsp; | |
45 extern const stream_info_t stream_info_rtp; | |
46 extern const stream_info_t stream_info_udp; | |
47 extern const stream_info_t stream_info_http1; | |
48 extern const stream_info_t stream_info_http2; | |
49 extern const stream_info_t stream_info_dvb; | |
50 extern const stream_info_t stream_info_tv; | |
51 extern const stream_info_t stream_info_radio; | |
52 extern const stream_info_t stream_info_pvr; | |
53 extern const stream_info_t stream_info_ftp; | |
54 extern const stream_info_t stream_info_vstream; | |
55 extern const stream_info_t stream_info_dvdnav; | |
56 extern const stream_info_t stream_info_smb; | |
57 extern const stream_info_t stream_info_sdp; | |
58 extern const stream_info_t stream_info_rtsp_sip; | |
10560 | 59 |
25211 | 60 extern const stream_info_t stream_info_cue; |
61 extern const stream_info_t stream_info_null; | |
62 extern const stream_info_t stream_info_mf; | |
63 extern const stream_info_t stream_info_file; | |
64 extern const stream_info_t stream_info_ifo; | |
65 extern const stream_info_t stream_info_dvd; | |
9794 | 66 |
25209 | 67 static const stream_info_t* const auto_open_streams[] = { |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
68 #ifdef CONFIG_VCD |
9886 | 69 &stream_info_vcd, |
70 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
71 #ifdef CONFIG_CDDA |
9801 | 72 &stream_info_cdda, |
9810 | 73 #endif |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
74 #ifdef CONFIG_NETWORK |
9853 | 75 &stream_info_netstream, |
15585 | 76 &stream_info_http1, |
77 &stream_info_asf, | |
78 &stream_info_pnm, | |
79 &stream_info_rtsp, | |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
80 #ifdef CONFIG_LIVE555 |
15585 | 81 &stream_info_sdp, |
82 &stream_info_rtsp_sip, | |
83 #endif | |
19313
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
84 &stream_info_rtp, |
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
85 &stream_info_udp, |
15585 | 86 &stream_info_http2, |
9853 | 87 #endif |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
88 #ifdef CONFIG_DVBIN |
10560 | 89 &stream_info_dvb, |
90 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
91 #ifdef CONFIG_TV |
19273
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
92 &stream_info_tv, |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
93 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
94 #ifdef CONFIG_RADIO |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
95 &stream_info_radio, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
96 #endif |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
97 #ifdef CONFIG_PVR |
18997 | 98 &stream_info_pvr, |
99 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
100 #ifdef CONFIG_FTP |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
101 &stream_info_ftp, |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
102 #endif |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27370
diff
changeset
|
103 #ifdef CONFIG_VSTREAM |
14836
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
104 &stream_info_vstream, |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
105 #endif |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
106 #ifdef CONFIG_LIBSMBCLIENT |
15520 | 107 &stream_info_smb, |
108 #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
|
109 &stream_info_cue, |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
110 #ifdef CONFIG_DVDREAD |
25210
92204ff32b27
When IFO file is opened (detected by extension), set dvd-device to IFO file's
voroshil
parents:
25209
diff
changeset
|
111 &stream_info_ifo, |
15518 | 112 &stream_info_dvd, |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
113 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
114 #ifdef CONFIG_DVDNAV |
18712
cb7da1894b00
restored support for dvdnav only in the stream layer; all other functionalities are disabled
nicodvb
parents:
18558
diff
changeset
|
115 &stream_info_dvdnav, |
15518 | 116 #endif |
117 | |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
118 &stream_info_null, |
19301 | 119 &stream_info_mf, |
9794 | 120 &stream_info_file, |
121 NULL | |
122 }; | |
123 | |
25207
21d672c608ef
auto_open_streams should have const type, fix also the places where it is used
reimar
parents:
25186
diff
changeset
|
124 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
|
125 char** options, int* file_format, int* ret, |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
126 char** redirected_url) { |
9794 | 127 void* arg = NULL; |
128 stream_t* s; | |
129 m_struct_t* desc = (m_struct_t*)sinfo->opts; | |
130 | |
131 // Parse options | |
132 if(desc) { | |
133 arg = m_struct_alloc(desc); | |
134 if(sinfo->opts_url) { | |
135 m_option_t url_opt = | |
136 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; | |
137 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { | |
138 mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); | |
139 m_struct_free(desc,arg); | |
140 return NULL; | |
141 } | |
142 } | |
143 if(options) { | |
144 int i; | |
145 for(i = 0 ; options[i] != NULL ; i += 2) { | |
146 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", | |
147 options[i],options[i+1]); | |
148 if(!m_struct_set(desc,arg,options[i],options[i+1])) | |
149 mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n", | |
150 options[i],options[i+1]); | |
151 } | |
152 } | |
153 } | |
154 s = new_stream(-2,-2); | |
155 s->url=strdup(filename); | |
156 s->flags |= mode; | |
157 *ret = sinfo->open(s,mode,arg,file_format); | |
158 if((*ret) != STREAM_OK) { | |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
159 #ifdef CONFIG_NETWORK |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
160 if (*ret == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
161 if (s->streaming_ctrl && s->streaming_ctrl->url |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
162 && s->streaming_ctrl->url->url) |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
163 *redirected_url = strdup(s->streaming_ctrl->url->url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
164 else |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
165 *redirected_url = NULL; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
166 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
167 streaming_ctrl_free(s->streaming_ctrl); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
168 #endif |
9794 | 169 free(s->url); |
170 free(s); | |
171 return NULL; | |
172 } | |
173 if(s->type <= -2) | |
174 mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); | |
175 if(s->flags & STREAM_SEEK && !s->seek) | |
176 s->flags &= ~STREAM_SEEK; | |
177 if(s->seek && !(s->flags & STREAM_SEEK)) | |
9853 | 178 s->flags |= STREAM_SEEK; |
9794 | 179 |
21659 | 180 s->mode = mode; |
9794 | 181 |
182 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); | |
183 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); | |
184 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); | |
185 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); | |
186 | |
187 return s; | |
188 } | |
189 | |
190 | |
191 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format) { | |
192 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
|
193 const stream_info_t* sinfo; |
9794 | 194 stream_t* s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
195 char *redirected_url = NULL; |
9794 | 196 |
197 for(i = 0 ; auto_open_streams[i] ; i++) { | |
198 sinfo = auto_open_streams[i]; | |
199 if(!sinfo->protocols) { | |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10625
diff
changeset
|
200 mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name); |
9794 | 201 continue; |
202 } | |
203 for(j = 0 ; sinfo->protocols[j] ; j++) { | |
204 l = strlen(sinfo->protocols[j]); | |
205 // 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
|
206 if((l == 0 && !strstr(filename, "://")) || |
25429 | 207 ((strncasecmp(sinfo->protocols[j],filename,l) == 0) && |
9794 | 208 (strncmp("://",filename+l,3) == 0))) { |
209 *file_format = DEMUXER_TYPE_UNKNOWN; | |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
210 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
|
211 &redirected_url); |
9794 | 212 if(s) return s; |
25135
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
213 if(r == STREAM_REDIRECTED && redirected_url) { |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
214 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
|
215 sinfo->info, filename, redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
216 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
|
217 free(redirected_url); |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
218 return s; |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
219 } |
66f628d13442
Support stream redirection from http to mms, fix bug #927.
ulion
parents:
24963
diff
changeset
|
220 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
|
221 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); |
9794 | 222 return NULL; |
223 } | |
224 break; | |
225 } | |
226 } | |
227 } | |
228 | |
229 mp_msg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n",filename); | |
230 return NULL; | |
231 } | |
232 | |
21659 | 233 stream_t* open_output_stream(char* filename,char** options) { |
234 int file_format; //unused | |
235 if(!filename) { | |
236 mp_msg(MSGT_OPEN,MSGL_ERR,"open_output_stream(), NULL filename, report this bug\n"); | |
237 return NULL; | |
238 } | |
239 | |
240 return open_stream_full(filename,STREAM_WRITE,options,&file_format); | |
241 } | |
242 | |
1 | 243 //=================== STREAMER ========================= |
244 | |
245 int stream_fill_buffer(stream_t *s){ | |
246 int len; | |
9874
55a43ae66ceb
Oops, I just noticed albeu's revision 1.58 - so I backed out the
rsf
parents:
9873
diff
changeset
|
247 if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } |
1 | 248 switch(s->type){ |
692 | 249 case STREAMTYPE_STREAM: |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
250 #ifdef CONFIG_NETWORK |
24963
0a733c2c577e
Fix possible null-pointer-dereference in stream_fill_buffer().
cehoyos
parents:
24257
diff
changeset
|
251 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
|
252 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
|
253 } else { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
254 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
|
255 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
256 #else |
1 | 257 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
|
258 #endif |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
259 case STREAMTYPE_DS: |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
260 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
|
261 break; |
9610 | 262 |
263 | |
9794 | 264 default: |
265 len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0; | |
1 | 266 } |
267 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } | |
268 s->buf_pos=0; | |
269 s->buf_len=len; | |
270 s->pos+=len; | |
271 // printf("[%d]",len);fflush(stdout); | |
272 return len; | |
273 } | |
274 | |
21659 | 275 int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { |
276 int rd; | |
277 if(!s->write_buffer) | |
278 return -1; | |
279 rd = s->write_buffer(s, buf, len); | |
280 if(rd < 0) | |
281 return -1; | |
282 s->pos += rd; | |
283 return rd; | |
284 } | |
285 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
286 int stream_seek_long(stream_t *s,off_t pos){ |
6814 | 287 off_t newpos=0; |
1 | 288 |
17932 | 289 // if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos); |
1 | 290 |
291 s->buf_pos=s->buf_len=0; | |
292 | |
21659 | 293 if(s->mode == STREAM_WRITE) { |
294 if(!s->seek || !s->seek(s,pos)) | |
295 return 0; | |
296 return 1; | |
297 } | |
298 | |
22362
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
299 if(s->sector_size) |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
300 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
|
301 else |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
302 newpos = pos&(~((off_t)STREAM_BUFFER_SIZE-1)); |
1 | 303 |
17932 | 304 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
|
305 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
|
306 (int64_t)s->pos,(int64_t)newpos,(int64_t)pos,s->buf_len); |
2050 | 307 } |
1 | 308 pos-=newpos; |
309 | |
310 if(newpos==0 || newpos!=s->pos){ | |
311 switch(s->type){ | |
692 | 312 case STREAMTYPE_STREAM: |
313 //s->pos=newpos; // real seek | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
314 // 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
|
315 // 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
|
316 // doesn't support seeking. |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27391
diff
changeset
|
317 #ifdef CONFIG_NETWORK |
11965 | 318 if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one |
319 if(!s->seek(s,newpos)) { | |
320 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
12018 | 321 return 0; |
11965 | 322 } |
323 break; | |
324 } | |
325 | |
8929
c5ca1ae42555
check if seeking supported, otherwise fallback to null reading
arpi
parents:
8812
diff
changeset
|
326 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
|
327 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
|
328 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
|
329 return 1; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
330 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
331 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
332 #else |
692 | 333 if(newpos<s->pos){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
334 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); |
692 | 335 return 1; |
336 } | |
337 while(s->pos<newpos){ | |
338 if(stream_fill_buffer(s)<=0) break; // EOF | |
339 } | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
340 #endif |
692 | 341 break; |
7408 | 342 default: |
9794 | 343 // This should at the beginning as soon as all streams are converted |
344 if(!s->seek) | |
345 return 0; | |
346 // Now seek | |
347 if(!s->seek(s,newpos)) { | |
348 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
349 return 0; | |
350 } | |
1 | 351 } |
352 // putchar('.');fflush(stdout); | |
353 //} else { | |
354 // putchar('%');fflush(stdout); | |
355 } | |
356 | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
357 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
|
358 if(pos<=s->buf_len){ |
1 | 359 s->buf_pos=pos; // byte position in sector |
360 return 1; | |
361 } | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
362 pos -= s->buf_len; |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
363 } |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
364 |
1999 | 365 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n"); |
366 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
367 mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
1 | 368 return 0; |
369 } | |
370 | |
371 | |
372 void stream_reset(stream_t *s){ | |
373 if(s->eof){ | |
374 s->pos=0; //ftell(f); | |
375 // s->buf_pos=s->buf_len=0; | |
376 s->eof=0; | |
377 } | |
9853 | 378 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL); |
1 | 379 //stream_seek(s,0); |
380 } | |
381 | |
17712 | 382 int stream_control(stream_t *s, int cmd, void *arg){ |
24257 | 383 if(!s->control) return STREAM_UNSUPPORTED; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
384 #ifdef CONFIG_STREAM_CACHE |
26833
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
385 if (s->cache_pid) |
77003eb2d9a8
Add basic support for stream controls with cache enabled.
reimar
parents:
26326
diff
changeset
|
386 return cache_do_control(s, cmd, arg); |
27178
023835d5dfb9
Surround stream cache specific code by an appropriate #ifdef; fixes linking
diego
parents:
26833
diff
changeset
|
387 #endif |
17696
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
388 return s->control(s, cmd, arg); |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
389 } |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
390 |
2144 | 391 stream_t* new_memory_stream(unsigned char* data,int len){ |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
392 stream_t *s; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
393 |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
394 if(len < 0) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
395 return NULL; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
396 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
|
397 memset(s,0,sizeof(stream_t)); |
2144 | 398 s->fd=-1; |
399 s->type=STREAMTYPE_MEMORY; | |
400 s->buf_pos=0; s->buf_len=len; | |
401 s->start_pos=0; s->end_pos=len; | |
402 stream_reset(s); | |
403 s->pos=len; | |
404 memcpy(s->buffer,data,len); | |
405 return s; | |
406 } | |
407 | |
1 | 408 stream_t* new_stream(int fd,int type){ |
409 stream_t *s=malloc(sizeof(stream_t)); | |
3291 | 410 if(s==NULL) return NULL; |
411 memset(s,0,sizeof(stream_t)); | |
10281 | 412 |
413 #ifdef HAVE_WINSOCK2 | |
414 { | |
415 WSADATA wsdata; | |
416 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later) | |
417 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp); | |
418 } | |
419 #endif | |
3291 | 420 |
1 | 421 s->fd=fd; |
422 s->type=type; | |
180 | 423 s->buf_pos=s->buf_len=0; |
598 | 424 s->start_pos=s->end_pos=0; |
1642 | 425 s->priv=NULL; |
7407 | 426 s->url=NULL; |
2322 | 427 s->cache_pid=0; |
1 | 428 stream_reset(s); |
429 return s; | |
430 } | |
431 | |
432 void free_stream(stream_t *s){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5982
diff
changeset
|
433 // printf("\n*** free_stream() called ***\n"); |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27178
diff
changeset
|
434 #ifdef CONFIG_STREAM_CACHE |
4893 | 435 if(s->cache_pid) { |
9915 | 436 cache_uninit(s); |
4893 | 437 } |
9798 | 438 #endif |
15520 | 439 if(s->close) s->close(s); |
15421
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
440 if(s->fd>0){ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
441 /* on unix we define closesocket to close |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
442 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
|
443 network socket and file */ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
444 if(s->url && strstr(s->url,"://")) |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
445 closesocket(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
446 else close(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
447 } |
10281 | 448 #ifdef HAVE_WINSOCK2 |
449 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n"); | |
450 WSACleanup(); // there might be a better place for this (-> later) | |
451 #endif | |
9794 | 452 // Disabled atm, i don't like that. s->priv can be anything after all |
453 // streams should destroy their priv on close | |
454 //if(s->priv) free(s->priv); | |
455 if(s->url) free(s->url); | |
1 | 456 free(s); |
457 } | |
458 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
459 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
|
460 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
|
461 s->priv = ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
462 return s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
463 } |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
464 |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
465 void stream_set_interrupt_callback(int (*cb)(int)) { |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
466 stream_check_interrupt_cb = cb; |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
467 } |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
468 |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
469 int stream_check_interrupt(int time) { |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
470 if(!stream_check_interrupt_cb) return 0; |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
471 return stream_check_interrupt_cb(time); |
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
26007
diff
changeset
|
472 } |