Mercurial > mplayer.hg
annotate stream/stream.c @ 24787:02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
mode.
For this, crop amounts are passed from vo_gl as negative margins sizes. They
are used to calculate aspect ratio. They are ignored when calculating subtitle
positions, so subtitles will stay on screen most of the time.
Based on a patch by Jindrich Makovicka [makovick gmail com].
author | eugeni |
---|---|
date | Fri, 19 Oct 2007 18:16:23 +0000 |
parents | d261f5109660 |
children | 0a733c2c577e |
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 |
15518 | 88 extern stream_info_t stream_info_dvd; |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
89 #endif |
9794 | 90 |
91 stream_info_t* auto_open_streams[] = { | |
9886 | 92 #ifdef HAVE_VCD |
93 &stream_info_vcd, | |
94 #endif | |
9810 | 95 #ifdef HAVE_CDDA |
9801 | 96 &stream_info_cdda, |
9810 | 97 #endif |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
98 #ifdef MPLAYER_NETWORK |
9853 | 99 &stream_info_netstream, |
15585 | 100 &stream_info_http1, |
101 &stream_info_asf, | |
102 &stream_info_pnm, | |
103 &stream_info_rtsp, | |
16572
56a5f69e9b35
"LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents:
15585
diff
changeset
|
104 #ifdef STREAMING_LIVE555 |
15585 | 105 &stream_info_sdp, |
106 &stream_info_rtsp_sip, | |
107 #endif | |
19313
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
108 &stream_info_rtp, |
0792ad01e9bf
split rtp stack, udp input layer and rtp input layer from rtp.c
ben
parents:
19312
diff
changeset
|
109 &stream_info_udp, |
15585 | 110 &stream_info_http2, |
9853 | 111 #endif |
10560 | 112 #ifdef HAS_DVBIN_SUPPORT |
113 &stream_info_dvb, | |
114 #endif | |
19273
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
115 #ifdef USE_TV |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
116 &stream_info_tv, |
11ec1cb3a7ea
add an explicit tv stream input instead of the previous hack in stream_null
ben
parents:
19271
diff
changeset
|
117 #endif |
19568
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
118 #ifdef USE_RADIO |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
119 &stream_info_radio, |
bd821fd3e244
Radio support, patch by Vladimir Voroshilov (voroshil gmail com)
reimar
parents:
19313
diff
changeset
|
120 #endif |
18997 | 121 #ifdef HAVE_PVR |
122 &stream_info_pvr, | |
123 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
124 #ifdef HAVE_FTP |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
125 &stream_info_ftp, |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
126 #endif |
14836
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
127 #ifdef HAVE_VSTREAM |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
128 &stream_info_vstream, |
8b9738526dd7
added a stream module for the vstream client library
joey
parents:
12018
diff
changeset
|
129 #endif |
15520 | 130 #ifdef LIBSMBCLIENT |
131 &stream_info_smb, | |
132 #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
|
133 &stream_info_cue, |
20635
9ed557ae1383
Streamline and simplify internal vs external libdvdread handling.
diego
parents:
19808
diff
changeset
|
134 #ifdef USE_DVDREAD |
15518 | 135 &stream_info_dvd, |
17191
6ac0b5f0d1ed
fix compilation when dvdkit and dvdread are not available
nicodvb
parents:
17012
diff
changeset
|
136 #endif |
15518 | 137 #ifdef USE_DVDNAV |
18712
cb7da1894b00
restored support for dvdnav only in the stream layer; all other functionalities are disabled
nicodvb
parents:
18558
diff
changeset
|
138 &stream_info_dvdnav, |
15518 | 139 #endif |
140 | |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
141 &stream_info_null, |
19301 | 142 &stream_info_mf, |
9794 | 143 &stream_info_file, |
144 NULL | |
145 }; | |
146 | |
147 stream_t* open_stream_plugin(stream_info_t* sinfo,char* filename,int mode, | |
148 char** options, int* file_format, int* ret) { | |
149 void* arg = NULL; | |
150 stream_t* s; | |
151 m_struct_t* desc = (m_struct_t*)sinfo->opts; | |
152 | |
153 // Parse options | |
154 if(desc) { | |
155 arg = m_struct_alloc(desc); | |
156 if(sinfo->opts_url) { | |
157 m_option_t url_opt = | |
158 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; | |
159 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { | |
160 mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); | |
161 m_struct_free(desc,arg); | |
162 return NULL; | |
163 } | |
164 } | |
165 if(options) { | |
166 int i; | |
167 for(i = 0 ; options[i] != NULL ; i += 2) { | |
168 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", | |
169 options[i],options[i+1]); | |
170 if(!m_struct_set(desc,arg,options[i],options[i+1])) | |
171 mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n", | |
172 options[i],options[i+1]); | |
173 } | |
174 } | |
175 } | |
176 s = new_stream(-2,-2); | |
177 s->url=strdup(filename); | |
178 s->flags |= mode; | |
179 *ret = sinfo->open(s,mode,arg,file_format); | |
180 if((*ret) != STREAM_OK) { | |
181 free(s->url); | |
182 free(s); | |
183 return NULL; | |
184 } | |
185 if(s->type <= -2) | |
186 mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); | |
187 if(s->flags & STREAM_SEEK && !s->seek) | |
188 s->flags &= ~STREAM_SEEK; | |
189 if(s->seek && !(s->flags & STREAM_SEEK)) | |
9853 | 190 s->flags |= STREAM_SEEK; |
9794 | 191 |
21659 | 192 s->mode = mode; |
9794 | 193 |
194 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); | |
195 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); | |
196 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); | |
197 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); | |
198 | |
199 return s; | |
200 } | |
201 | |
202 | |
203 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format) { | |
204 int i,j,l,r; | |
205 stream_info_t* sinfo; | |
206 stream_t* s; | |
207 | |
208 for(i = 0 ; auto_open_streams[i] ; i++) { | |
209 sinfo = auto_open_streams[i]; | |
210 if(!sinfo->protocols) { | |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10625
diff
changeset
|
211 mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name); |
9794 | 212 continue; |
213 } | |
214 for(j = 0 ; sinfo->protocols[j] ; j++) { | |
215 l = strlen(sinfo->protocols[j]); | |
216 // 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
|
217 if((l == 0 && !strstr(filename, "://")) || |
8ca0be3a46a0
Make sure invalid protocols are rejected instead of treated
reimar
parents:
20635
diff
changeset
|
218 ((strncmp(sinfo->protocols[j],filename,l) == 0) && |
9794 | 219 (strncmp("://",filename+l,3) == 0))) { |
220 *file_format = DEMUXER_TYPE_UNKNOWN; | |
221 s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r); | |
222 if(s) return s; | |
24257 | 223 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
|
224 mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); |
9794 | 225 return NULL; |
226 } | |
227 break; | |
228 } | |
229 } | |
230 } | |
231 | |
232 mp_msg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n",filename); | |
233 return NULL; | |
234 } | |
235 | |
21659 | 236 stream_t* open_output_stream(char* filename,char** options) { |
237 int file_format; //unused | |
238 if(!filename) { | |
239 mp_msg(MSGT_OPEN,MSGL_ERR,"open_output_stream(), NULL filename, report this bug\n"); | |
240 return NULL; | |
241 } | |
242 | |
243 return open_stream_full(filename,STREAM_WRITE,options,&file_format); | |
244 } | |
245 | |
1 | 246 //=================== STREAMER ========================= |
247 | |
248 int stream_fill_buffer(stream_t *s){ | |
249 int len; | |
9874
55a43ae66ceb
Oops, I just noticed albeu's revision 1.58 - so I backed out the
rsf
parents:
9873
diff
changeset
|
250 if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } |
1 | 251 switch(s->type){ |
692 | 252 case STREAMTYPE_STREAM: |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
253 #ifdef MPLAYER_NETWORK |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
254 if( s->streaming_ctrl!=NULL ) { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
255 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
|
256 } else { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
257 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
|
258 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
259 #else |
1 | 260 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
|
261 #endif |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
262 case STREAMTYPE_DS: |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
263 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
|
264 break; |
9610 | 265 |
266 | |
9794 | 267 default: |
268 len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0; | |
1 | 269 } |
270 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } | |
271 s->buf_pos=0; | |
272 s->buf_len=len; | |
273 s->pos+=len; | |
274 // printf("[%d]",len);fflush(stdout); | |
275 return len; | |
276 } | |
277 | |
21659 | 278 int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { |
279 int rd; | |
280 if(!s->write_buffer) | |
281 return -1; | |
282 rd = s->write_buffer(s, buf, len); | |
283 if(rd < 0) | |
284 return -1; | |
285 s->pos += rd; | |
286 return rd; | |
287 } | |
288 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
289 int stream_seek_long(stream_t *s,off_t pos){ |
6814 | 290 off_t newpos=0; |
1 | 291 |
17932 | 292 // if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos); |
1 | 293 |
294 s->buf_pos=s->buf_len=0; | |
295 | |
21659 | 296 if(s->mode == STREAM_WRITE) { |
297 if(!s->seek || !s->seek(s,pos)) | |
298 return 0; | |
299 return 1; | |
300 } | |
301 | |
22362
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
302 if(s->sector_size) |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
303 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
|
304 else |
e244d570ba44
cleaned stream_seek() : simplified the alignment to STREAM_BUFFER_SIZE or s->sector_size
nicodvb
parents:
21659
diff
changeset
|
305 newpos = pos&(~((off_t)STREAM_BUFFER_SIZE-1)); |
1 | 306 |
17932 | 307 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
|
308 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
|
309 (int64_t)s->pos,(int64_t)newpos,(int64_t)pos,s->buf_len); |
2050 | 310 } |
1 | 311 pos-=newpos; |
312 | |
313 if(newpos==0 || newpos!=s->pos){ | |
314 switch(s->type){ | |
692 | 315 case STREAMTYPE_STREAM: |
316 //s->pos=newpos; // real seek | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
317 // 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
|
318 // 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
|
319 // doesn't support seeking. |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
320 #ifdef MPLAYER_NETWORK |
11965 | 321 if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one |
322 if(!s->seek(s,newpos)) { | |
323 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
12018 | 324 return 0; |
11965 | 325 } |
326 break; | |
327 } | |
328 | |
8929
c5ca1ae42555
check if seeking supported, otherwise fallback to null reading
arpi
parents:
8812
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 return 1; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
333 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
334 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
335 #else |
692 | 336 if(newpos<s->pos){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
337 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); |
692 | 338 return 1; |
339 } | |
340 while(s->pos<newpos){ | |
341 if(stream_fill_buffer(s)<=0) break; // EOF | |
342 } | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
343 #endif |
692 | 344 break; |
7408 | 345 default: |
9794 | 346 // This should at the beginning as soon as all streams are converted |
347 if(!s->seek) | |
348 return 0; | |
349 // Now seek | |
350 if(!s->seek(s,newpos)) { | |
351 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
352 return 0; | |
353 } | |
1 | 354 } |
355 // putchar('.');fflush(stdout); | |
356 //} else { | |
357 // putchar('%');fflush(stdout); | |
358 } | |
359 | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
360 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
|
361 if(pos<=s->buf_len){ |
1 | 362 s->buf_pos=pos; // byte position in sector |
363 return 1; | |
364 } | |
17878
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
365 pos -= s->buf_len; |
ab0a3e3d32ed
Fix a potential seek failure, fill_buffer doesn't have to
albeu
parents:
17712
diff
changeset
|
366 } |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
367 |
1999 | 368 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n"); |
369 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16572
diff
changeset
|
370 mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%"PRIX64" !\n",(int64_t)(pos+newpos)); |
1 | 371 return 0; |
372 } | |
373 | |
374 | |
375 void stream_reset(stream_t *s){ | |
376 if(s->eof){ | |
377 s->pos=0; //ftell(f); | |
378 // s->buf_pos=s->buf_len=0; | |
379 s->eof=0; | |
380 } | |
9853 | 381 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL); |
1 | 382 //stream_seek(s,0); |
383 } | |
384 | |
17712 | 385 int stream_control(stream_t *s, int cmd, void *arg){ |
24257 | 386 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
|
387 return s->control(s, cmd, arg); |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
388 } |
66d7afee9a46
added new stream_control() and new command: STREAM_CTRL_GET_TIME_LENGTH
nicodvb
parents:
17191
diff
changeset
|
389 |
2144 | 390 stream_t* new_memory_stream(unsigned char* data,int len){ |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
391 stream_t *s; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
392 |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
393 if(len < 0) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
394 return NULL; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18176
diff
changeset
|
395 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
|
396 memset(s,0,sizeof(stream_t)); |
2144 | 397 s->fd=-1; |
398 s->type=STREAMTYPE_MEMORY; | |
399 s->buf_pos=0; s->buf_len=len; | |
400 s->start_pos=0; s->end_pos=len; | |
401 stream_reset(s); | |
402 s->pos=len; | |
403 memcpy(s->buffer,data,len); | |
404 return s; | |
405 } | |
406 | |
1 | 407 stream_t* new_stream(int fd,int type){ |
408 stream_t *s=malloc(sizeof(stream_t)); | |
3291 | 409 if(s==NULL) return NULL; |
410 memset(s,0,sizeof(stream_t)); | |
10281 | 411 |
412 #ifdef HAVE_WINSOCK2 | |
413 { | |
414 WSADATA wsdata; | |
415 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later) | |
416 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp); | |
417 } | |
418 #endif | |
3291 | 419 |
1 | 420 s->fd=fd; |
421 s->type=type; | |
180 | 422 s->buf_pos=s->buf_len=0; |
598 | 423 s->start_pos=s->end_pos=0; |
1642 | 424 s->priv=NULL; |
7407 | 425 s->url=NULL; |
2322 | 426 s->cache_pid=0; |
1 | 427 stream_reset(s); |
428 return s; | |
429 } | |
430 | |
431 void free_stream(stream_t *s){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5982
diff
changeset
|
432 // printf("\n*** free_stream() called ***\n"); |
9798 | 433 #ifdef USE_STREAM_CACHE |
4893 | 434 if(s->cache_pid) { |
9915 | 435 cache_uninit(s); |
4893 | 436 } |
9798 | 437 #endif |
15520 | 438 if(s->close) s->close(s); |
15421
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
439 if(s->fd>0){ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
440 /* on unix we define closesocket to close |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
441 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
|
442 network socket and file */ |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
443 if(s->url && strstr(s->url,"://")) |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
444 closesocket(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
445 else close(s->fd); |
ae5e1b9e3c92
fix segfaults caused by socket and file descriptor mismatches on windows
faust3
parents:
14836
diff
changeset
|
446 } |
10281 | 447 #ifdef HAVE_WINSOCK2 |
448 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n"); | |
449 WSACleanup(); // there might be a better place for this (-> later) | |
450 #endif | |
9794 | 451 // Disabled atm, i don't like that. s->priv can be anything after all |
452 // streams should destroy their priv on close | |
453 //if(s->priv) free(s->priv); | |
454 if(s->url) free(s->url); | |
1 | 455 free(s); |
456 } | |
457 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
458 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
|
459 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
|
460 s->priv = ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
461 return s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
462 } |