Mercurial > mplayer.hg
annotate libmpdemux/stream.c @ 11330:a974c00c779d
Removed temporary .cpp file used during the Matroska test. Updated the libebml and libmatroska requirements to at least v0.6.0 for both. There have been changes in the lacing code, and users WILL come and complain why mplayer, linked against older versions, will have issues playing newer files.
author | mosu |
---|---|
date | Thu, 30 Oct 2003 14:57:06 +0000 |
parents | 8a10d5d0ce86 |
children | 3d75bcc28231 |
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" |
9380 | 26 #include "../osdep/shmem.h" |
578 | 27 |
28 #include "stream.h" | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
29 #include "demuxer.h" |
578 | 30 |
9794 | 31 #include "../m_option.h" |
32 #include "../m_struct.h" | |
33 | |
34 | |
578 | 35 extern int verbose; // defined in mplayer.c |
10242 | 36 void cache_uninit(stream_t *s); // defined in cache2.c |
1 | 37 |
8812 | 38 #include "cue_read.h" |
39 | |
40 //#include "vcd_read_bincue.h" | |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
41 |
1595 | 42 #ifdef USE_DVDREAD |
8344 | 43 int dvd_read_sector(dvd_priv_t *d,unsigned char* data); |
44 void dvd_seek(dvd_priv_t *d,int pos); | |
6814 | 45 void dvd_close(dvd_priv_t *d); |
1595 | 46 #endif |
47 | |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
48 #ifdef LIBSMBCLIENT |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
49 #include "libsmbclient.h" |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
50 #endif |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
51 |
9886 | 52 #ifdef HAVE_VCD |
53 extern stream_info_t stream_info_vcd; | |
54 #endif | |
9810 | 55 #ifdef HAVE_CDDA |
9801 | 56 extern stream_info_t stream_info_cdda; |
9810 | 57 #endif |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
58 #ifdef MPLAYER_NETWORK |
9853 | 59 extern stream_info_t stream_info_netstream; |
60 #endif | |
10560 | 61 #ifdef HAS_DVBIN_SUPPORT |
62 extern stream_info_t stream_info_dvb; | |
63 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
64 #ifdef HAVE_FTP |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
65 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
|
66 #endif |
10560 | 67 |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
68 extern stream_info_t stream_info_null; |
9794 | 69 extern stream_info_t stream_info_file; |
70 | |
71 stream_info_t* auto_open_streams[] = { | |
9886 | 72 #ifdef HAVE_VCD |
73 &stream_info_vcd, | |
74 #endif | |
9810 | 75 #ifdef HAVE_CDDA |
9801 | 76 &stream_info_cdda, |
9810 | 77 #endif |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
78 #ifdef MPLAYER_NETWORK |
9853 | 79 &stream_info_netstream, |
80 #endif | |
10560 | 81 #ifdef HAS_DVBIN_SUPPORT |
82 &stream_info_dvb, | |
83 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
84 #ifdef HAVE_FTP |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
85 &stream_info_ftp, |
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10560
diff
changeset
|
86 #endif |
9901
233802490b0e
Add a null streamv Currently used for tv and mf. Could be used to
albeu
parents:
9886
diff
changeset
|
87 &stream_info_null, |
9794 | 88 &stream_info_file, |
89 NULL | |
90 }; | |
91 | |
92 stream_t* open_stream_plugin(stream_info_t* sinfo,char* filename,int mode, | |
93 char** options, int* file_format, int* ret) { | |
94 void* arg = NULL; | |
95 stream_t* s; | |
96 m_struct_t* desc = (m_struct_t*)sinfo->opts; | |
97 | |
98 // Parse options | |
99 if(desc) { | |
100 arg = m_struct_alloc(desc); | |
101 if(sinfo->opts_url) { | |
102 m_option_t url_opt = | |
103 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts }; | |
104 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) { | |
105 mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename); | |
106 m_struct_free(desc,arg); | |
107 return NULL; | |
108 } | |
109 } | |
110 if(options) { | |
111 int i; | |
112 for(i = 0 ; options[i] != NULL ; i += 2) { | |
113 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n", | |
114 options[i],options[i+1]); | |
115 if(!m_struct_set(desc,arg,options[i],options[i+1])) | |
116 mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n", | |
117 options[i],options[i+1]); | |
118 } | |
119 } | |
120 } | |
121 s = new_stream(-2,-2); | |
122 s->url=strdup(filename); | |
123 s->flags |= mode; | |
124 *ret = sinfo->open(s,mode,arg,file_format); | |
125 if((*ret) != STREAM_OK) { | |
126 free(s->url); | |
127 free(s); | |
128 return NULL; | |
129 } | |
130 if(s->type <= -2) | |
131 mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n"); | |
132 if(s->flags & STREAM_SEEK && !s->seek) | |
133 s->flags &= ~STREAM_SEEK; | |
134 if(s->seek && !(s->flags & STREAM_SEEK)) | |
9853 | 135 s->flags |= STREAM_SEEK; |
9794 | 136 |
137 | |
138 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename); | |
139 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info); | |
140 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author); | |
141 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment); | |
142 | |
143 return s; | |
144 } | |
145 | |
146 | |
147 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format) { | |
148 int i,j,l,r; | |
149 stream_info_t* sinfo; | |
150 stream_t* s; | |
151 | |
152 for(i = 0 ; auto_open_streams[i] ; i++) { | |
153 sinfo = auto_open_streams[i]; | |
154 if(!sinfo->protocols) { | |
10735
8a10d5d0ce86
serious bugs - 1l absinth (changed to absinth against cola inflation)
alex
parents:
10625
diff
changeset
|
155 mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name); |
9794 | 156 continue; |
157 } | |
158 for(j = 0 ; sinfo->protocols[j] ; j++) { | |
159 l = strlen(sinfo->protocols[j]); | |
160 // l == 0 => Don't do protocol matching (ie network and filenames) | |
161 if((l == 0) || ((strncmp(sinfo->protocols[j],filename,l) == 0) && | |
162 (strncmp("://",filename+l,3) == 0))) { | |
163 *file_format = DEMUXER_TYPE_UNKNOWN; | |
164 s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r); | |
165 if(s) return s; | |
166 if(r != STREAM_UNSUPORTED) { | |
167 mp_msg(MSGT_OPEN,MSGL_ERR, "Failed to open %s\n",filename); | |
168 return NULL; | |
169 } | |
170 break; | |
171 } | |
172 } | |
173 } | |
174 | |
175 mp_msg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n",filename); | |
176 return NULL; | |
177 } | |
178 | |
1 | 179 //=================== STREAMER ========================= |
180 | |
181 int stream_fill_buffer(stream_t *s){ | |
182 int len; | |
9874
55a43ae66ceb
Oops, I just noticed albeu's revision 1.58 - so I backed out the
rsf
parents:
9873
diff
changeset
|
183 if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } |
1 | 184 switch(s->type){ |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
185 #ifdef LIBSMBCLIENT |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
186 case STREAMTYPE_SMB: |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
187 len=smbc_read(s->fd,s->buffer,STREAM_BUFFER_SIZE); |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
188 break; |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
189 #endif |
692 | 190 case STREAMTYPE_STREAM: |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
191 #ifdef MPLAYER_NETWORK |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
192 if( s->streaming_ctrl!=NULL ) { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
193 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
|
194 } else { |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
195 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
|
196 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
197 #else |
1 | 198 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
|
199 #endif |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
200 case STREAMTYPE_VCDBINCUE: |
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
201 len=cue_vcd_read(s->buffer);break; |
5380
8a01cde9cf39
DVDnav support patch by David Holm and Kees Cook <mplayer@outflux.net>
arpi
parents:
5133
diff
changeset
|
202 #ifdef USE_DVDNAV |
8a01cde9cf39
DVDnav support patch by David Holm and Kees Cook <mplayer@outflux.net>
arpi
parents:
5133
diff
changeset
|
203 case STREAMTYPE_DVDNAV: { |
5472 | 204 dvdnav_stream_read((dvdnav_priv_t*)s->priv,s->buffer,&len); |
205 if (len==0) return 0; // this was an event, so repeat the read | |
5380
8a01cde9cf39
DVDnav support patch by David Holm and Kees Cook <mplayer@outflux.net>
arpi
parents:
5133
diff
changeset
|
206 break; |
8a01cde9cf39
DVDnav support patch by David Holm and Kees Cook <mplayer@outflux.net>
arpi
parents:
5133
diff
changeset
|
207 } |
8a01cde9cf39
DVDnav support patch by David Holm and Kees Cook <mplayer@outflux.net>
arpi
parents:
5133
diff
changeset
|
208 #endif |
1595 | 209 #ifdef USE_DVDREAD |
210 case STREAMTYPE_DVD: { | |
211 off_t pos=dvd_read_sector(s->priv,s->buffer); | |
212 if(pos>=0){ | |
213 len=2048; // full sector | |
214 s->pos=2048*pos-len; | |
215 } else len=-1; // error | |
216 break; | |
217 } | |
218 #endif | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
219 case STREAMTYPE_DS: |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
220 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
|
221 break; |
9610 | 222 |
223 | |
9794 | 224 default: |
225 len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0; | |
1 | 226 } |
227 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; } | |
228 s->buf_pos=0; | |
229 s->buf_len=len; | |
230 s->pos+=len; | |
231 // printf("[%d]",len);fflush(stdout); | |
232 return len; | |
233 } | |
234 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
235 int stream_seek_long(stream_t *s,off_t pos){ |
6814 | 236 off_t newpos=0; |
1 | 237 |
2144 | 238 // if(verbose>=3) printf("seek_long to 0x%X\n",(unsigned int)pos); |
1 | 239 |
240 s->buf_pos=s->buf_len=0; | |
241 | |
242 switch(s->type){ | |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
243 case STREAMTYPE_SMB: |
692 | 244 case STREAMTYPE_STREAM: |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
245 #ifdef _LARGEFILE_SOURCE |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
246 newpos=pos&(~((long long)STREAM_BUFFER_SIZE-1));break; |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
247 #else |
492 | 248 newpos=pos&(~(STREAM_BUFFER_SIZE-1));break; |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
249 #endif |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
250 case STREAMTYPE_VCDBINCUE: |
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
251 newpos=(pos/VCD_SECTOR_DATA)*VCD_SECTOR_DATA;break; |
1595 | 252 case STREAMTYPE_DVD: |
253 newpos=pos/2048; newpos*=2048; break; | |
9794 | 254 default: |
255 // Round on sector size | |
256 if(s->sector_size) | |
257 newpos=(pos/s->sector_size)*s->sector_size; | |
258 else { // Otherwise on the buffer size | |
259 #ifdef _LARGEFILE_SOURCE | |
260 newpos=pos&(~((long long)STREAM_BUFFER_SIZE-1));break; | |
261 #else | |
262 newpos=pos&(~(STREAM_BUFFER_SIZE-1));break; | |
263 #endif | |
264 } | |
265 break; | |
1 | 266 } |
267 | |
2050 | 268 if(verbose>=3){ |
269 #ifdef _LARGEFILE_SOURCE | |
270 printf("s->pos=%llX newpos=%llX new_bufpos=%llX buflen=%X \n", | |
271 (long long)s->pos,(long long)newpos,(long long)pos,s->buf_len); | |
272 #else | |
273 printf("s->pos=%X newpos=%X new_bufpos=%X buflen=%X \n", | |
274 (unsigned int)s->pos,newpos,pos,s->buf_len); | |
275 #endif | |
276 } | |
277 | |
1 | 278 pos-=newpos; |
279 | |
280 if(newpos==0 || newpos!=s->pos){ | |
281 switch(s->type){ | |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
282 #ifdef LIBSMBCLIENT |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
283 case STREAMTYPE_SMB: |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
284 s->pos=newpos; // real seek |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
285 if(smbc_lseek(s->fd,s->pos,SEEK_SET)<0) s->eof=1; |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
286 break; |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
287 #endif |
8782
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
288 case STREAMTYPE_VCDBINCUE: |
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
289 s->pos=newpos; // real seek |
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
290 cue_set_msf(s->pos/VCD_SECTOR_DATA); |
6af7a6595cc9
cdrwin-style bin/cue VCD image support (-vcd <track> -cuefile file.cue)
arpi
parents:
8524
diff
changeset
|
291 break; |
5472 | 292 #ifdef USE_DVDNAV |
293 case STREAMTYPE_DVDNAV: { | |
294 if (newpos==0) { | |
295 if (dvdnav_stream_reset((dvdnav_priv_t*)s->priv)) | |
296 s->pos=0; | |
297 } | |
298 if(newpos!=s->pos){ | |
299 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek in DVDNAV streams yet!\n"); | |
300 return 1; | |
301 } | |
302 break; | |
303 } | |
304 #endif | |
1595 | 305 #ifdef USE_DVDREAD |
306 case STREAMTYPE_DVD: | |
307 s->pos=newpos; // real seek | |
308 dvd_seek(s->priv,s->pos/2048); | |
309 break; | |
310 #endif | |
692 | 311 case STREAMTYPE_STREAM: |
312 //s->pos=newpos; // real seek | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
313 // 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
|
314 // 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
|
315 // doesn't support seeking. |
10121
d42177a0da2a
Changed the STREAMING defines to MPLAYER_NETWORK to avoid name definition clash.
bertrand
parents:
9915
diff
changeset
|
316 #ifdef MPLAYER_NETWORK |
8929
c5ca1ae42555
check if seeking supported, otherwise fallback to null reading
arpi
parents:
8812
diff
changeset
|
317 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
|
318 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
|
319 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
|
320 return 1; |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
321 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
322 } |
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
323 #else |
692 | 324 if(newpos<s->pos){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
325 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); |
692 | 326 return 1; |
327 } | |
328 while(s->pos<newpos){ | |
329 if(stream_fill_buffer(s)<=0) break; // EOF | |
330 } | |
3044
606bb6943ae9
Added a network read function call and a seek network function call.
bertrand
parents:
2790
diff
changeset
|
331 #endif |
692 | 332 break; |
7408 | 333 default: |
9794 | 334 // This should at the beginning as soon as all streams are converted |
335 if(!s->seek) | |
336 return 0; | |
337 // Now seek | |
338 if(!s->seek(s,newpos)) { | |
339 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n"); | |
340 return 0; | |
341 } | |
1 | 342 } |
343 // putchar('.');fflush(stdout); | |
344 //} else { | |
345 // putchar('%');fflush(stdout); | |
346 } | |
347 | |
348 stream_fill_buffer(s); | |
1999 | 349 if(pos>=0 && pos<=s->buf_len){ |
1 | 350 s->buf_pos=pos; // byte position in sector |
351 return 1; | |
352 } | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
353 |
1999 | 354 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n"); |
355 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
356 #ifdef _LARGEFILE_SOURCE |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1642
diff
changeset
|
357 mp_msg(MSGT_STREAM,MSGL_V,"stream_seek: WARNING! Can't seek to 0x%llX !\n",(long long)(pos+newpos)); |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
358 #else |
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_V,"stream_seek: WARNING! Can't seek to 0x%X !\n",(pos+newpos)); |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1177
diff
changeset
|
360 #endif |
1 | 361 return 0; |
362 } | |
363 | |
364 | |
365 void stream_reset(stream_t *s){ | |
366 if(s->eof){ | |
367 s->pos=0; //ftell(f); | |
368 // s->buf_pos=s->buf_len=0; | |
369 s->eof=0; | |
370 } | |
9853 | 371 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL); |
1 | 372 //stream_seek(s,0); |
373 } | |
374 | |
2144 | 375 stream_t* new_memory_stream(unsigned char* data,int len){ |
376 stream_t *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
|
377 memset(s,0,sizeof(stream_t)); |
2144 | 378 s->fd=-1; |
379 s->type=STREAMTYPE_MEMORY; | |
380 s->buf_pos=0; s->buf_len=len; | |
381 s->start_pos=0; s->end_pos=len; | |
382 stream_reset(s); | |
383 s->pos=len; | |
384 memcpy(s->buffer,data,len); | |
385 return s; | |
386 } | |
387 | |
1 | 388 stream_t* new_stream(int fd,int type){ |
389 stream_t *s=malloc(sizeof(stream_t)); | |
3291 | 390 if(s==NULL) return NULL; |
391 memset(s,0,sizeof(stream_t)); | |
10281 | 392 |
393 #ifdef HAVE_WINSOCK2 | |
394 { | |
395 WSADATA wsdata; | |
396 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later) | |
397 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp); | |
398 } | |
399 #endif | |
3291 | 400 |
1 | 401 s->fd=fd; |
402 s->type=type; | |
180 | 403 s->buf_pos=s->buf_len=0; |
598 | 404 s->start_pos=s->end_pos=0; |
1642 | 405 s->priv=NULL; |
7407 | 406 s->url=NULL; |
2322 | 407 s->cache_pid=0; |
1 | 408 stream_reset(s); |
409 return s; | |
410 } | |
411 | |
412 void free_stream(stream_t *s){ | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5982
diff
changeset
|
413 // printf("\n*** free_stream() called ***\n"); |
9798 | 414 #ifdef USE_STREAM_CACHE |
4893 | 415 if(s->cache_pid) { |
9915 | 416 cache_uninit(s); |
4893 | 417 } |
9798 | 418 #endif |
6479 | 419 switch(s->type) { |
7630
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
420 #ifdef LIBSMBCLIENT |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
421 case STREAMTYPE_SMB: |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
422 smbc_close(s->fd); |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
423 break; |
4c51ce16c4a2
smb:// (samba client) support by Vladimir Moushkov <vlindos_mpdev@abv.bg>
arpi
parents:
7408
diff
changeset
|
424 #endif |
9610 | 425 |
6479 | 426 #ifdef USE_DVDREAD |
427 case STREAMTYPE_DVD: | |
428 dvd_close(s->priv); | |
429 #endif | |
9794 | 430 default: |
431 if(s->close) s->close(s); | |
432 } | |
10281 | 433 if(s->fd>0) closesocket(s->fd); |
434 #ifdef HAVE_WINSOCK2 | |
435 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n"); | |
436 WSACleanup(); // there might be a better place for this (-> later) | |
437 #endif | |
9794 | 438 // Disabled atm, i don't like that. s->priv can be anything after all |
439 // streams should destroy their priv on close | |
440 //if(s->priv) free(s->priv); | |
441 if(s->url) free(s->url); | |
1 | 442 free(s); |
443 } | |
444 | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
445 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
|
446 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
|
447 s->priv = ds; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
448 return s; |
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
4893
diff
changeset
|
449 } |