Mercurial > mplayer.hg
annotate libmpdemux/network.c @ 13283:858b7e04718c
This patch moves the directory creation code to a separate function. I have
tried to re-use as much code as possible, to reduce the size of the patch.
All duplicate code is removed, resulting in my first patch that actually
decreases the size of the binary by about 700 bytes :-)
author | ivo |
---|---|
date | Wed, 08 Sep 2004 01:11:16 +0000 |
parents | 1591792d4054 |
children | 009337ffcfc4 |
rev | line source |
---|---|
903 | 1 /* |
2 * Network layer for MPlayer | |
3 * by Bertrand BAUDET <bertrand_baudet@yahoo.com> | |
4 * (C) 2001, MPlayer team. | |
5 */ | |
6 | |
1028 | 7 //#define DUMP2FILE |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
8 |
1430 | 9 #include <stdio.h> |
10 #include <stdlib.h> | |
11 #include <string.h> | |
833 | 12 #include <unistd.h> |
1430 | 13 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
14 #include <errno.h> |
903 | 15 #include <ctype.h> |
833 | 16 |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2489
diff
changeset
|
17 #include "config.h" |
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2489
diff
changeset
|
18 |
10281 | 19 #ifndef HAVE_WINSOCK2 |
20 #define closesocket close | |
21 #else | |
22 #include <winsock2.h> | |
23 #include <ws2tcpip.h> | |
24 #endif | |
25 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
26 #include "stream.h" |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
27 #include "demuxer.h" |
9749 | 28 #include "../m_config.h" |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
29 |
841 | 30 #include "network.h" |
903 | 31 #include "http.h" |
11583
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
32 #include "cookies.h" |
903 | 33 #include "url.h" |
34 #include "asf.h" | |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
35 #include "rtp.h" |
8570 | 36 #include "pnm.h" |
9922 | 37 #include "realrtsp/rtsp_session.h" |
841 | 38 |
6466 | 39 #include "../version.h" |
40 | |
4121 | 41 extern int verbose; |
7867 | 42 extern int stream_cache_size; |
4121 | 43 |
7862
013c255225d8
mpdemux.c|h moved to libinput, mpdemux_check_interrupt() -> mp_input_check_interrupt()
arpi
parents:
7513
diff
changeset
|
44 extern int mp_input_check_interrupt(int time); |
013c255225d8
mpdemux.c|h moved to libinput, mpdemux_check_interrupt() -> mp_input_check_interrupt()
arpi
parents:
7513
diff
changeset
|
45 |
9749 | 46 int asf_streaming_start( stream_t *stream, int *demuxer_type ); |
7953 | 47 int rtsp_streaming_start( stream_t *stream ); |
48 | |
11583
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
49 /* Variables for the command line option -user, -passwd, -bandwidth, |
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
50 -user-agent and -nocookies */ |
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
51 |
7867 | 52 char *network_username=NULL; |
53 char *network_password=NULL; | |
54 int network_bandwidth=0; | |
11583
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
55 int network_cookies_enabled = 0; |
11228 | 56 char *network_useragent=NULL; |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
57 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
58 /* IPv6 options */ |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
59 int network_prefer_ipv4 = 0; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
60 int network_ipv4_only_proxy = 0; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
61 |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
62 |
3042 | 63 static struct { |
64 char *mime_type; | |
65 int demuxer_type; | |
66 } mime_type_table[] = { | |
67 // MP3 streaming, some MP3 streaming server answer with audio/mpeg | |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
68 { "audio/mpeg", DEMUXER_TYPE_AUDIO }, |
3042 | 69 // MPEG streaming |
70 { "video/mpeg", DEMUXER_TYPE_MPEG_PS }, | |
6032 | 71 { "video/x-mpeg", DEMUXER_TYPE_MPEG_PS }, |
72 { "video/x-mpeg2", DEMUXER_TYPE_MPEG_PS }, | |
3042 | 73 // AVI ??? => video/x-msvideo |
74 { "video/x-msvideo", DEMUXER_TYPE_AVI }, | |
75 // MOV => video/quicktime | |
76 { "video/quicktime", DEMUXER_TYPE_MOV }, | |
77 // ASF | |
78 { "audio/x-ms-wax", DEMUXER_TYPE_ASF }, | |
79 { "audio/x-ms-wma", DEMUXER_TYPE_ASF }, | |
80 { "video/x-ms-asf", DEMUXER_TYPE_ASF }, | |
81 { "video/x-ms-afs", DEMUXER_TYPE_ASF }, | |
82 { "video/x-ms-wvx", DEMUXER_TYPE_ASF }, | |
83 { "video/x-ms-wmv", DEMUXER_TYPE_ASF }, | |
84 { "video/x-ms-wma", DEMUXER_TYPE_ASF }, | |
4783 | 85 // Playlists |
7393 | 86 { "video/x-ms-wmx", DEMUXER_TYPE_PLAYLIST }, |
4783 | 87 { "audio/x-scpls", DEMUXER_TYPE_PLAYLIST }, |
88 { "audio/x-mpegurl", DEMUXER_TYPE_PLAYLIST }, | |
6032 | 89 { "audio/x-pls", DEMUXER_TYPE_PLAYLIST }, |
90 // Real Media | |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
91 { "audio/x-pn-realaudio", DEMUXER_TYPE_REAL }, |
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
92 // OGG Streaming |
12175 | 93 { "application/x-ogg", DEMUXER_TYPE_OGG }, |
94 // NullSoft Streaming Video | |
12477
1550ef7117c4
Add detection of nsa streamed by aol ultravox server
rtognimp
parents:
12390
diff
changeset
|
95 { "video/nsv", DEMUXER_TYPE_NSV}, |
1550ef7117c4
Add detection of nsa streamed by aol ultravox server
rtognimp
parents:
12390
diff
changeset
|
96 { "misc/ultravox", DEMUXER_TYPE_NSV} |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
97 |
3042 | 98 }; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
99 |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
100 /* |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
101 * An autodetection based on the extension is not a good idea. |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
102 * |
3042 | 103 static struct { |
104 char *extension; | |
105 int demuxer_type; | |
106 } extensions_table[] = { | |
107 { "mpeg", DEMUXER_TYPE_MPEG_PS }, | |
108 { "mpg", DEMUXER_TYPE_MPEG_PS }, | |
3072 | 109 { "mpe", DEMUXER_TYPE_MPEG_ES }, |
3042 | 110 { "avi", DEMUXER_TYPE_AVI }, |
111 { "mov", DEMUXER_TYPE_MOV }, | |
3072 | 112 { "qt", DEMUXER_TYPE_MOV }, |
3042 | 113 { "asx", DEMUXER_TYPE_ASF }, |
114 { "asf", DEMUXER_TYPE_ASF }, | |
115 { "wmv", DEMUXER_TYPE_ASF }, | |
116 { "wma", DEMUXER_TYPE_ASF }, | |
3072 | 117 { "viv", DEMUXER_TYPE_VIVO }, |
4236 | 118 { "rm", DEMUXER_TYPE_REAL }, |
6032 | 119 { "ra", DEMUXER_TYPE_REAL }, |
4236 | 120 { "y4m", DEMUXER_TYPE_Y4M }, |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
121 { "mp3", DEMUXER_TYPE_AUDIO }, |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
122 { "ogg", DEMUXER_TYPE_OGG }, |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
123 { "wav", DEMUXER_TYPE_AUDIO }, |
4783 | 124 { "pls", DEMUXER_TYPE_PLAYLIST }, |
125 { "m3u", DEMUXER_TYPE_PLAYLIST } | |
3042 | 126 }; |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
127 */ |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
128 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
129 streaming_ctrl_t * |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
130 streaming_ctrl_new( ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
131 streaming_ctrl_t *streaming_ctrl; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
132 streaming_ctrl = (streaming_ctrl_t*)malloc(sizeof(streaming_ctrl_t)); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
133 if( streaming_ctrl==NULL ) { |
5915 | 134 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Failed to allocate memory\n"); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
135 return NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
136 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
137 memset( streaming_ctrl, 0, sizeof(streaming_ctrl_t) ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
138 return streaming_ctrl; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
139 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
140 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
141 void |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
142 streaming_ctrl_free( streaming_ctrl_t *streaming_ctrl ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
143 if( streaming_ctrl==NULL ) return; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
144 if( streaming_ctrl->url ) url_free( streaming_ctrl->url ); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
145 if( streaming_ctrl->buffer ) free( streaming_ctrl->buffer ); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
146 if( streaming_ctrl->data ) free( streaming_ctrl->data ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
147 free( streaming_ctrl ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
148 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
149 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
150 int |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
151 read_rtp_from_server(int fd, char *buffer, int length) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
152 struct rtpheader rh; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
153 char *data; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
154 int len; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
155 static int got_first = 0; |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
156 static unsigned short sequence; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
157 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
158 if( buffer==NULL || length<0 ) return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
159 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
160 getrtp2(fd, &rh, &data, &len); |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
161 if( got_first && rh.b.sequence != (unsigned short)(sequence+1) ) |
5915 | 162 mp_msg(MSGT_NETWORK,MSGL_ERR,"RTP packet sequence error! Expected: %d, received: %d\n", |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
163 sequence+1, rh.b.sequence); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
164 got_first = 1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
165 sequence = rh.b.sequence; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
166 memcpy(buffer, data, len); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
167 return(len); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
168 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
169 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
170 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
171 // Converts an address family constant to a string |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
172 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
173 char *af2String(int af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
174 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
175 case AF_INET: return "AF_INET"; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
176 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
177 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
178 case AF_INET6: return "AF_INET6"; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
179 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
180 default: return "Unknown address family!"; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
181 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
182 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
183 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
184 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
185 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
186 // Connect to a server using a TCP connection, with specified address family |
7251
cc83ad6af513
Return -2 for fatal error while connecting to a server.
bertrand
parents:
7007
diff
changeset
|
187 // return -2 for fatal error, like unable to resolve name, connection timeout... |
cc83ad6af513
Return -2 for fatal error while connecting to a server.
bertrand
parents:
7007
diff
changeset
|
188 // return -1 is unable to connect to a particular port |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
189 |
833 | 190 int |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
191 connect2Server_with_af(char *host, int port, int af,int verb) { |
833 | 192 int socket_server_fd; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
193 int err, err_len; |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
194 int ret,count = 0; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
195 fd_set set; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
196 struct timeval tv; |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
197 union { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
198 struct sockaddr_in four; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
199 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
200 struct sockaddr_in6 six; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
201 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
202 } server_address; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
203 size_t server_address_size; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
204 void *our_s_addr; // Pointer to sin_addr or sin6_addr |
7953 | 205 struct hostent *hp=NULL; |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
206 char buf[255]; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
207 |
10281 | 208 #ifdef HAVE_WINSOCK2 |
209 u_long val; | |
210 #endif | |
211 | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
212 socket_server_fd = socket(af, SOCK_STREAM, 0); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
213 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
214 |
833 | 215 if( socket_server_fd==-1 ) { |
11227 | 216 // mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to create %s socket:\n", af2String(af)); |
7251
cc83ad6af513
Return -2 for fatal error while connecting to a server.
bertrand
parents:
7007
diff
changeset
|
217 return -2; |
833 | 218 } |
219 | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
220 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
221 case AF_INET: our_s_addr = (void *) &server_address.four.sin_addr; break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
222 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
223 case AF_INET6: our_s_addr = (void *) &server_address.six.sin6_addr; break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
224 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
225 default: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
226 mp_msg(MSGT_NETWORK,MSGL_ERR, "Unknown address family %d:\n", af); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
227 return -2; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
228 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
229 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
230 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
231 bzero(&server_address, sizeof(server_address)); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
232 |
10281 | 233 #ifndef HAVE_WINSOCK2 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
234 #ifdef USE_ATON |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
235 if (inet_aton(host, our_s_addr)!=1) |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
236 #else |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
237 if (inet_pton(af, host, our_s_addr)!=1) |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
238 #endif |
10281 | 239 #else |
240 if ( inet_addr(host)==INADDR_NONE ) | |
241 #endif | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
242 { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
243 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,"Resolving %s for %s...\n", host, af2String(af)); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
244 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
245 #ifdef HAVE_GETHOSTBYNAME2 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
246 hp=(struct hostent*)gethostbyname2( host, af ); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
247 #else |
3042 | 248 hp=(struct hostent*)gethostbyname( host ); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
249 #endif |
841 | 250 if( hp==NULL ) { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
251 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,"Couldn't resolve name for %s: %s\n", af2String(af), host); |
7251
cc83ad6af513
Return -2 for fatal error while connecting to a server.
bertrand
parents:
7007
diff
changeset
|
252 return -2; |
833 | 253 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
254 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
255 memcpy( our_s_addr, (void*)hp->h_addr, hp->h_length ); |
833 | 256 } |
10281 | 257 #ifdef HAVE_WINSOCK2 |
258 else { | |
259 unsigned long addr = inet_addr(host); | |
260 memcpy( our_s_addr, (void*)&addr, sizeof(addr) ); | |
261 } | |
262 #endif | |
3042 | 263 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
264 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
265 case AF_INET: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
266 server_address.four.sin_family=af; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
267 server_address.four.sin_port=htons(port); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
268 server_address_size = sizeof(server_address.four); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
269 break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
270 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
271 case AF_INET6: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
272 server_address.six.sin6_family=af; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
273 server_address.six.sin6_port=htons(port); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
274 server_address_size = sizeof(server_address.six); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
275 break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
276 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
277 default: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
278 mp_msg(MSGT_NETWORK,MSGL_ERR, "Unknown address family %d:\n", af); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
279 return -2; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
280 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
281 |
10281 | 282 #if defined(USE_ATON) || defined(HAVE_WINSOCK2) |
9900 | 283 strncpy( buf, inet_ntoa( *((struct in_addr*)our_s_addr) ), 255); |
284 #else | |
285 inet_ntop(af, our_s_addr, buf, 255); | |
286 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
287 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,"Connecting to server %s[%s]:%d ...\n", host, buf , port ); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
288 |
3042 | 289 // Turn the socket as non blocking so we can timeout on the connection |
10281 | 290 #ifndef HAVE_WINSOCK2 |
3042 | 291 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK ); |
10281 | 292 #else |
293 val = 1; | |
294 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
295 #endif | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
296 if( connect( socket_server_fd, (struct sockaddr*)&server_address, server_address_size )==-1 ) { |
10281 | 297 #ifndef HAVE_WINSOCK2 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
298 if( errno!=EINPROGRESS ) { |
10281 | 299 #else |
300 if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) { | |
301 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
302 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server with %s\n", af2String(af)); |
10281 | 303 closesocket(socket_server_fd); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
304 return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
305 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
306 } |
6477 | 307 tv.tv_sec = 0; |
308 tv.tv_usec = 500000; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
309 FD_ZERO( &set ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
310 FD_SET( socket_server_fd, &set ); |
3042 | 311 // When the connection will be made, we will have a writable fd |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
312 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) { |
6454 | 313 if( ret<0 ) mp_msg(MSGT_NETWORK,MSGL_ERR,"select failed\n"); |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
314 else if(ret > 0) break; |
7862
013c255225d8
mpdemux.c|h moved to libinput, mpdemux_check_interrupt() -> mp_input_check_interrupt()
arpi
parents:
7513
diff
changeset
|
315 else if(count > 30 || mp_input_check_interrupt(500)) { |
6477 | 316 if(count > 30) |
5915 | 317 mp_msg(MSGT_NETWORK,MSGL_ERR,"Connection timeout\n"); |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
318 else |
5915 | 319 mp_msg(MSGT_NETWORK,MSGL_V,"Connection interuppted by user\n"); |
8824 | 320 return -3; |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
321 } |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
322 count++; |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
323 FD_ZERO( &set ); |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
324 FD_SET( socket_server_fd, &set ); |
6477 | 325 tv.tv_sec = 0; |
326 tv.tv_usec = 500000; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
327 } |
3042 | 328 |
329 // Turn back the socket as blocking | |
10281 | 330 #ifndef HAVE_WINSOCK2 |
3042 | 331 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK ); |
10281 | 332 #else |
333 val = 0; | |
334 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
335 #endif | |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
336 // Check if there were any error |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
337 err_len = sizeof(int); |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
338 ret = getsockopt(socket_server_fd,SOL_SOCKET,SO_ERROR,&err,&err_len); |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
339 if(ret < 0) { |
5915 | 340 mp_msg(MSGT_NETWORK,MSGL_ERR,"getsockopt failed : %s\n",strerror(errno)); |
7251
cc83ad6af513
Return -2 for fatal error while connecting to a server.
bertrand
parents:
7007
diff
changeset
|
341 return -2; |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
342 } |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
343 if(err > 0) { |
5915 | 344 mp_msg(MSGT_NETWORK,MSGL_ERR,"Connect error : %s\n",strerror(err)); |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
345 return -1; |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
346 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
347 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
348 return socket_server_fd; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
349 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
350 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
351 // Connect to a server using a TCP connection |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
352 // return -2 for fatal error, like unable to resolve name, connection timeout... |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
353 // return -1 is unable to connect to a particular port |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
354 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
355 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
356 int |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
357 connect2Server(char *host, int port, int verb) { |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
358 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
359 int r; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
360 int s = -2; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
361 |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
362 r = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET:AF_INET6,verb); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
363 if (r > -1) return r; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
364 |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
365 s = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET6:AF_INET,verb); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
366 if (s == -2) return r; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
367 return s; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
368 #else |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
369 return connect2Server_with_af(host, port, AF_INET,verb); |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
370 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
371 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
372 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
373 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
374 |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
375 URL_t* |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
376 check4proxies( URL_t *url ) { |
4652 | 377 URL_t *url_out = NULL; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
378 if( url==NULL ) return NULL; |
4652 | 379 url_out = url_new( url->url ); |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
380 if( !strcasecmp(url->protocol, "http_proxy") ) { |
5915 | 381 mp_msg(MSGT_NETWORK,MSGL_V,"Using HTTP proxy: http://%s:%d\n", url->hostname, url->port ); |
4652 | 382 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
383 } |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
384 // Check if the http_proxy environment variable is set. |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
385 if( !strcasecmp(url->protocol, "http") ) { |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
386 char *proxy; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
387 proxy = getenv("http_proxy"); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
388 if( proxy!=NULL ) { |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
389 // We got a proxy, build the URL to use it |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
390 int len; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
391 char *new_url; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
392 URL_t *tmp_url; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
393 URL_t *proxy_url = url_new( proxy ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
394 |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
395 if( proxy_url==NULL ) { |
5915 | 396 mp_msg(MSGT_NETWORK,MSGL_WARN,"Invalid proxy setting...Trying without proxy.\n"); |
4652 | 397 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
398 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
399 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
400 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
401 if (network_ipv4_only_proxy && (gethostbyname(url->hostname)==NULL)) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
402 mp_msg(MSGT_NETWORK,MSGL_WARN, |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
403 "Could not find resolve remote hostname for AF_INET. Trying without proxy.\n"); |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
404 return url_out; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
405 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
406 #endif |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
407 |
5915 | 408 mp_msg(MSGT_NETWORK,MSGL_V,"Using HTTP proxy: %s\n", proxy_url->url ); |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
409 len = strlen( proxy_url->hostname ) + strlen( url->url ) + 20; // 20 = http_proxy:// + port |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
410 new_url = malloc( len+1 ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
411 if( new_url==NULL ) { |
5915 | 412 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); |
4652 | 413 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
414 } |
5915 | 415 sprintf(new_url, "http_proxy://%s:%d/%s", proxy_url->hostname, proxy_url->port, url->url ); |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
416 tmp_url = url_new( new_url ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
417 if( tmp_url==NULL ) { |
4652 | 418 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
419 } |
4652 | 420 url_free( url_out ); |
421 url_out = tmp_url; | |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
422 free( new_url ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
423 url_free( proxy_url ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
424 } |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
425 } |
4652 | 426 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
427 } |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
428 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
429 int |
11965 | 430 http_send_request( URL_t *url, off_t pos ) { |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
431 HTTP_header_t *http_hdr; |
4121 | 432 URL_t *server_url; |
11228 | 433 char str[256]; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
434 int fd; |
4121 | 435 int ret; |
436 int proxy = 0; // Boolean | |
437 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
438 http_hdr = http_new_header(); |
4121 | 439 |
4145 | 440 if( !strcasecmp(url->protocol, "http_proxy") ) { |
4121 | 441 proxy = 1; |
442 server_url = url_new( (url->file)+1 ); | |
443 http_set_uri( http_hdr, server_url->url ); | |
444 } else { | |
445 server_url = url; | |
446 http_set_uri( http_hdr, server_url->file ); | |
447 } | |
12638
2ebd553876c8
RFC compliance patch by Eric Lammerts <eric@lammerts.org>
alex
parents:
12610
diff
changeset
|
448 if (server_url->port && server_url->port != 80) |
2ebd553876c8
RFC compliance patch by Eric Lammerts <eric@lammerts.org>
alex
parents:
12610
diff
changeset
|
449 snprintf(str, 256, "Host: %s:%d", server_url->hostname, server_url->port ); |
2ebd553876c8
RFC compliance patch by Eric Lammerts <eric@lammerts.org>
alex
parents:
12610
diff
changeset
|
450 else |
2ebd553876c8
RFC compliance patch by Eric Lammerts <eric@lammerts.org>
alex
parents:
12610
diff
changeset
|
451 snprintf(str, 256, "Host: %s", server_url->hostname ); |
3585 | 452 http_set_field( http_hdr, str); |
11228 | 453 if (network_useragent) |
454 { | |
455 snprintf(str, 256, "User-Agent: %s", network_useragent); | |
456 http_set_field(http_hdr, str); | |
457 } | |
458 else | |
459 http_set_field( http_hdr, "User-Agent: MPlayer/"VERSION); | |
11965 | 460 |
461 if(pos>0) { | |
462 // Extend http_send_request with possibility to do partial content retrieval | |
463 snprintf(str, 256, "Range: bytes=%d-", pos); | |
464 http_set_field(http_hdr, str); | |
465 } | |
11583
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
466 |
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
467 if (network_cookies_enabled) cookies_set( http_hdr, server_url->hostname, server_url->url ); |
2af52902e7dc
Send HTTP Cookies (reading from mozilla/netscape files) support by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>. Disabled by default.
alex
parents:
11505
diff
changeset
|
468 |
12352 | 469 http_set_field( http_hdr, "Connection: close"); |
6515 | 470 http_add_basic_authentication( http_hdr, url->username, url->password ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
471 if( http_build_request( http_hdr )==NULL ) { |
841 | 472 return -1; |
833 | 473 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
474 |
4121 | 475 if( proxy ) { |
476 if( url->port==0 ) url->port = 8080; // Default port for the proxy server | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
477 fd = connect2Server( url->hostname, url->port,1 ); |
4121 | 478 url_free( server_url ); |
479 } else { | |
480 if( server_url->port==0 ) server_url->port = 80; // Default port for the web server | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
481 fd = connect2Server( server_url->hostname, server_url->port,1 ); |
4121 | 482 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
483 if( fd<0 ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
484 return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
485 } |
5915 | 486 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Request: [%s]\n", http_hdr->buffer ); |
4121 | 487 |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10199
diff
changeset
|
488 ret = send( fd, http_hdr->buffer, http_hdr->buffer_size, 0 ); |
7953 | 489 if( ret!=(int)http_hdr->buffer_size ) { |
5915 | 490 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error while sending HTTP request: didn't sent all the request\n"); |
4121 | 491 return -1; |
492 } | |
493 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
494 http_free( http_hdr ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
495 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
496 return fd; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
497 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
498 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
499 HTTP_header_t * |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
500 http_read_response( int fd ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
501 HTTP_header_t *http_hdr; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
502 char response[BUFFER_SIZE]; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
503 int i; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
504 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
505 http_hdr = http_new_header(); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
506 if( http_hdr==NULL ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
507 return NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
508 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
509 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
510 do { |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10199
diff
changeset
|
511 i = recv( fd, response, BUFFER_SIZE, 0 ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
512 if( i<0 ) { |
5915 | 513 mp_msg(MSGT_NETWORK,MSGL_ERR,"Read failed\n"); |
3365 | 514 http_free( http_hdr ); |
515 return NULL; | |
516 } | |
517 if( i==0 ) { | |
5915 | 518 mp_msg(MSGT_NETWORK,MSGL_ERR,"http_read_response read 0 -ie- EOF\n"); |
3365 | 519 http_free( http_hdr ); |
520 return NULL; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
521 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
522 http_response_append( http_hdr, response, i ); |
2489
0ecc1b4f7cf8
Added ASF http server streaming (Not mms streaming).
bertrand
parents:
2310
diff
changeset
|
523 } while( !http_is_header_entire( http_hdr ) ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
524 http_response_parse( http_hdr ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
525 return http_hdr; |
833 | 526 } |
527 | |
6555 | 528 int |
529 http_authenticate(HTTP_header_t *http_hdr, URL_t *url, int *auth_retry) { | |
530 char *aut; | |
7953 | 531 |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
532 if( *auth_retry==1 ) { |
6555 | 533 mp_msg(MSGT_NETWORK,MSGL_ERR,"Authentication failed\n"); |
6570
52ecfeddf864
Changed the -pass option to -passwd to avoid clash with mencoder option.
bertrand
parents:
6558
diff
changeset
|
534 mp_msg(MSGT_NETWORK,MSGL_ERR,"Please use the option -user and -passwd to provide your username/password for a list of URLs,\n"); |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
535 mp_msg(MSGT_NETWORK,MSGL_ERR,"or form an URL like: http://username:password@hostname/file\n"); |
6555 | 536 return -1; |
537 } | |
538 if( *auth_retry>0 ) { | |
539 if( url->username ) { | |
540 free( url->username ); | |
541 url->username = NULL; | |
542 } | |
543 if( url->password ) { | |
544 free( url->password ); | |
545 url->password = NULL; | |
546 } | |
547 } | |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
548 |
6555 | 549 aut = http_get_field(http_hdr, "WWW-Authenticate"); |
550 if( aut!=NULL ) { | |
551 char *aut_space; | |
552 aut_space = strstr(aut, "realm="); | |
553 if( aut_space!=NULL ) aut_space += 6; | |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
554 mp_msg(MSGT_NETWORK,MSGL_INFO,"Authentication required for %s\n", aut_space); |
6555 | 555 } else { |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
556 mp_msg(MSGT_NETWORK,MSGL_INFO,"Authentication required\n"); |
6555 | 557 } |
7867 | 558 if( network_username ) { |
559 url->username = strdup(network_username); | |
6555 | 560 if( url->username==NULL ) { |
561 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); | |
562 return -1; | |
563 } | |
564 } else { | |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
565 mp_msg(MSGT_NETWORK,MSGL_ERR,"Unable to read the username\n"); |
6570
52ecfeddf864
Changed the -pass option to -passwd to avoid clash with mencoder option.
bertrand
parents:
6558
diff
changeset
|
566 mp_msg(MSGT_NETWORK,MSGL_ERR,"Please use the option -user and -passwd to provide your username/password for a list of URLs,\n"); |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
567 mp_msg(MSGT_NETWORK,MSGL_ERR,"or form an URL like: http://username:password@hostname/file\n"); |
6555 | 568 return -1; |
569 } | |
7867 | 570 if( network_password ) { |
571 url->password = strdup(network_password); | |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
572 if( url->password==NULL ) { |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
573 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
574 return -1; |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
575 } |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
576 } else { |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
577 mp_msg(MSGT_NETWORK,MSGL_INFO,"No password provided, trying blank password\n"); |
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
578 } |
6555 | 579 (*auth_retry)++; |
580 return 0; | |
581 } | |
582 | |
11965 | 583 int |
584 http_seek( stream_t *stream, off_t pos ) { | |
585 HTTP_header_t *http_hdr = NULL; | |
586 int fd; | |
587 if( stream==NULL ) return 0; | |
588 | |
589 if( stream->fd>0 ) closesocket(stream->fd); // need to reconnect to seek in http-stream | |
590 fd = http_send_request( stream->streaming_ctrl->url, pos ); | |
591 if( fd<0 ) return 0; | |
592 | |
593 http_hdr = http_read_response( fd ); | |
594 | |
595 if( http_hdr==NULL ) return 0; | |
596 | |
597 switch( http_hdr->status_code ) { | |
598 case 200: | |
599 case 206: // OK | |
600 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Type: [%s]\n", http_get_field(http_hdr, "Content-Type") ); | |
601 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Length: [%s]\n", http_get_field(http_hdr, "Content-Length") ); | |
602 if( http_hdr->body_size>0 ) { | |
603 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { | |
604 http_free( http_hdr ); | |
605 return -1; | |
606 } | |
607 } | |
608 break; | |
609 default: | |
610 mp_msg(MSGT_NETWORK,MSGL_ERR,"Server return %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase ); | |
611 close( fd ); | |
612 fd = -1; | |
613 } | |
614 stream->fd = fd; | |
615 | |
616 if( http_hdr ) { | |
617 http_free( http_hdr ); | |
618 stream->streaming_ctrl->data = NULL; | |
619 } | |
620 | |
621 stream->pos=pos; | |
622 | |
623 return 1; | |
624 } | |
625 | |
626 | |
903 | 627 // By using the protocol, the extension of the file or the content-type |
628 // we might be able to guess the streaming type. | |
629 int | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
630 autodetectProtocol(streaming_ctrl_t *streaming_ctrl, int *fd_out, int *file_format) { |
903 | 631 HTTP_header_t *http_hdr; |
11505
8de9dba0ffaa
Add detection of Real rtsp when there are queries in url.
rtognimp
parents:
11228
diff
changeset
|
632 unsigned int i; |
903 | 633 int fd=-1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
634 int redirect; |
6516
351790e49eff
Improved the authentication interaction. Still need to replace scanf.
bertrand
parents:
6515
diff
changeset
|
635 int auth_retry=0; |
11965 | 636 int seekable=0; |
903 | 637 char *extension; |
638 char *content_type; | |
639 char *next_url; | |
640 | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
641 URL_t *url = streaming_ctrl->url; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
642 *file_format = DEMUXER_TYPE_UNKNOWN; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
643 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
644 do { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
645 *fd_out = -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
646 next_url = NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
647 extension = NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
648 content_type = NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
649 redirect = 0; |
903 | 650 |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
651 if( url==NULL ) { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
652 return -1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
653 } |
903 | 654 |
8570 | 655 // Checking for PNM:// |
656 if( !strcasecmp(url->protocol, "pnm") ) { | |
657 *file_format = DEMUXER_TYPE_REAL; | |
658 return 0; | |
659 } | |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
660 |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
661 /* |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
662 * An autodetection based on the extension is not a good idea. |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
663 * |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
664 // Get the extension of the file if present |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
665 if( url->file!=NULL ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
666 for( i=strlen(url->file) ; i>0 ; i-- ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
667 if( url->file[i]=='.' ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
668 extension=(url->file)+i+1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
669 break; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
670 } |
903 | 671 } |
672 } | |
3042 | 673 extension=NULL; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
674 if( extension!=NULL ) { |
5915 | 675 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Extension: %s\n", extension ); |
3042 | 676 // Look for the extension in the extensions table |
677 for( i=0 ; i<(sizeof(extensions_table)/sizeof(extensions_table[0])) ; i++ ) { | |
678 if( !strcasecmp(extension, extensions_table[i].extension) ) { | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
679 *file_format = extensions_table[i].demuxer_type; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
680 return 0; |
3042 | 681 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
682 } |
903 | 683 } |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
684 */ |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
685 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
686 // Checking for RTSP |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
687 if( !strcasecmp(url->protocol, "rtsp") ) { |
12206
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
688 // Try Real rtsp:// first (it's always built in) |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
689 // If it fails, try live.com (if compiled in) |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
690 *file_format = DEMUXER_TYPE_REAL; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
691 return 0; |
10055
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
692 // Checking for SIP |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
693 } else if( !strcasecmp(url->protocol, "sip") ) { |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
694 #ifdef STREAMING_LIVE_DOT_COM |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
695 *file_format = DEMUXER_TYPE_RTP; |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
696 return 0; |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
697 #else |
2e6d63e564f2
We now check for "sip:" URLs - which are handled using the same LIVE.COM
rsf
parents:
9932
diff
changeset
|
698 mp_msg(MSGT_NETWORK,MSGL_ERR,"SIP support requires the \"LIVE.COM Streaming Media\" libraries!\n"); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
699 return -1; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
700 #endif |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
701 } |
903 | 702 |
12799 | 703 // Old, hacked RTP support, which works for MPEG Streams |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
704 // RTP streams only: |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
705 // Checking for RTP |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
706 if( !strcasecmp(url->protocol, "rtp") ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
707 if( url->port==0 ) { |
5915 | 708 mp_msg(MSGT_NETWORK,MSGL_ERR,"You must enter a port number for RTP streams!\n"); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
709 return -1; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
710 } |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
711 return 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
712 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
713 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
714 // Checking for ASF |
3453
10577da4a7b1
Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents:
3424
diff
changeset
|
715 if( !strncasecmp(url->protocol, "mms", 3) ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
716 *file_format = DEMUXER_TYPE_ASF; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
717 return 0; |
903 | 718 } |
719 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
720 // HTTP based protocol |
4145 | 721 if( !strcasecmp(url->protocol, "http") || !strcasecmp(url->protocol, "http_proxy") ) { |
11965 | 722 fd = http_send_request( url, 0 ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
723 if( fd<0 ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
724 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
725 } |
903 | 726 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
727 http_hdr = http_read_response( fd ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
728 if( http_hdr==NULL ) { |
10281 | 729 closesocket( fd ); |
3042 | 730 http_free( http_hdr ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
731 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
732 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
733 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
734 *fd_out=fd; |
8027 | 735 if( verbose>0 ) { |
4121 | 736 http_debug_hdr( http_hdr ); |
737 } | |
738 | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
739 streaming_ctrl->data = (void*)http_hdr; |
11965 | 740 |
741 // Check if we can make partial content requests and thus seek in http-streams | |
12018 | 742 if( http_hdr!=NULL && http_hdr->status_code==200 ) { |
743 char *accept_ranges; | |
744 if( (accept_ranges = http_get_field(http_hdr,"Accept-Ranges")) != NULL ) | |
745 seekable = strncmp(accept_ranges,"bytes",5)==0; | |
746 } | |
11965 | 747 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
748 // Check if the response is an ICY status_code reason_phrase |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
749 if( !strcasecmp(http_hdr->protocol, "ICY") ) { |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
750 switch( http_hdr->status_code ) { |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
751 case 200: { // OK |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
752 char *field_data = NULL; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
753 // note: I skip icy-notice1 and 2, as they contain html <BR> |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
754 // and are IMHO useless info ::atmos |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
755 if( (field_data = http_get_field(http_hdr, "icy-name")) != NULL ) |
5915 | 756 mp_msg(MSGT_NETWORK,MSGL_INFO,"Name : %s\n", field_data); field_data = NULL; |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
757 if( (field_data = http_get_field(http_hdr, "icy-genre")) != NULL ) |
5915 | 758 mp_msg(MSGT_NETWORK,MSGL_INFO,"Genre : %s\n", field_data); field_data = NULL; |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
759 if( (field_data = http_get_field(http_hdr, "icy-url")) != NULL ) |
5915 | 760 mp_msg(MSGT_NETWORK,MSGL_INFO,"Website: %s\n", field_data); field_data = NULL; |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
761 // XXX: does this really mean public server? ::atmos |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
762 if( (field_data = http_get_field(http_hdr, "icy-pub")) != NULL ) |
5915 | 763 mp_msg(MSGT_NETWORK,MSGL_INFO,"Public : %s\n", atoi(field_data)?"yes":"no"); field_data = NULL; |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
764 if( (field_data = http_get_field(http_hdr, "icy-br")) != NULL ) |
5915 | 765 mp_msg(MSGT_NETWORK,MSGL_INFO,"Bitrate: %skbit/s\n", field_data); field_data = NULL; |
12175 | 766 |
767 // If content-type == video/nsv we most likely have a winamp video stream | |
768 // otherwise it should be mp3. if there are more types consider adding mime type | |
769 // handling like later | |
12477
1550ef7117c4
Add detection of nsa streamed by aol ultravox server
rtognimp
parents:
12390
diff
changeset
|
770 if ( (field_data = http_get_field(http_hdr, "content-type")) != NULL && (!strcmp(field_data, "video/nsv") || !strcmp(field_data, "misc/ultravox"))) |
12175 | 771 *file_format = DEMUXER_TYPE_NSV; |
772 else | |
773 *file_format = DEMUXER_TYPE_AUDIO; | |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
774 return 0; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
775 } |
5916 | 776 case 400: // Server Full |
777 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server is full, skipping!\n"); | |
778 return -1; | |
5892 | 779 case 401: // Service Unavailable |
5915 | 780 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server return service unavailable, skipping!\n"); |
5892 | 781 return -1; |
8766
50ffffd0bc18
Added the ICY 403 "Service Forbiden" error message.
bertrand
parents:
8570
diff
changeset
|
782 case 403: // Service Forbidden |
50ffffd0bc18
Added the ICY 403 "Service Forbiden" error message.
bertrand
parents:
8570
diff
changeset
|
783 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server return 'Service Forbidden'\n"); |
50ffffd0bc18
Added the ICY 403 "Service Forbiden" error message.
bertrand
parents:
8570
diff
changeset
|
784 return -1; |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
785 case 404: // Resource Not Found |
5915 | 786 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server couldn't find requested stream, skipping!\n"); |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
787 return -1; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
788 default: |
5915 | 789 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: unhandled ICY-Errorcode, contact MPlayer developers!\n"); |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
790 return -1; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
791 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
792 } |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
793 |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
794 // Assume standard http if not ICY |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
795 switch( http_hdr->status_code ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
796 case 200: // OK |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
797 // Look if we can use the Content-Type |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
798 content_type = http_get_field( http_hdr, "Content-Type" ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
799 if( content_type!=NULL ) { |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
800 char *content_length = NULL; |
5915 | 801 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Type: [%s]\n", content_type ); |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
802 if( (content_length = http_get_field(http_hdr, "Content-Length")) != NULL) |
5915 | 803 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Length: [%s]\n", http_get_field(http_hdr, "Content-Length")); |
3042 | 804 // Check in the mime type table for a demuxer type |
805 for( i=0 ; i<(sizeof(mime_type_table)/sizeof(mime_type_table[0])) ; i++ ) { | |
806 if( !strcasecmp( content_type, mime_type_table[i].mime_type ) ) { | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
807 *file_format = mime_type_table[i].demuxer_type; |
11965 | 808 return seekable; // for streaming_start |
3042 | 809 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
810 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
811 } |
4817
1e46f40dcd0e
Handle HTTP OK response that doesn't contain a mime-type.
bertrand
parents:
4802
diff
changeset
|
812 // Not found in the mime type table, don't fail, |
1e46f40dcd0e
Handle HTTP OK response that doesn't contain a mime-type.
bertrand
parents:
4802
diff
changeset
|
813 // we should try raw HTTP |
11965 | 814 return seekable; // for streaming_start |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
815 // Redirect |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
816 case 301: // Permanently |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
817 case 302: // Temporarily |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
818 // TODO: RFC 2616, recommand to detect infinite redirection loops |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
819 next_url = http_get_field( http_hdr, "Location" ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
820 if( next_url!=NULL ) { |
10281 | 821 closesocket( fd ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
822 url_free( url ); |
4802 | 823 streaming_ctrl->url = url = url_new( next_url ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
824 http_free( http_hdr ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
825 redirect = 1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
826 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
827 break; |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
828 case 401: // Authentication required |
6555 | 829 if( http_authenticate(http_hdr, url, &auth_retry)<0 ) return -1; |
6515 | 830 redirect = 1; |
831 break; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
832 default: |
5915 | 833 mp_msg(MSGT_NETWORK,MSGL_ERR,"Server returned %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
834 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
835 } |
3453
10577da4a7b1
Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents:
3424
diff
changeset
|
836 } else { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
837 mp_msg(MSGT_NETWORK,MSGL_V,"Unknown protocol '%s'\n", url->protocol ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
838 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
839 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
840 } while( redirect ); |
903 | 841 |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
842 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
843 } |
903 | 844 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
845 int |
3042 | 846 streaming_bufferize( streaming_ctrl_t *streaming_ctrl, char *buffer, int size) { |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
847 //printf("streaming_bufferize\n"); |
3042 | 848 streaming_ctrl->buffer = (char*)malloc(size); |
849 if( streaming_ctrl->buffer==NULL ) { | |
5915 | 850 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); |
3042 | 851 return -1; |
852 } | |
853 memcpy( streaming_ctrl->buffer, buffer, size ); | |
854 streaming_ctrl->buffer_size = size; | |
3599 | 855 return size; |
3042 | 856 } |
857 | |
858 int | |
859 nop_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
860 int len=0; | |
861 //printf("nop_streaming_read\n"); | |
862 if( stream_ctrl->buffer_size!=0 ) { | |
863 int buffer_len = stream_ctrl->buffer_size-stream_ctrl->buffer_pos; | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
864 //printf("%d bytes in buffer\n", stream_ctrl->buffer_size); |
3042 | 865 len = (size<buffer_len)?size:buffer_len; |
866 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); | |
867 stream_ctrl->buffer_pos += len; | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
868 //printf("buffer_pos = %d\n", stream_ctrl->buffer_pos ); |
3042 | 869 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { |
870 free( stream_ctrl->buffer ); | |
871 stream_ctrl->buffer = NULL; | |
872 stream_ctrl->buffer_size = 0; | |
873 stream_ctrl->buffer_pos = 0; | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
874 //printf("buffer cleaned\n"); |
3042 | 875 } |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
876 //printf("read %d bytes from buffer\n", len ); |
3042 | 877 } |
878 | |
879 if( len<size ) { | |
3365 | 880 int ret; |
10206
35e306346e59
Using recv/send instead read/write for proper MinGW support (it's a 4.2BSD standard). Patch by FloDt <flodt8@yahoo.de>
alex
parents:
10199
diff
changeset
|
881 ret = recv( fd, buffer+len, size-len, 0 ); |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
882 if( ret<0 ) { |
5915 | 883 mp_msg(MSGT_NETWORK,MSGL_ERR,"nop_streaming_read error : %s\n",strerror(errno)); |
3365 | 884 } |
885 len += ret; | |
3042 | 886 //printf("read %d bytes from network\n", len ); |
887 } | |
888 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
889 return len; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
890 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
891 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
892 int |
3042 | 893 nop_streaming_seek( int fd, off_t pos, streaming_ctrl_t *stream_ctrl ) { |
894 return -1; | |
7953 | 895 // To shut up gcc warning |
896 fd++; | |
897 pos++; | |
898 stream_ctrl=NULL; | |
3042 | 899 } |
900 | |
901 int | |
902 nop_streaming_start( stream_t *stream ) { | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
903 HTTP_header_t *http_hdr = NULL; |
12268 | 904 char *next_url=NULL; |
905 URL_t *rd_url=NULL; | |
906 int fd,ret; | |
3042 | 907 if( stream==NULL ) return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
908 |
3042 | 909 fd = stream->fd; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
910 if( fd<0 ) { |
11965 | 911 fd = http_send_request( stream->streaming_ctrl->url, 0 ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
912 if( fd<0 ) return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
913 http_hdr = http_read_response( fd ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
914 if( http_hdr==NULL ) return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
915 |
903 | 916 switch( http_hdr->status_code ) { |
917 case 200: // OK | |
5915 | 918 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Type: [%s]\n", http_get_field(http_hdr, "Content-Type") ); |
919 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Length: [%s]\n", http_get_field(http_hdr, "Content-Length") ); | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
920 if( http_hdr->body_size>0 ) { |
3042 | 921 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { |
922 http_free( http_hdr ); | |
923 return -1; | |
924 } | |
903 | 925 } |
926 break; | |
12268 | 927 // Redirect |
928 case 301: // Permanently | |
929 case 302: // Temporarily | |
930 ret=-1; | |
931 next_url = http_get_field( http_hdr, "Location" ); | |
932 | |
933 if (next_url != NULL) | |
934 rd_url=url_new(next_url); | |
935 | |
936 if (next_url != NULL && rd_url != NULL) { | |
937 mp_msg(MSGT_NETWORK,MSGL_STATUS,"Redirected: Using this url instead %s\n",next_url); | |
938 stream->streaming_ctrl->url=check4proxies(rd_url); | |
939 ret=nop_streaming_start(stream); //recursively get streaming started | |
940 } else { | |
941 mp_msg(MSGT_NETWORK,MSGL_ERR,"Redirection failed\n"); | |
942 closesocket( fd ); | |
943 fd = -1; | |
944 } | |
945 return ret; | |
946 break; | |
947 case 401: //Authorization required | |
948 case 403: //Forbidden | |
949 case 404: //Not found | |
950 case 500: //Server Error | |
903 | 951 default: |
12268 | 952 mp_msg(MSGT_NETWORK,MSGL_ERR,"Server returned code %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase ); |
10281 | 953 closesocket( fd ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
954 fd = -1; |
12268 | 955 return -1; |
956 break; | |
903 | 957 } |
3042 | 958 stream->fd = fd; |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
959 } else { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
960 http_hdr = (HTTP_header_t*)stream->streaming_ctrl->data; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
961 if( http_hdr->body_size>0 ) { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
962 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
963 http_free( http_hdr ); |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
964 stream->streaming_ctrl->data = NULL; |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
965 return -1; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
966 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
967 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
968 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
969 |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
970 if( http_hdr ) { |
3732 | 971 http_free( http_hdr ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
972 stream->streaming_ctrl->data = NULL; |
903 | 973 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
974 |
3042 | 975 stream->streaming_ctrl->streaming_read = nop_streaming_read; |
976 stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
8939 | 977 stream->streaming_ctrl->prebuffer_size = 64*1024; // 64 KBytes |
3042 | 978 stream->streaming_ctrl->buffering = 1; |
979 stream->streaming_ctrl->status = streaming_playing_e; | |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
980 return 0; |
903 | 981 } |
982 | |
8570 | 983 int |
984 pnm_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
985 return pnm_read(stream_ctrl->data, buffer, size); | |
986 } | |
987 | |
988 | |
989 int | |
990 pnm_streaming_start( stream_t *stream ) { | |
991 int fd; | |
992 pnm_t *pnm; | |
993 if( stream==NULL ) return -1; | |
994 | |
995 fd = connect2Server( stream->streaming_ctrl->url->hostname, | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
996 stream->streaming_ctrl->url->port ? stream->streaming_ctrl->url->port : 7070,1 ); |
8570 | 997 printf("PNM:// fd=%d\n",fd); |
998 if(fd<0) return -1; | |
999 | |
1000 pnm = pnm_connect(fd,stream->streaming_ctrl->url->file); | |
1001 if(!pnm) return -1; | |
1002 | |
1003 stream->fd=fd; | |
1004 stream->streaming_ctrl->data=pnm; | |
1005 | |
1006 stream->streaming_ctrl->streaming_read = pnm_streaming_read; | |
1007 // stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
8939 | 1008 stream->streaming_ctrl->prebuffer_size = 8*1024; // 8 KBytes |
8570 | 1009 stream->streaming_ctrl->buffering = 1; |
1010 stream->streaming_ctrl->status = streaming_playing_e; | |
1011 return 0; | |
1012 } | |
1013 | |
1014 | |
9922 | 1015 int |
1016 realrtsp_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
1017 return rtsp_session_read(stream_ctrl->data, buffer, size); | |
1018 } | |
1019 | |
1020 | |
1021 int | |
1022 realrtsp_streaming_start( stream_t *stream ) { | |
1023 int fd; | |
1024 rtsp_session_t *rtsp; | |
1025 char *mrl; | |
12894
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1026 char *file; |
9922 | 1027 int port; |
10199 | 1028 int redirected, temp; |
9922 | 1029 if( stream==NULL ) return -1; |
10199 | 1030 |
1031 temp = 5; // counter so we don't get caught in infinite redirections (you never know) | |
1032 | |
1033 do { | |
1034 | |
10317 | 1035 redirected = 0; |
9922 | 1036 |
10317 | 1037 fd = connect2Server( stream->streaming_ctrl->url->hostname, |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
1038 port = (stream->streaming_ctrl->url->port ? stream->streaming_ctrl->url->port : 554),1 ); |
10317 | 1039 if(fd<0) return -1; |
1040 | |
12894
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1041 file = stream->streaming_ctrl->url->file; |
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1042 if (file[0] == '/') |
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1043 file++; |
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1044 mrl = malloc(sizeof(char)*(strlen(stream->streaming_ctrl->url->hostname)+strlen(file)+16)); |
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1045 sprintf(mrl,"rtsp://%s:%i/%s",stream->streaming_ctrl->url->hostname,port,file); |
1591792d4054
Fix segfault caused by changing a pointer that will be freed later
rtognimp
parents:
12799
diff
changeset
|
1046 rtsp = rtsp_session_start(fd,&mrl, file, |
10317 | 1047 stream->streaming_ctrl->url->hostname, port, &redirected); |
10199 | 1048 |
10317 | 1049 if ( redirected == 1 ) { |
1050 url_free(stream->streaming_ctrl->url); | |
1051 stream->streaming_ctrl->url = url_new(mrl); | |
1052 closesocket(fd); | |
1053 } | |
10199 | 1054 |
10317 | 1055 free(mrl); |
1056 temp--; | |
10199 | 1057 |
1058 } while( (redirected != 0) && (temp > 0) ); | |
1059 | |
9922 | 1060 if(!rtsp) return -1; |
1061 | |
1062 stream->fd=fd; | |
1063 stream->streaming_ctrl->data=rtsp; | |
1064 | |
1065 stream->streaming_ctrl->streaming_read = realrtsp_streaming_read; | |
1066 // stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
1067 stream->streaming_ctrl->prebuffer_size = 128*1024; // 8 KBytes | |
1068 stream->streaming_ctrl->buffering = 1; | |
1069 stream->streaming_ctrl->status = streaming_playing_e; | |
1070 return 0; | |
1071 } | |
1072 | |
1073 | |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1074 // Start listening on a UDP port. If multicast, join the group. |
12799 | 1075 static int |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1076 rtp_open_socket( URL_t *url ) { |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1077 int socket_server_fd, rxsockbufsz; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1078 int err, err_len; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1079 fd_set set; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1080 struct sockaddr_in server_address; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1081 struct ip_mreq mcast; |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1082 struct timeval tv; |
12610
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1083 struct hostent *hp; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1084 |
5915 | 1085 mp_msg(MSGT_NETWORK,MSGL_V,"Listening for traffic on %s:%d ...\n", url->hostname, url->port ); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1086 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1087 socket_server_fd = socket(AF_INET, SOCK_DGRAM, 0); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1088 // fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1089 if( socket_server_fd==-1 ) { |
6454 | 1090 mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to create socket\n"); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1091 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1092 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1093 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1094 if( isalpha(url->hostname[0]) ) { |
12610
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1095 #ifndef HAVE_WINSOCK2 |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1096 hp =(struct hostent*)gethostbyname( url->hostname ); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1097 if( hp==NULL ) { |
5915 | 1098 mp_msg(MSGT_NETWORK,MSGL_ERR,"Counldn't resolve name: %s\n", url->hostname); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1099 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1100 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1101 memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length ); |
12610
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1102 #else |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1103 server_address.sin_addr.s_addr = htonl(INADDR_ANY); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1104 #endif |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1105 } else { |
10281 | 1106 #ifndef HAVE_WINSOCK2 |
9890
237fcb766110
removed some wrappers, now the configure checks for inet_pton. patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9749
diff
changeset
|
1107 #ifdef USE_ATON |
237fcb766110
removed some wrappers, now the configure checks for inet_pton. patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9749
diff
changeset
|
1108 inet_aton(url->hostname, &server_address.sin_addr); |
237fcb766110
removed some wrappers, now the configure checks for inet_pton. patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9749
diff
changeset
|
1109 #else |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1110 inet_pton(AF_INET, url->hostname, &server_address.sin_addr); |
9890
237fcb766110
removed some wrappers, now the configure checks for inet_pton. patch by Joey Parrish <joey@nicewarrior.org>
alex
parents:
9749
diff
changeset
|
1111 #endif |
10281 | 1112 #else |
12610
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1113 server_address.sin_addr.s_addr = htonl(INADDR_ANY); |
10281 | 1114 #endif |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1115 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1116 server_address.sin_family=AF_INET; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1117 server_address.sin_port=htons(url->port); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1118 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1119 if( bind( socket_server_fd, (struct sockaddr*)&server_address, sizeof(server_address) )==-1 ) { |
10281 | 1120 #ifndef HAVE_WINSOCK2 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1121 if( errno!=EINPROGRESS ) { |
10281 | 1122 #else |
1123 if( WSAGetLastError() != WSAEINPROGRESS ) { | |
1124 #endif | |
6454 | 1125 mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server\n"); |
10281 | 1126 closesocket(socket_server_fd); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1127 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1128 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1129 } |
12610
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1130 |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1131 #ifdef HAVE_WINSOCK2 |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1132 if (isalpha(url->hostname[0])) { |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1133 hp =(struct hostent*)gethostbyname( url->hostname ); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1134 if( hp==NULL ) { |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1135 mp_msg(MSGT_NETWORK,MSGL_ERR,"Counldn't resolve name: %s\n", url->hostname); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1136 return -1; |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1137 } |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1138 memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length ); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1139 } else { |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1140 unsigned int addr = inet_addr(url->hostname); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1141 memcpy( (void*)&server_address.sin_addr, (void*)&addr, sizeof(addr) ); |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1142 } |
7992cd49a698
calling bind with multicast addresses doesn't work on windows, patch by Martin Decky <deckm1am at ss1000.ms.mff.cuni.cz>
faust3
parents:
12477
diff
changeset
|
1143 #endif |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1144 |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1145 // Increase the socket rx buffer size to maximum -- this is UDP |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1146 rxsockbufsz = 240 * 1024; |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1147 if( setsockopt( socket_server_fd, SOL_SOCKET, SO_RCVBUF, &rxsockbufsz, sizeof(rxsockbufsz))) { |
6454 | 1148 mp_msg(MSGT_NETWORK,MSGL_ERR,"Couldn't set receive socket buffer size\n"); |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1149 } |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1150 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1151 if((ntohl(server_address.sin_addr.s_addr) >> 28) == 0xe) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1152 mcast.imr_multiaddr.s_addr = server_address.sin_addr.s_addr; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1153 //mcast.imr_interface.s_addr = inet_addr("10.1.1.2"); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1154 mcast.imr_interface.s_addr = 0; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1155 if( setsockopt( socket_server_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))) { |
6454 | 1156 mp_msg(MSGT_NETWORK,MSGL_ERR,"IP_ADD_MEMBERSHIP failed (do you have multicasting enabled in your kernel?)\n"); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1157 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1158 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1159 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1160 |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1161 tv.tv_sec = 0; |
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1162 tv.tv_usec = (1 * 1000000); // 1 second timeout |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1163 FD_ZERO( &set ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1164 FD_SET( socket_server_fd, &set ); |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1165 if( select(socket_server_fd+1, &set, NULL, NULL, &tv)>0 ) { |
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1166 //if( select(socket_server_fd+1, &set, NULL, NULL, NULL)>0 ) { |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1167 err_len = sizeof( err ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1168 getsockopt( socket_server_fd, SOL_SOCKET, SO_ERROR, &err, &err_len ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1169 if( err ) { |
5915 | 1170 mp_msg(MSGT_NETWORK,MSGL_ERR,"Timeout! No data from host %s\n", url->hostname ); |
1171 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Socket error: %d\n", err ); | |
10281 | 1172 closesocket(socket_server_fd); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1173 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1174 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1175 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1176 return socket_server_fd; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1177 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1178 |
12799 | 1179 static int |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1180 rtp_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *streaming_ctrl ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1181 return read_rtp_from_server( fd, buffer, size ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1182 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1183 |
12799 | 1184 static int |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1185 rtp_streaming_start( stream_t *stream ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1186 streaming_ctrl_t *streaming_ctrl; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1187 int fd; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1188 |
3732 | 1189 if( stream==NULL ) return -1; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1190 streaming_ctrl = stream->streaming_ctrl; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1191 fd = stream->fd; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1192 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1193 if( fd<0 ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1194 fd = rtp_open_socket( (streaming_ctrl->url) ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1195 if( fd<0 ) return -1; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1196 stream->fd = fd; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1197 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1198 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1199 streaming_ctrl->streaming_read = rtp_streaming_read; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1200 streaming_ctrl->streaming_seek = nop_streaming_seek; |
8939 | 1201 streaming_ctrl->prebuffer_size = 64*1024; // 64 KBytes |
4289
973c6912c586
Set the cache value if the network layer was able to compute it.
bertrand
parents:
4251
diff
changeset
|
1202 streaming_ctrl->buffering = 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1203 streaming_ctrl->status = streaming_playing_e; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1204 return 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1205 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1206 |
903 | 1207 int |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1208 streaming_start(stream_t *stream, int *demuxer_type, URL_t *url) { |
7953 | 1209 int ret; |
3042 | 1210 if( stream==NULL ) return -1; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1211 |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1212 stream->streaming_ctrl = streaming_ctrl_new(); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1213 if( stream->streaming_ctrl==NULL ) { |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1214 return -1; |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1215 } |
4652 | 1216 stream->streaming_ctrl->url = check4proxies( url ); |
12223 | 1217 |
1218 if (*demuxer_type != DEMUXER_TYPE_PLAYLIST){ | |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1219 ret = autodetectProtocol( stream->streaming_ctrl, &stream->fd, demuxer_type ); |
12223 | 1220 } else { |
1221 ret=0; | |
1222 } | |
1223 | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1224 if( ret<0 ) { |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1225 return -1; |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1226 } |
11965 | 1227 if( ret==1 ) { |
1228 stream->flags |= STREAM_SEEK; | |
1229 stream->seek = http_seek; | |
1230 } | |
1231 | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1232 ret = -1; |
3042 | 1233 |
6642
e47d54a2cfff
Retreive the bandwidth option from the command line.
bertrand
parents:
6570
diff
changeset
|
1234 // Get the bandwidth available |
7867 | 1235 stream->streaming_ctrl->bandwidth = network_bandwidth; |
6642
e47d54a2cfff
Retreive the bandwidth option from the command line.
bertrand
parents:
6570
diff
changeset
|
1236 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1237 // For RTP streams, we usually don't know the stream type until we open it. |
4121 | 1238 if( !strcasecmp( stream->streaming_ctrl->url->protocol, "rtp")) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
1239 if(stream->fd >= 0) { |
10281 | 1240 if(closesocket(stream->fd) < 0) |
5915 | 1241 mp_msg(MSGT_NETWORK,MSGL_ERR,"streaming_start : Closing socket %d failed %s\n",stream->fd,strerror(errno)); |
4041
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3732
diff
changeset
|
1242 } |
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3732
diff
changeset
|
1243 stream->fd = -1; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1244 ret = rtp_streaming_start( stream ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
1245 } else |
8570 | 1246 |
1247 if( !strcasecmp( stream->streaming_ctrl->url->protocol, "pnm")) { | |
1248 stream->fd = -1; | |
1249 ret = pnm_streaming_start( stream ); | |
1250 } else | |
1251 | |
9922 | 1252 if( (!strcasecmp( stream->streaming_ctrl->url->protocol, "rtsp")) && |
1253 (*demuxer_type == DEMUXER_TYPE_REAL)) { | |
1254 stream->fd = -1; | |
12206
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1255 if ((ret = realrtsp_streaming_start( stream )) < 0) { |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1256 mp_msg(MSGT_NETWORK,MSGL_INFO,"Not a Realmedia rtsp url. Trying standard rtsp protocol.\n"); |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1257 #ifdef STREAMING_LIVE_DOT_COM |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1258 *demuxer_type = DEMUXER_TYPE_RTP; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1259 goto try_livedotcom; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1260 #else |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1261 mp_msg(MSGT_NETWORK,MSGL_ERR,"RTSP support requires the \"LIVE.COM Streaming Media\" libraries!\n"); |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1262 return -1; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1263 #endif |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1264 } |
9922 | 1265 } else |
1266 | |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1267 // For connection-oriented streams, we can usually determine the streaming type. |
12206
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1268 try_livedotcom: |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1269 switch( *demuxer_type ) { |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1270 case DEMUXER_TYPE_ASF: |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1271 // Send the appropriate HTTP request |
3042 | 1272 // Need to filter the network stream. |
1273 // ASF raw stream is encapsulated. | |
9749 | 1274 // It can also be a playlist (redirector) |
1275 // so we need to pass demuxer_type too | |
1276 ret = asf_streaming_start( stream, demuxer_type ); | |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1277 if( ret<0 ) { |
12390
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1278 //sometimes a file is just on a webserver and it is not streamed. |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1279 //try loading them default method as last resort for http protocol |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1280 if ( !strcasecmp(stream->streaming_ctrl->url->protocol, "http") ) { |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1281 mp_msg(MSGT_NETWORK,MSGL_STATUS,"Trying default streaming for http protocol\n "); |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1282 //reset stream |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1283 close(stream->fd); |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1284 stream->fd=-1; |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1285 ret=nop_streaming_start(stream); |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1286 } |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1287 |
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1288 if (ret<0) { |
5915 | 1289 mp_msg(MSGT_NETWORK,MSGL_ERR,"asf_streaming_start failed\n"); |
12274 | 1290 mp_msg(MSGT_NETWORK,MSGL_STATUS,"Check if this is a playlist which requires -playlist option\nExample: mplayer -playlist <url>\n"); |
12390
338e9d30be5e
Try to get an asf file with normal http protocol if http streaming
rtognimp
parents:
12352
diff
changeset
|
1291 } |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1292 } |
903 | 1293 break; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1294 #ifdef STREAMING_LIVE_DOT_COM |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1295 case DEMUXER_TYPE_RTP: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1296 // RTSP/RTP streaming is handled separately: |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1297 ret = rtsp_streaming_start( stream ); |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1298 if( ret<0 ) { |
7007 | 1299 mp_msg(MSGT_NETWORK,MSGL_ERR,"rtsp_streaming_start failed\n"); |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1300 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1301 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1302 #endif |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1303 case DEMUXER_TYPE_MPEG_ES: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1304 case DEMUXER_TYPE_MPEG_PS: |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1305 case DEMUXER_TYPE_AVI: |
3042 | 1306 case DEMUXER_TYPE_MOV: |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1307 case DEMUXER_TYPE_VIVO: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1308 case DEMUXER_TYPE_FLI: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1309 case DEMUXER_TYPE_REAL: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1310 case DEMUXER_TYPE_Y4M: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1311 case DEMUXER_TYPE_FILM: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1312 case DEMUXER_TYPE_ROQ: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1313 case DEMUXER_TYPE_AUDIO: |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
1314 case DEMUXER_TYPE_OGG: |
4783 | 1315 case DEMUXER_TYPE_PLAYLIST: |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1316 case DEMUXER_TYPE_UNKNOWN: |
12175 | 1317 case DEMUXER_TYPE_NSV: |
3042 | 1318 // Generic start, doesn't need to filter |
1319 // the network stream, it's a raw stream | |
1320 ret = nop_streaming_start( stream ); | |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1321 if( ret<0 ) { |
5915 | 1322 mp_msg(MSGT_NETWORK,MSGL_ERR,"nop_streaming_start failed\n"); |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1323 } |
903 | 1324 break; |
1325 default: | |
5915 | 1326 mp_msg(MSGT_NETWORK,MSGL_ERR,"Unable to detect the streaming type\n"); |
3042 | 1327 ret = -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1328 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1329 |
3042 | 1330 if( ret<0 ) { |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1331 streaming_ctrl_free( stream->streaming_ctrl ); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1332 stream->streaming_ctrl = NULL; |
4652 | 1333 } else if( stream->streaming_ctrl->buffering ) { |
7881
aba9301ed3c4
allow cache to be disabled (-nocache should override cachesize autodetection
arpi
parents:
7867
diff
changeset
|
1334 if(stream_cache_size<0) { |
6555 | 1335 // cache option not set, will use our computed value. |
4302
9f12fd5f47d0
Modified the cache option value setting/reading, so we can report
bertrand
parents:
4293
diff
changeset
|
1336 // buffer in KBytes, *5 because the prefill is 20% of the buffer. |
7867 | 1337 stream_cache_size = (stream->streaming_ctrl->prebuffer_size/1024)*5; |
8939 | 1338 if( stream_cache_size<64 ) stream_cache_size = 64; // 16KBytes min buffer |
4302
9f12fd5f47d0
Modified the cache option value setting/reading, so we can report
bertrand
parents:
4293
diff
changeset
|
1339 } |
7867 | 1340 mp_msg(MSGT_NETWORK,MSGL_INFO,"Cache size set to %d KBytes\n", stream_cache_size); |
4289
973c6912c586
Set the cache value if the network layer was able to compute it.
bertrand
parents:
4251
diff
changeset
|
1341 } |
6032 | 1342 |
3042 | 1343 return ret; |
903 | 1344 } |
1345 | |
1346 int | |
3042 | 1347 streaming_stop( stream_t *stream ) { |
1348 stream->streaming_ctrl->status = streaming_stopped_e; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1349 return 0; |
903 | 1350 } |