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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1177
diff changeset
1
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
2 #include <stdio.h>
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
3 #include <stdlib.h>
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
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
02449faf87dd MINGW32 port
faust3
parents: 9794
diff changeset
8 #ifndef __MINGW32__
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1177
diff changeset
9 #include <sys/ioctl.h>
6814
6863033786d1 warning fixes
atmos4
parents: 6810
diff changeset
10 #include <sys/wait.h>
9798
02449faf87dd MINGW32 port
faust3
parents: 9794
diff changeset
11 #endif
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1177
diff changeset
12 #include <fcntl.h>
2322
e22ec6fce385 cache2 support
arpi
parents: 2310
diff changeset
13 #include <signal.h>
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
14 #include <strings.h>
578
c2377cd0069f something moved to brand new stream.h
arpi_esp
parents: 537
diff changeset
15
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
16 #include "config.h"
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
17
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
18 #ifndef HAVE_WINSOCK2
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
19 #define closesocket close
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
20 #else
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
21 #include <winsock2.h>
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
22 #endif
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
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
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
26 #include "osdep/shmem.h"
578
c2377cd0069f something moved to brand new stream.h
arpi_esp
parents: 537
diff changeset
27
c2377cd0069f something moved to brand new stream.h
arpi_esp
parents: 537
diff changeset
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
c2377cd0069f something moved to brand new stream.h
arpi_esp
parents: 537
diff changeset
30
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
31 #include "m_option.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
32 #include "m_struct.h"
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
33
19808
5385740067a1 * remove extern definitions of functions in .c files
attila
parents: 19568
diff changeset
34 #include "cache2.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35
8812
f6456b177fdc vcd_read_cue.h -> cue_read.c+h
arpi
parents: 8782
diff changeset
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
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
38 #ifdef HAVE_VCD
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
39 extern stream_info_t stream_info_vcd;
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
40 #endif
9810
pontscho
parents: 9801
diff changeset
41 #ifdef HAVE_CDDA
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9798
diff changeset
42 extern stream_info_t stream_info_cdda;
9810
pontscho
parents: 9801
diff changeset
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
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
45 extern stream_info_t stream_info_netstream;
15585
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
46 extern stream_info_t stream_info_pnm;
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
47 extern stream_info_t stream_info_asf;
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
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
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
51 extern stream_info_t stream_info_http1;
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
52 extern stream_info_t stream_info_http2;
9853
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
53 #endif
10560
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
54 #ifdef HAS_DVBIN_SUPPORT
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
55 extern stream_info_t stream_info_dvb;
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
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
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
63 #ifdef HAVE_PVR
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
64 extern stream_info_t stream_info_pvr;
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
72 #ifdef USE_DVDNAV
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
73 extern stream_info_t stream_info_dvdnav;
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
74 #endif
15520
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
75 #ifdef LIBSMBCLIENT
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
76 extern stream_info_t stream_info_smb;
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
77 #endif
16572
56a5f69e9b35 "LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents: 15585
diff changeset
78 #ifdef STREAMING_LIVE555
15585
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
79 extern stream_info_t stream_info_sdp;
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
80 extern stream_info_t stream_info_rtsp_sip;
16762
4fced87835f3 Kill a compiler warning, Patch by Zuxy Meng
gpoirier
parents: 16750
diff changeset
81 #endif
10560
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
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
097e5bc71210 added dedicated file for mf:// input
ben
parents: 19273
diff changeset
85 extern stream_info_t stream_info_mf;
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
91
25209
7d2a9ae30c67 Make auto_open_streams array itself const
reimar
parents: 25207
diff changeset
92 static const stream_info_t* const auto_open_streams[] = {
9886
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
93 #ifdef HAVE_VCD
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
94 &stream_info_vcd,
e578e4375434 Port vcd to the new API
albeu
parents: 9874
diff changeset
95 #endif
9810
pontscho
parents: 9801
diff changeset
96 #ifdef HAVE_CDDA
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9798
diff changeset
97 &stream_info_cdda,
9810
pontscho
parents: 9801
diff changeset
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
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
100 &stream_info_netstream,
15585
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
101 &stream_info_http1,
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
102 &stream_info_asf,
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
103 &stream_info_pnm,
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
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
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
106 &stream_info_sdp,
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
107 &stream_info_rtsp_sip,
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
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
281d155fb37f ported all network streams to the new API
nicodvb
parents: 15520
diff changeset
111 &stream_info_http2,
9853
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
112 #endif
10560
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
113 #ifdef HAS_DVBIN_SUPPORT
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
114 &stream_info_dvb,
11826d9f90c7 this patch fixes
arpi
parents: 10281
diff changeset
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
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
122 #ifdef HAVE_PVR
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
123 &stream_info_pvr,
73b8f5ff772d added new pvr:// input for ivtv based cards
ben
parents: 18712
diff changeset
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
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
131 #ifdef LIBSMBCLIENT
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
132 &stream_info_smb,
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
137 &stream_info_dvd,
17191
6ac0b5f0d1ed fix compilation when dvdkit and dvdread are not available
nicodvb
parents: 17012
diff changeset
138 #endif
15518
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
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
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
141 #endif
9391bf60ccdf ported dvd:// to the new stream api
nicodvb
parents: 15476
diff changeset
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
097e5bc71210 added dedicated file for mf:// input
ben
parents: 19273
diff changeset
144 &stream_info_mf,
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
145 &stream_info_file,
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
146 NULL
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
147 };
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
152 void* arg = NULL;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
153 stream_t* s;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
154 m_struct_t* desc = (m_struct_t*)sinfo->opts;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
155
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
156 // Parse options
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
157 if(desc) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
158 arg = m_struct_alloc(desc);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
159 if(sinfo->opts_url) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
160 m_option_t url_opt =
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
161 { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, sinfo->opts };
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
162 if(m_option_parse(&url_opt,"stream url",filename,arg,M_CONFIG_FILE) < 0) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
163 mp_msg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
164 m_struct_free(desc,arg);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
165 return NULL;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
166 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
167 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
168 if(options) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
169 int i;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
170 for(i = 0 ; options[i] != NULL ; i += 2) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
171 mp_msg(MSGT_OPEN,MSGL_DBG2, "Set stream arg %s=%s\n",
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
172 options[i],options[i+1]);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
173 if(!m_struct_set(desc,arg,options[i],options[i+1]))
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
174 mp_msg(MSGT_OPEN,MSGL_WARN, "Failed to set stream option %s=%s\n",
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
175 options[i],options[i+1]);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
176 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
177 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
178 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
179 s = new_stream(-2,-2);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
180 s->url=strdup(filename);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
181 s->flags |= mode;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
182 *ret = sinfo->open(s,mode,arg,file_format);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
194 free(s->url);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
195 free(s);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
196 return NULL;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
197 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
198 if(s->type <= -2)
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
199 mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n");
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
200 if(s->flags & STREAM_SEEK && !s->seek)
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
201 s->flags &= ~STREAM_SEEK;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
202 if(s->seek && !(s->flags & STREAM_SEEK))
9853
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
203 s->flags |= STREAM_SEEK;
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
204
21659
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
205 s->mode = mode;
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
206
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
207 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
208 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
209 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
210 mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
211
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
212 return s;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
213 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
214
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
215
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
216 stream_t* open_stream_full(char* filename,int mode, char** options, int* file_format) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
221
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
222 for(i = 0 ; auto_open_streams[i] ; i++) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
223 sinfo = auto_open_streams[i];
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
226 continue;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
227 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
228 for(j = 0 ; sinfo->protocols[j] ; j++) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
229 l = strlen(sinfo->protocols[j]);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
233 (strncmp("://",filename+l,3) == 0))) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
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
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
247 return NULL;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
248 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
249 break;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
250 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
251 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
252 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
253
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
254 mp_msg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n",filename);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
255 return NULL;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
256 }
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
257
21659
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
258 stream_t* open_output_stream(char* filename,char** options) {
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
259 int file_format; //unused
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
260 if(!filename) {
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
261 mp_msg(MSGT_OPEN,MSGL_ERR,"open_output_stream(), NULL filename, report this bug\n");
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
262 return NULL;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
263 }
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
264
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
265 return open_stream_full(filename,STREAM_WRITE,options,&file_format);
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
266 }
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
267
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 //=================== STREAMER =========================
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 int stream_fill_buffer(stream_t *s){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 switch(s->type){
692
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
76c6d8f1ebf5 this is a combo patch that:
arpi
parents: 9380
diff changeset
287
76c6d8f1ebf5 this is a combo patch that:
arpi
parents: 9380
diff changeset
288
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
289 default:
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
290 len= s->fill_buffer ? s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE) : 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; return 0; }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 s->buf_pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 s->buf_len=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 s->pos+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 // printf("[%d]",len);fflush(stdout);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 return len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299
21659
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
300 int stream_write_buffer(stream_t *s, unsigned char *buf, int len) {
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
301 int rd;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
302 if(!s->write_buffer)
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
303 return -1;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
304 rd = s->write_buffer(s, buf, len);
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
305 if(rd < 0)
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
306 return -1;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
307 s->pos += rd;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
308 return rd;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
309 }
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
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
6863033786d1 warning fixes
atmos4
parents: 6810
diff changeset
312 off_t newpos=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17878
diff changeset
314 // if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 s->buf_pos=s->buf_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317
21659
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
318 if(s->mode == STREAM_WRITE) {
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
319 if(!s->seek || !s->seek(s,pos))
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
320 return 0;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
321 return 1;
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
322 }
da09e69a0f01 support functions for writing to streams
nicodvb
parents: 21493
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17878
diff changeset
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
18f4dd5d568f -Wall warnings fixed
arpi
parents: 1999
diff changeset
332 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 pos-=newpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 if(newpos==0 || newpos!=s->pos){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 switch(s->type){
692
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
337 case STREAMTYPE_STREAM:
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
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
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
343 if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
344 if(!s->seek(s,newpos)) {
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
345 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n");
12018
2c2fb4457982 Seek in HTTP streams and stdin seek fixes
rtognimp
parents: 11965
diff changeset
346 return 0;
11965
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
347 }
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
348 break;
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
349 }
3d75bcc28231 enable seeking in http streams
attila
parents: 10735
diff changeset
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
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
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
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
360 return 1;
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
361 }
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
362 while(s->pos<newpos){
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
363 if(stream_fill_buffer(s)<=0) break; // EOF
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
364 }
3044
606bb6943ae9 Added a network read function call and a seek network function call.
bertrand
parents: 2790
diff changeset
365 #endif
692
14a2f35921a0 allow playing from stdin
arpi_esp
parents: 598
diff changeset
366 break;
7408
0c6948b8100f stream layer cleanup part 2
arpi
parents: 7407
diff changeset
367 default:
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
368 // This should at the beginning as soon as all streams are converted
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
369 if(!s->seek)
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
370 return 0;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
371 // Now seek
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
372 if(!s->seek(s,newpos)) {
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
373 mp_msg(MSGT_STREAM,MSGL_ERR, "Seek failed\n");
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
374 return 0;
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
375 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 // putchar('.');fflush(stdout);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378 //} else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 // putchar('%');fflush(stdout);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384 s->buf_pos=pos; // byte position in sector
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
0c45328c9f8b fixed seek to EOF pos
arpi
parents: 1973
diff changeset
390 // if(pos==s->buf_len) printf("XXX Seek to last byte of file -> EOF\n");
0c45328c9f8b fixed seek to EOF pos
arpi
parents: 1973
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 void stream_reset(stream_t *s){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398 if(s->eof){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 s->pos=0; //ftell(f);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 // s->buf_pos=s->buf_len=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
401 s->eof=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
402 }
9853
765cca786fec Add netstream
albeu
parents: 9826
diff changeset
403 if(s->control) s->control(s,STREAM_CTRL_RESET,NULL);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404 //stream_seek(s,0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406
17712
a320248c2450 stream_control() returns int, not void
nicodvb
parents: 17696
diff changeset
407 int stream_control(stream_t *s, int cmd, void *arg){
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 22362
diff changeset
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
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
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
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
419 s->fd=-1;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
420 s->type=STREAMTYPE_MEMORY;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
421 s->buf_pos=0; s->buf_len=len;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
422 s->start_pos=0; s->end_pos=len;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
423 stream_reset(s);
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
424 s->pos=len;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
425 memcpy(s->buffer,data,len);
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
426 return s;
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
427 }
99f079ff9374 new_memory_stream() added
arpi
parents: 2050
diff changeset
428
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429 stream_t* new_stream(int fd,int type){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 stream_t *s=malloc(sizeof(stream_t));
3291
2122a13b5a29 fixed startup crash
iive
parents: 3261
diff changeset
431 if(s==NULL) return NULL;
2122a13b5a29 fixed startup crash
iive
parents: 3261
diff changeset
432 memset(s,0,sizeof(stream_t));
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
433
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
434 #ifdef HAVE_WINSOCK2
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
435 {
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
436 WSADATA wsdata;
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
437 int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later)
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
438 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp);
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
439 }
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
440 #endif
3291
2122a13b5a29 fixed startup crash
iive
parents: 3261
diff changeset
441
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 s->fd=fd;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 s->type=type;
180
afa2c05cfe43 terrible fatal bug fixed
arpi_esp
parents: 1
diff changeset
444 s->buf_pos=s->buf_len=0;
598
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 578
diff changeset
445 s->start_pos=s->end_pos=0;
1642
78fa0713b823 free'ing priv struct
arpi
parents: 1595
diff changeset
446 s->priv=NULL;
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7406
diff changeset
447 s->url=NULL;
2322
e22ec6fce385 cache2 support
arpi
parents: 2310
diff changeset
448 s->cache_pid=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 stream_reset(s);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 return s;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
02449faf87dd MINGW32 port
faust3
parents: 9794
diff changeset
455 #ifdef USE_STREAM_CACHE
4893
904cc3813582 Added waitpid in free_stream to avoid zombies
albeu
parents: 4464
diff changeset
456 if(s->cache_pid) {
9915
eabe876ab5e2 Fix cache uninit
albeu
parents: 9901
diff changeset
457 cache_uninit(s);
4893
904cc3813582 Added waitpid in free_stream to avoid zombies
albeu
parents: 4464
diff changeset
458 }
9798
02449faf87dd MINGW32 port
faust3
parents: 9794
diff changeset
459 #endif
15520
2c5186ed83b9 ported smb:// to the new stream api
nicodvb
parents: 15518
diff changeset
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
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
469 #ifdef HAVE_WINSOCK2
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
470 mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n");
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
471 WSACleanup(); // there might be a better place for this (-> later)
54bcbf28698a Networking support under MinGW.
diego
parents: 10242
diff changeset
472 #endif
9794
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
473 // Disabled atm, i don't like that. s->priv can be anything after all
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
474 // streams should destroy their priv on close
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
475 //if(s->priv) free(s->priv);
f67d87b2d3c7 Stream modularization, the first step.
albeu
parents: 9787
diff changeset
476 if(s->url) free(s->url);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 free(s);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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 }