Mercurial > mplayer.hg
annotate libmpdemux/network.c @ 12334:eeddcef4fb08
"hard" frame duplication for mencoder. this finally makes it possible
to generate valid mpeg output from avi's that have duplicate frames in
them, or when using inverse telecine filters. to use it, put the
"harddup" filter at the end of your filter chain.
author | rfelker |
---|---|
date | Wed, 28 Apr 2004 04:02:46 +0000 |
parents | 6fbd0aa81550 |
children | 2e0a4b32e139 |
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" | |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
35 #ifndef STREAMING_LIVE_DOT_COM |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
36 #include "rtp.h" |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
37 #endif |
8570 | 38 #include "pnm.h" |
9922 | 39 #include "realrtsp/rtsp_session.h" |
841 | 40 |
6466 | 41 #include "../version.h" |
42 | |
4121 | 43 extern int verbose; |
7867 | 44 extern int stream_cache_size; |
4121 | 45 |
7862
013c255225d8
mpdemux.c|h moved to libinput, mpdemux_check_interrupt() -> mp_input_check_interrupt()
arpi
parents:
7513
diff
changeset
|
46 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
|
47 |
9749 | 48 int asf_streaming_start( stream_t *stream, int *demuxer_type ); |
7953 | 49 int rtsp_streaming_start( stream_t *stream ); |
50 | |
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
|
51 /* 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
|
52 -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
|
53 |
7867 | 54 char *network_username=NULL; |
55 char *network_password=NULL; | |
56 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
|
57 int network_cookies_enabled = 0; |
11228 | 58 char *network_useragent=NULL; |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
59 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
60 /* IPv6 options */ |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
61 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
|
62 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
|
63 |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
64 |
3042 | 65 static struct { |
66 char *mime_type; | |
67 int demuxer_type; | |
68 } mime_type_table[] = { | |
69 // 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
|
70 { "audio/mpeg", DEMUXER_TYPE_AUDIO }, |
3042 | 71 // MPEG streaming |
72 { "video/mpeg", DEMUXER_TYPE_MPEG_PS }, | |
6032 | 73 { "video/x-mpeg", DEMUXER_TYPE_MPEG_PS }, |
74 { "video/x-mpeg2", DEMUXER_TYPE_MPEG_PS }, | |
3042 | 75 // AVI ??? => video/x-msvideo |
76 { "video/x-msvideo", DEMUXER_TYPE_AVI }, | |
77 // MOV => video/quicktime | |
78 { "video/quicktime", DEMUXER_TYPE_MOV }, | |
79 // ASF | |
80 { "audio/x-ms-wax", DEMUXER_TYPE_ASF }, | |
81 { "audio/x-ms-wma", DEMUXER_TYPE_ASF }, | |
82 { "video/x-ms-asf", DEMUXER_TYPE_ASF }, | |
83 { "video/x-ms-afs", DEMUXER_TYPE_ASF }, | |
84 { "video/x-ms-wvx", DEMUXER_TYPE_ASF }, | |
85 { "video/x-ms-wmv", DEMUXER_TYPE_ASF }, | |
86 { "video/x-ms-wma", DEMUXER_TYPE_ASF }, | |
4783 | 87 // Playlists |
7393 | 88 { "video/x-ms-wmx", DEMUXER_TYPE_PLAYLIST }, |
4783 | 89 { "audio/x-scpls", DEMUXER_TYPE_PLAYLIST }, |
90 { "audio/x-mpegurl", DEMUXER_TYPE_PLAYLIST }, | |
6032 | 91 { "audio/x-pls", DEMUXER_TYPE_PLAYLIST }, |
92 // Real Media | |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
93 { "audio/x-pn-realaudio", DEMUXER_TYPE_REAL }, |
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
94 // OGG Streaming |
12175 | 95 { "application/x-ogg", DEMUXER_TYPE_OGG }, |
96 // NullSoft Streaming Video | |
97 { "video/nsv", DEMUXER_TYPE_NSV} | |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
98 |
3042 | 99 }; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
100 |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
101 /* |
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
102 * 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
|
103 * |
3042 | 104 static struct { |
105 char *extension; | |
106 int demuxer_type; | |
107 } extensions_table[] = { | |
108 { "mpeg", DEMUXER_TYPE_MPEG_PS }, | |
109 { "mpg", DEMUXER_TYPE_MPEG_PS }, | |
3072 | 110 { "mpe", DEMUXER_TYPE_MPEG_ES }, |
3042 | 111 { "avi", DEMUXER_TYPE_AVI }, |
112 { "mov", DEMUXER_TYPE_MOV }, | |
3072 | 113 { "qt", DEMUXER_TYPE_MOV }, |
3042 | 114 { "asx", DEMUXER_TYPE_ASF }, |
115 { "asf", DEMUXER_TYPE_ASF }, | |
116 { "wmv", DEMUXER_TYPE_ASF }, | |
117 { "wma", DEMUXER_TYPE_ASF }, | |
3072 | 118 { "viv", DEMUXER_TYPE_VIVO }, |
4236 | 119 { "rm", DEMUXER_TYPE_REAL }, |
6032 | 120 { "ra", DEMUXER_TYPE_REAL }, |
4236 | 121 { "y4m", DEMUXER_TYPE_Y4M }, |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
122 { "mp3", DEMUXER_TYPE_AUDIO }, |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
123 { "ogg", DEMUXER_TYPE_OGG }, |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
124 { "wav", DEMUXER_TYPE_AUDIO }, |
4783 | 125 { "pls", DEMUXER_TYPE_PLAYLIST }, |
126 { "m3u", DEMUXER_TYPE_PLAYLIST } | |
3042 | 127 }; |
8890
c9cbfb9d720c
Finally commented out the code for autodetection based on the extension.
bertrand
parents:
8824
diff
changeset
|
128 */ |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
129 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
130 streaming_ctrl_t * |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
131 streaming_ctrl_new( ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
132 streaming_ctrl_t *streaming_ctrl; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
133 streaming_ctrl = (streaming_ctrl_t*)malloc(sizeof(streaming_ctrl_t)); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
134 if( streaming_ctrl==NULL ) { |
5915 | 135 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
|
136 return NULL; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
137 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
138 memset( streaming_ctrl, 0, sizeof(streaming_ctrl_t) ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
139 return streaming_ctrl; |
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 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
142 void |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
143 streaming_ctrl_free( streaming_ctrl_t *streaming_ctrl ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
144 if( streaming_ctrl==NULL ) return; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
145 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
|
146 if( streaming_ctrl->buffer ) free( streaming_ctrl->buffer ); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
147 if( streaming_ctrl->data ) free( streaming_ctrl->data ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
148 free( streaming_ctrl ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
149 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
150 |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
151 #ifndef STREAMING_LIVE_DOT_COM |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
152 int |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
153 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
|
154 struct rtpheader rh; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
155 char *data; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
156 int len; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
157 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
|
158 static unsigned short sequence; |
3686
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 if( buffer==NULL || length<0 ) return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
161 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
162 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
|
163 if( got_first && rh.b.sequence != (unsigned short)(sequence+1) ) |
5915 | 164 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
|
165 sequence+1, rh.b.sequence); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
166 got_first = 1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
167 sequence = rh.b.sequence; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
168 memcpy(buffer, data, len); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
169 return(len); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
170 } |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
171 #endif |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
172 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
173 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
174 // 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
|
175 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
176 char *af2String(int af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
177 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
178 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
|
179 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
180 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
181 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
|
182 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
183 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
|
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 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
187 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
188 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
189 // 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
|
190 // 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
|
191 // 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
|
192 |
833 | 193 int |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
194 connect2Server_with_af(char *host, int port, int af,int verb) { |
833 | 195 int socket_server_fd; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
196 int err, err_len; |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
197 int ret,count = 0; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
198 fd_set set; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
199 struct timeval tv; |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
200 union { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
201 struct sockaddr_in four; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
202 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
203 struct sockaddr_in6 six; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
204 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
205 } server_address; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
206 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
|
207 void *our_s_addr; // Pointer to sin_addr or sin6_addr |
7953 | 208 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
|
209 char buf[255]; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
210 |
10281 | 211 #ifdef HAVE_WINSOCK2 |
212 u_long val; | |
213 #endif | |
214 | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
215 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
|
216 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
217 |
833 | 218 if( socket_server_fd==-1 ) { |
11227 | 219 // 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
|
220 return -2; |
833 | 221 } |
222 | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
223 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
224 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
|
225 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
226 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
|
227 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
228 default: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
229 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
|
230 return -2; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
231 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
232 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
233 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
234 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
|
235 |
10281 | 236 #ifndef HAVE_WINSOCK2 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
237 #ifdef USE_ATON |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
238 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
|
239 #else |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
240 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
|
241 #endif |
10281 | 242 #else |
243 if ( inet_addr(host)==INADDR_NONE ) | |
244 #endif | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
245 { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
246 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
|
247 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
248 #ifdef HAVE_GETHOSTBYNAME2 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
249 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
|
250 #else |
3042 | 251 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
|
252 #endif |
841 | 253 if( hp==NULL ) { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
254 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
|
255 return -2; |
833 | 256 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
257 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
258 memcpy( our_s_addr, (void*)hp->h_addr, hp->h_length ); |
833 | 259 } |
10281 | 260 #ifdef HAVE_WINSOCK2 |
261 else { | |
262 unsigned long addr = inet_addr(host); | |
263 memcpy( our_s_addr, (void*)&addr, sizeof(addr) ); | |
264 } | |
265 #endif | |
3042 | 266 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
267 switch (af) { |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
268 case AF_INET: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
269 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
|
270 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
|
271 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
|
272 break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
273 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
274 case AF_INET6: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
275 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
|
276 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
|
277 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
|
278 break; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
279 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
280 default: |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
281 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
|
282 return -2; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
283 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
284 |
10281 | 285 #if defined(USE_ATON) || defined(HAVE_WINSOCK2) |
9900 | 286 strncpy( buf, inet_ntoa( *((struct in_addr*)our_s_addr) ), 255); |
287 #else | |
288 inet_ntop(af, our_s_addr, buf, 255); | |
289 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
290 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
|
291 |
3042 | 292 // Turn the socket as non blocking so we can timeout on the connection |
10281 | 293 #ifndef HAVE_WINSOCK2 |
3042 | 294 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK ); |
10281 | 295 #else |
296 val = 1; | |
297 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
298 #endif | |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
299 if( connect( socket_server_fd, (struct sockaddr*)&server_address, server_address_size )==-1 ) { |
10281 | 300 #ifndef HAVE_WINSOCK2 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
301 if( errno!=EINPROGRESS ) { |
10281 | 302 #else |
303 if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) { | |
304 #endif | |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
305 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server with %s\n", af2String(af)); |
10281 | 306 closesocket(socket_server_fd); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
307 return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
308 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
309 } |
6477 | 310 tv.tv_sec = 0; |
311 tv.tv_usec = 500000; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
312 FD_ZERO( &set ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
313 FD_SET( socket_server_fd, &set ); |
3042 | 314 // 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
|
315 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) { |
6454 | 316 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
|
317 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
|
318 else if(count > 30 || mp_input_check_interrupt(500)) { |
6477 | 319 if(count > 30) |
5915 | 320 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
|
321 else |
5915 | 322 mp_msg(MSGT_NETWORK,MSGL_V,"Connection interuppted by user\n"); |
8824 | 323 return -3; |
4825
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
324 } |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
325 count++; |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
326 FD_ZERO( &set ); |
41d2da3bd082
Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents:
4817
diff
changeset
|
327 FD_SET( socket_server_fd, &set ); |
6477 | 328 tv.tv_sec = 0; |
329 tv.tv_usec = 500000; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
330 } |
3042 | 331 |
332 // Turn back the socket as blocking | |
10281 | 333 #ifndef HAVE_WINSOCK2 |
3042 | 334 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK ); |
10281 | 335 #else |
336 val = 0; | |
337 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
338 #endif | |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
339 // Check if there were any error |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
340 err_len = sizeof(int); |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
341 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
|
342 if(ret < 0) { |
5915 | 343 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
|
344 return -2; |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
345 } |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
346 if(err > 0) { |
5915 | 347 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
|
348 return -1; |
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
349 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
350 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
351 return socket_server_fd; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
352 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
353 |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
354 // 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
|
355 // 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
|
356 // 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
|
357 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
358 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
359 int |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
360 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
|
361 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
362 int r; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
363 int s = -2; |
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 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
|
366 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
|
367 |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
368 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
|
369 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
|
370 return s; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
371 #else |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
372 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
|
373 #endif |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
374 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
375 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
376 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
377 |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
378 URL_t* |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
379 check4proxies( URL_t *url ) { |
4652 | 380 URL_t *url_out = NULL; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
381 if( url==NULL ) return NULL; |
4652 | 382 url_out = url_new( url->url ); |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
383 if( !strcasecmp(url->protocol, "http_proxy") ) { |
5915 | 384 mp_msg(MSGT_NETWORK,MSGL_V,"Using HTTP proxy: http://%s:%d\n", url->hostname, url->port ); |
4652 | 385 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
386 } |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
387 // Check if the http_proxy environment variable is set. |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
388 if( !strcasecmp(url->protocol, "http") ) { |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
389 char *proxy; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
390 proxy = getenv("http_proxy"); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
391 if( proxy!=NULL ) { |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
392 // We got a proxy, build the URL to use it |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
393 int len; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
394 char *new_url; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
395 URL_t *tmp_url; |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
396 URL_t *proxy_url = url_new( proxy ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
397 |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
398 if( proxy_url==NULL ) { |
5915 | 399 mp_msg(MSGT_NETWORK,MSGL_WARN,"Invalid proxy setting...Trying without proxy.\n"); |
4652 | 400 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
401 } |
9691
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
402 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
403 #ifdef HAVE_AF_INET6 |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
404 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
|
405 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
|
406 "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
|
407 return url_out; |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
408 } |
ed72c158215d
Added IPv6 support, patch by Dave Lambley <mplayer-dev-eng@dlambley.freeserve.co.uk>
bertrand
parents:
8939
diff
changeset
|
409 #endif |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
410 |
5915 | 411 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
|
412 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
|
413 new_url = malloc( len+1 ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
414 if( new_url==NULL ) { |
5915 | 415 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); |
4652 | 416 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
417 } |
5915 | 418 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
|
419 tmp_url = url_new( new_url ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
420 if( tmp_url==NULL ) { |
4652 | 421 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
422 } |
4652 | 423 url_free( url_out ); |
424 url_out = tmp_url; | |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
425 free( new_url ); |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
426 url_free( proxy_url ); |
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 } |
4652 | 429 return url_out; |
4146
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
430 } |
925046ea34ec
Added support for the environment variable http_proxy.
bertrand
parents:
4145
diff
changeset
|
431 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
432 int |
11965 | 433 http_send_request( URL_t *url, off_t pos ) { |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
434 HTTP_header_t *http_hdr; |
4121 | 435 URL_t *server_url; |
11228 | 436 char str[256]; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
437 int fd; |
4121 | 438 int ret; |
439 int proxy = 0; // Boolean | |
440 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
441 http_hdr = http_new_header(); |
4121 | 442 |
4145 | 443 if( !strcasecmp(url->protocol, "http_proxy") ) { |
4121 | 444 proxy = 1; |
445 server_url = url_new( (url->file)+1 ); | |
446 http_set_uri( http_hdr, server_url->url ); | |
447 } else { | |
448 server_url = url; | |
449 http_set_uri( http_hdr, server_url->file ); | |
450 } | |
11228 | 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 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
469 http_set_field( http_hdr, "Connection: closed"); |
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 |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
703 #ifndef 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
|
704 // Old, hacked RTP support, which works for MPEG Program Streams |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
705 // RTP streams only: |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
706 // Checking for RTP |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
707 if( !strcasecmp(url->protocol, "rtp") ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
708 if( url->port==0 ) { |
5915 | 709 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
|
710 return -1; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
711 } |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
712 return 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
713 } |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
714 #endif |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
715 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
716 // Checking for ASF |
3453
10577da4a7b1
Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents:
3424
diff
changeset
|
717 if( !strncasecmp(url->protocol, "mms", 3) ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
718 *file_format = DEMUXER_TYPE_ASF; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
719 return 0; |
903 | 720 } |
721 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
722 // HTTP based protocol |
4145 | 723 if( !strcasecmp(url->protocol, "http") || !strcasecmp(url->protocol, "http_proxy") ) { |
11965 | 724 fd = http_send_request( url, 0 ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
725 if( fd<0 ) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
726 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
727 } |
903 | 728 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
729 http_hdr = http_read_response( fd ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
730 if( http_hdr==NULL ) { |
10281 | 731 closesocket( fd ); |
3042 | 732 http_free( http_hdr ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
733 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
734 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
735 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
736 *fd_out=fd; |
8027 | 737 if( verbose>0 ) { |
4121 | 738 http_debug_hdr( http_hdr ); |
739 } | |
740 | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
741 streaming_ctrl->data = (void*)http_hdr; |
11965 | 742 |
743 // Check if we can make partial content requests and thus seek in http-streams | |
12018 | 744 if( http_hdr!=NULL && http_hdr->status_code==200 ) { |
745 char *accept_ranges; | |
746 if( (accept_ranges = http_get_field(http_hdr,"Accept-Ranges")) != NULL ) | |
747 seekable = strncmp(accept_ranges,"bytes",5)==0; | |
748 } | |
11965 | 749 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
750 // Check if the response is an ICY status_code reason_phrase |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
751 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
|
752 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
|
753 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
|
754 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
|
755 // 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
|
756 // 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
|
757 if( (field_data = http_get_field(http_hdr, "icy-name")) != NULL ) |
5915 | 758 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
|
759 if( (field_data = http_get_field(http_hdr, "icy-genre")) != NULL ) |
5915 | 760 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
|
761 if( (field_data = http_get_field(http_hdr, "icy-url")) != NULL ) |
5915 | 762 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
|
763 // 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
|
764 if( (field_data = http_get_field(http_hdr, "icy-pub")) != NULL ) |
5915 | 765 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
|
766 if( (field_data = http_get_field(http_hdr, "icy-br")) != NULL ) |
5915 | 767 mp_msg(MSGT_NETWORK,MSGL_INFO,"Bitrate: %skbit/s\n", field_data); field_data = NULL; |
12175 | 768 |
769 // If content-type == video/nsv we most likely have a winamp video stream | |
770 // otherwise it should be mp3. if there are more types consider adding mime type | |
771 // handling like later | |
12236 | 772 if ( (field_data = http_get_field(http_hdr, "content-type")) != NULL && !strcmp(field_data, "video/nsv")) |
12175 | 773 *file_format = DEMUXER_TYPE_NSV; |
774 else | |
775 *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
|
776 return 0; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
777 } |
5916 | 778 case 400: // Server Full |
779 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server is full, skipping!\n"); | |
780 return -1; | |
5892 | 781 case 401: // Service Unavailable |
5915 | 782 mp_msg(MSGT_NETWORK,MSGL_ERR,"Error: ICY-Server return service unavailable, skipping!\n"); |
5892 | 783 return -1; |
8766
50ffffd0bc18
Added the ICY 403 "Service Forbiden" error message.
bertrand
parents:
8570
diff
changeset
|
784 case 403: // Service Forbidden |
50ffffd0bc18
Added the ICY 403 "Service Forbiden" error message.
bertrand
parents:
8570
diff
changeset
|
785 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
|
786 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
|
787 case 404: // Resource Not Found |
5915 | 788 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
|
789 return -1; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
790 default: |
5915 | 791 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
|
792 return -1; |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
793 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
794 } |
5868
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
795 |
ad8124c9d462
Add some info prints to ICY code and handle return codes ICY specific, also avoid printing
atmos4
parents:
5867
diff
changeset
|
796 // Assume standard http if not ICY |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
797 switch( http_hdr->status_code ) { |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
798 case 200: // OK |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
799 // Look if we can use the Content-Type |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
800 content_type = http_get_field( http_hdr, "Content-Type" ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
801 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
|
802 char *content_length = NULL; |
5915 | 803 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
|
804 if( (content_length = http_get_field(http_hdr, "Content-Length")) != NULL) |
5915 | 805 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Length: [%s]\n", http_get_field(http_hdr, "Content-Length")); |
3042 | 806 // Check in the mime type table for a demuxer type |
807 for( i=0 ; i<(sizeof(mime_type_table)/sizeof(mime_type_table[0])) ; i++ ) { | |
808 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
|
809 *file_format = mime_type_table[i].demuxer_type; |
11965 | 810 return seekable; // for streaming_start |
3042 | 811 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
812 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
813 } |
4817
1e46f40dcd0e
Handle HTTP OK response that doesn't contain a mime-type.
bertrand
parents:
4802
diff
changeset
|
814 // 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
|
815 // we should try raw HTTP |
11965 | 816 return seekable; // for streaming_start |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
817 // Redirect |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
818 case 301: // Permanently |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
819 case 302: // Temporarily |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
820 // TODO: RFC 2616, recommand to detect infinite redirection loops |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
821 next_url = http_get_field( http_hdr, "Location" ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
822 if( next_url!=NULL ) { |
10281 | 823 closesocket( fd ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
824 url_free( url ); |
4802 | 825 streaming_ctrl->url = url = url_new( next_url ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
826 http_free( http_hdr ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
827 redirect = 1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
828 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
829 break; |
6558
b379b061ce50
Read username/password from the -user -pass command line options.
bertrand
parents:
6555
diff
changeset
|
830 case 401: // Authentication required |
6555 | 831 if( http_authenticate(http_hdr, url, &auth_retry)<0 ) return -1; |
6515 | 832 redirect = 1; |
833 break; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
834 default: |
5915 | 835 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
|
836 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
837 } |
3453
10577da4a7b1
Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents:
3424
diff
changeset
|
838 } else { |
10625
620cc649f519
ftp support. The change on connect2Server is needed bcs we need 2
albeu
parents:
10317
diff
changeset
|
839 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
|
840 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
841 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
842 } while( redirect ); |
903 | 843 |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
844 return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
845 } |
903 | 846 |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
847 int |
3042 | 848 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
|
849 //printf("streaming_bufferize\n"); |
3042 | 850 streaming_ctrl->buffer = (char*)malloc(size); |
851 if( streaming_ctrl->buffer==NULL ) { | |
5915 | 852 mp_msg(MSGT_NETWORK,MSGL_FATAL,"Memory allocation failed\n"); |
3042 | 853 return -1; |
854 } | |
855 memcpy( streaming_ctrl->buffer, buffer, size ); | |
856 streaming_ctrl->buffer_size = size; | |
3599 | 857 return size; |
3042 | 858 } |
859 | |
860 int | |
861 nop_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
862 int len=0; | |
863 //printf("nop_streaming_read\n"); | |
864 if( stream_ctrl->buffer_size!=0 ) { | |
865 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
|
866 //printf("%d bytes in buffer\n", stream_ctrl->buffer_size); |
3042 | 867 len = (size<buffer_len)?size:buffer_len; |
868 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len ); | |
869 stream_ctrl->buffer_pos += len; | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
870 //printf("buffer_pos = %d\n", stream_ctrl->buffer_pos ); |
3042 | 871 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) { |
872 free( stream_ctrl->buffer ); | |
873 stream_ctrl->buffer = NULL; | |
874 stream_ctrl->buffer_size = 0; | |
875 stream_ctrl->buffer_pos = 0; | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
876 //printf("buffer cleaned\n"); |
3042 | 877 } |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
878 //printf("read %d bytes from buffer\n", len ); |
3042 | 879 } |
880 | |
881 if( len<size ) { | |
3365 | 882 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
|
883 ret = recv( fd, buffer+len, size-len, 0 ); |
3494
fb9de639ed30
Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents:
3453
diff
changeset
|
884 if( ret<0 ) { |
5915 | 885 mp_msg(MSGT_NETWORK,MSGL_ERR,"nop_streaming_read error : %s\n",strerror(errno)); |
3365 | 886 } |
887 len += ret; | |
3042 | 888 //printf("read %d bytes from network\n", len ); |
889 } | |
890 | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
891 return len; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
892 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
893 |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
894 int |
3042 | 895 nop_streaming_seek( int fd, off_t pos, streaming_ctrl_t *stream_ctrl ) { |
896 return -1; | |
7953 | 897 // To shut up gcc warning |
898 fd++; | |
899 pos++; | |
900 stream_ctrl=NULL; | |
3042 | 901 } |
902 | |
903 int | |
904 nop_streaming_start( stream_t *stream ) { | |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
905 HTTP_header_t *http_hdr = NULL; |
12268 | 906 char *next_url=NULL; |
907 URL_t *rd_url=NULL; | |
908 int fd,ret; | |
3042 | 909 if( stream==NULL ) return -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
910 |
3042 | 911 fd = stream->fd; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
912 if( fd<0 ) { |
11965 | 913 fd = http_send_request( stream->streaming_ctrl->url, 0 ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
914 if( fd<0 ) return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
915 http_hdr = http_read_response( fd ); |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
916 if( http_hdr==NULL ) return -1; |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
917 |
903 | 918 switch( http_hdr->status_code ) { |
919 case 200: // OK | |
5915 | 920 mp_msg(MSGT_NETWORK,MSGL_V,"Content-Type: [%s]\n", http_get_field(http_hdr, "Content-Type") ); |
921 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
|
922 if( http_hdr->body_size>0 ) { |
3042 | 923 if( streaming_bufferize( stream->streaming_ctrl, http_hdr->body, http_hdr->body_size )<0 ) { |
924 http_free( http_hdr ); | |
925 return -1; | |
926 } | |
903 | 927 } |
928 break; | |
12268 | 929 // Redirect |
930 case 301: // Permanently | |
931 case 302: // Temporarily | |
932 ret=-1; | |
933 next_url = http_get_field( http_hdr, "Location" ); | |
934 | |
935 if (next_url != NULL) | |
936 rd_url=url_new(next_url); | |
937 | |
938 if (next_url != NULL && rd_url != NULL) { | |
939 mp_msg(MSGT_NETWORK,MSGL_STATUS,"Redirected: Using this url instead %s\n",next_url); | |
940 stream->streaming_ctrl->url=check4proxies(rd_url); | |
941 ret=nop_streaming_start(stream); //recursively get streaming started | |
942 } else { | |
943 mp_msg(MSGT_NETWORK,MSGL_ERR,"Redirection failed\n"); | |
944 closesocket( fd ); | |
945 fd = -1; | |
946 } | |
947 return ret; | |
948 break; | |
949 case 401: //Authorization required | |
950 case 403: //Forbidden | |
951 case 404: //Not found | |
952 case 500: //Server Error | |
903 | 953 default: |
12268 | 954 mp_msg(MSGT_NETWORK,MSGL_ERR,"Server returned code %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase ); |
10281 | 955 closesocket( fd ); |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
956 fd = -1; |
12268 | 957 return -1; |
958 break; | |
903 | 959 } |
3042 | 960 stream->fd = fd; |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
961 } else { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
962 http_hdr = (HTTP_header_t*)stream->streaming_ctrl->data; |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
963 if( http_hdr->body_size>0 ) { |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
964 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
|
965 http_free( http_hdr ); |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
966 stream->streaming_ctrl->data = NULL; |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
967 return -1; |
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 } |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
971 |
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
972 if( http_hdr ) { |
3732 | 973 http_free( http_hdr ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
974 stream->streaming_ctrl->data = NULL; |
903 | 975 } |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
976 |
3042 | 977 stream->streaming_ctrl->streaming_read = nop_streaming_read; |
978 stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
8939 | 979 stream->streaming_ctrl->prebuffer_size = 64*1024; // 64 KBytes |
3042 | 980 stream->streaming_ctrl->buffering = 1; |
981 stream->streaming_ctrl->status = streaming_playing_e; | |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
982 return 0; |
903 | 983 } |
984 | |
8570 | 985 int |
986 pnm_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
987 return pnm_read(stream_ctrl->data, buffer, size); | |
988 } | |
989 | |
990 | |
991 int | |
992 pnm_streaming_start( stream_t *stream ) { | |
993 int fd; | |
994 pnm_t *pnm; | |
995 if( stream==NULL ) return -1; | |
996 | |
997 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
|
998 stream->streaming_ctrl->url->port ? stream->streaming_ctrl->url->port : 7070,1 ); |
8570 | 999 printf("PNM:// fd=%d\n",fd); |
1000 if(fd<0) return -1; | |
1001 | |
1002 pnm = pnm_connect(fd,stream->streaming_ctrl->url->file); | |
1003 if(!pnm) return -1; | |
1004 | |
1005 stream->fd=fd; | |
1006 stream->streaming_ctrl->data=pnm; | |
1007 | |
1008 stream->streaming_ctrl->streaming_read = pnm_streaming_read; | |
1009 // stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
8939 | 1010 stream->streaming_ctrl->prebuffer_size = 8*1024; // 8 KBytes |
8570 | 1011 stream->streaming_ctrl->buffering = 1; |
1012 stream->streaming_ctrl->status = streaming_playing_e; | |
1013 return 0; | |
1014 } | |
1015 | |
1016 | |
9922 | 1017 int |
1018 realrtsp_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { | |
1019 return rtsp_session_read(stream_ctrl->data, buffer, size); | |
1020 } | |
1021 | |
1022 | |
1023 int | |
1024 realrtsp_streaming_start( stream_t *stream ) { | |
1025 int fd; | |
1026 rtsp_session_t *rtsp; | |
1027 char *mrl; | |
1028 int port; | |
10199 | 1029 int redirected, temp; |
9922 | 1030 if( stream==NULL ) return -1; |
10199 | 1031 |
1032 temp = 5; // counter so we don't get caught in infinite redirections (you never know) | |
1033 | |
1034 do { | |
1035 | |
10317 | 1036 redirected = 0; |
9922 | 1037 |
10317 | 1038 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
|
1039 port = (stream->streaming_ctrl->url->port ? stream->streaming_ctrl->url->port : 554),1 ); |
10317 | 1040 if(fd<0) return -1; |
1041 | |
1042 mrl = malloc(sizeof(char)*(strlen(stream->streaming_ctrl->url->hostname)+strlen(stream->streaming_ctrl->url->file)+16)); | |
1043 sprintf(mrl,"rtsp://%s:%i/%s",stream->streaming_ctrl->url->hostname,port,stream->streaming_ctrl->url->file); | |
1044 rtsp = rtsp_session_start(fd,&mrl, stream->streaming_ctrl->url->file, | |
1045 stream->streaming_ctrl->url->hostname, port, &redirected); | |
10199 | 1046 |
10317 | 1047 if ( redirected == 1 ) { |
1048 url_free(stream->streaming_ctrl->url); | |
1049 stream->streaming_ctrl->url = url_new(mrl); | |
1050 closesocket(fd); | |
1051 } | |
10199 | 1052 |
10317 | 1053 free(mrl); |
1054 temp--; | |
10199 | 1055 |
1056 } while( (redirected != 0) && (temp > 0) ); | |
1057 | |
9922 | 1058 if(!rtsp) return -1; |
1059 | |
1060 stream->fd=fd; | |
1061 stream->streaming_ctrl->data=rtsp; | |
1062 | |
1063 stream->streaming_ctrl->streaming_read = realrtsp_streaming_read; | |
1064 // stream->streaming_ctrl->streaming_seek = nop_streaming_seek; | |
1065 stream->streaming_ctrl->prebuffer_size = 128*1024; // 8 KBytes | |
1066 stream->streaming_ctrl->buffering = 1; | |
1067 stream->streaming_ctrl->status = streaming_playing_e; | |
1068 return 0; | |
1069 } | |
1070 | |
1071 | |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1072 #ifndef STREAMING_LIVE_DOT_COM |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1073 // Start listening on a UDP port. If multicast, join the group. |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1074 int |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1075 rtp_open_socket( URL_t *url ) { |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1076 int socket_server_fd, rxsockbufsz; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1077 int err, err_len; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1078 fd_set set; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1079 struct sockaddr_in server_address; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1080 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
|
1081 struct timeval tv; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1082 |
5915 | 1083 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
|
1084 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1085 socket_server_fd = socket(AF_INET, SOCK_DGRAM, 0); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1086 // 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
|
1087 if( socket_server_fd==-1 ) { |
6454 | 1088 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
|
1089 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1090 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1091 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1092 if( isalpha(url->hostname[0]) ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1093 struct hostent *hp =(struct hostent*)gethostbyname( url->hostname ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1094 if( hp==NULL ) { |
5915 | 1095 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
|
1096 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1097 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1098 memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1099 } else { |
10281 | 1100 #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
|
1101 #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
|
1102 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
|
1103 #else |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1104 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
|
1105 #endif |
10281 | 1106 #else |
1107 unsigned int addr = inet_addr(url->hostname); | |
1108 memcpy( (void*)&server_address.sin_addr, (void*)&addr, sizeof(addr) ); | |
1109 #endif | |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1110 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1111 server_address.sin_family=AF_INET; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1112 server_address.sin_port=htons(url->port); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1113 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1114 if( bind( socket_server_fd, (struct sockaddr*)&server_address, sizeof(server_address) )==-1 ) { |
10281 | 1115 #ifndef HAVE_WINSOCK2 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1116 if( errno!=EINPROGRESS ) { |
10281 | 1117 #else |
1118 if( WSAGetLastError() != WSAEINPROGRESS ) { | |
1119 #endif | |
6454 | 1120 mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server\n"); |
10281 | 1121 closesocket(socket_server_fd); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1122 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1123 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1124 } |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1125 |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1126 // 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
|
1127 rxsockbufsz = 240 * 1024; |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1128 if( setsockopt( socket_server_fd, SOL_SOCKET, SO_RCVBUF, &rxsockbufsz, sizeof(rxsockbufsz))) { |
6454 | 1129 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
|
1130 } |
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1131 |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1132 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
|
1133 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
|
1134 //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
|
1135 mcast.imr_interface.s_addr = 0; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1136 if( setsockopt( socket_server_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))) { |
6454 | 1137 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
|
1138 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1139 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1140 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1141 |
4553
bab3aac84143
ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents:
4302
diff
changeset
|
1142 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
|
1143 tv.tv_usec = (1 * 1000000); // 1 second timeout |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1144 FD_ZERO( &set ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1145 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
|
1146 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
|
1147 //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
|
1148 err_len = sizeof( err ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1149 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
|
1150 if( err ) { |
5915 | 1151 mp_msg(MSGT_NETWORK,MSGL_ERR,"Timeout! No data from host %s\n", url->hostname ); |
1152 mp_msg(MSGT_NETWORK,MSGL_DBG2,"Socket error: %d\n", err ); | |
10281 | 1153 closesocket(socket_server_fd); |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1154 return -1; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1155 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1156 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1157 return socket_server_fd; |
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 int |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1161 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
|
1162 return read_rtp_from_server( fd, buffer, size ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1163 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1164 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1165 int |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1166 rtp_streaming_start( stream_t *stream ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1167 streaming_ctrl_t *streaming_ctrl; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1168 int fd; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1169 |
3732 | 1170 if( stream==NULL ) return -1; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1171 streaming_ctrl = stream->streaming_ctrl; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1172 fd = stream->fd; |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1173 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1174 if( fd<0 ) { |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1175 fd = rtp_open_socket( (streaming_ctrl->url) ); |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1176 if( fd<0 ) return -1; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1177 stream->fd = fd; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1178 } |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1179 |
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1180 streaming_ctrl->streaming_read = rtp_streaming_read; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1181 streaming_ctrl->streaming_seek = nop_streaming_seek; |
8939 | 1182 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
|
1183 streaming_ctrl->buffering = 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1184 streaming_ctrl->status = streaming_playing_e; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1185 return 0; |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1186 } |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1187 #endif |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1188 |
903 | 1189 int |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1190 streaming_start(stream_t *stream, int *demuxer_type, URL_t *url) { |
7953 | 1191 int ret; |
3042 | 1192 if( stream==NULL ) return -1; |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1193 |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1194 stream->streaming_ctrl = streaming_ctrl_new(); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1195 if( stream->streaming_ctrl==NULL ) { |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1196 return -1; |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1197 } |
4652 | 1198 stream->streaming_ctrl->url = check4proxies( url ); |
12223 | 1199 |
1200 if (*demuxer_type != DEMUXER_TYPE_PLAYLIST){ | |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1201 ret = autodetectProtocol( stream->streaming_ctrl, &stream->fd, demuxer_type ); |
12223 | 1202 } else { |
1203 ret=0; | |
1204 } | |
1205 | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1206 if( ret<0 ) { |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1207 return -1; |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1208 } |
11965 | 1209 if( ret==1 ) { |
1210 stream->flags |= STREAM_SEEK; | |
1211 stream->seek = http_seek; | |
1212 } | |
1213 | |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1214 ret = -1; |
3042 | 1215 |
6642
e47d54a2cfff
Retreive the bandwidth option from the command line.
bertrand
parents:
6570
diff
changeset
|
1216 // Get the bandwidth available |
7867 | 1217 stream->streaming_ctrl->bandwidth = network_bandwidth; |
6642
e47d54a2cfff
Retreive the bandwidth option from the command line.
bertrand
parents:
6570
diff
changeset
|
1218 |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1219 #ifndef STREAMING_LIVE_DOT_COM |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1220 // For RTP streams, we usually don't know the stream type until we open it. |
4121 | 1221 if( !strcasecmp( stream->streaming_ctrl->url->protocol, "rtp")) { |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
1222 if(stream->fd >= 0) { |
10281 | 1223 if(closesocket(stream->fd) < 0) |
5915 | 1224 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
|
1225 } |
879a668ee540
various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents:
3732
diff
changeset
|
1226 stream->fd = -1; |
4072
eac2948c00d4
Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents:
4046
diff
changeset
|
1227 ret = rtp_streaming_start( stream ); |
4046
f732854e3d16
Kept the HTTP connection open after autodetect, so
bertrand
parents:
4041
diff
changeset
|
1228 } else |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1229 #endif |
8570 | 1230 |
1231 if( !strcasecmp( stream->streaming_ctrl->url->protocol, "pnm")) { | |
1232 stream->fd = -1; | |
1233 ret = pnm_streaming_start( stream ); | |
1234 } else | |
1235 | |
9922 | 1236 if( (!strcasecmp( stream->streaming_ctrl->url->protocol, "rtsp")) && |
1237 (*demuxer_type == DEMUXER_TYPE_REAL)) { | |
1238 stream->fd = -1; | |
12206
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1239 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
|
1240 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
|
1241 #ifdef STREAMING_LIVE_DOT_COM |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1242 *demuxer_type = DEMUXER_TYPE_RTP; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1243 goto try_livedotcom; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1244 #else |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1245 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
|
1246 return -1; |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1247 #endif |
d572c605f665
Try Real rtsp, then live.com on every rtsp stream (remove extension
rtognimp
parents:
12175
diff
changeset
|
1248 } |
9922 | 1249 } else |
1250 | |
3686
bed6226ffb46
RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents:
3604
diff
changeset
|
1251 // 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
|
1252 try_livedotcom: |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1253 switch( *demuxer_type ) { |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1254 case DEMUXER_TYPE_ASF: |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1255 // Send the appropriate HTTP request |
3042 | 1256 // Need to filter the network stream. |
1257 // ASF raw stream is encapsulated. | |
9749 | 1258 // It can also be a playlist (redirector) |
1259 // so we need to pass demuxer_type too | |
1260 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
|
1261 if( ret<0 ) { |
5915 | 1262 mp_msg(MSGT_NETWORK,MSGL_ERR,"asf_streaming_start failed\n"); |
12274 | 1263 mp_msg(MSGT_NETWORK,MSGL_STATUS,"Check if this is a playlist which requires -playlist option\nExample: mplayer -playlist <url>\n"); |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1264 } |
903 | 1265 break; |
6910
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1266 #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
|
1267 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
|
1268 // 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
|
1269 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
|
1270 if( ret<0 ) { |
7007 | 1271 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
|
1272 } |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1273 break; |
1a747aee653b
applied live.com streaming patch (-sdp and rtsp:// support) by Ross Finlayson <finlayson@live.com>
arpi
parents:
6642
diff
changeset
|
1274 #endif |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1275 case DEMUXER_TYPE_MPEG_ES: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1276 case DEMUXER_TYPE_MPEG_PS: |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1277 case DEMUXER_TYPE_AVI: |
3042 | 1278 case DEMUXER_TYPE_MOV: |
4729
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1279 case DEMUXER_TYPE_VIVO: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1280 case DEMUXER_TYPE_FLI: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1281 case DEMUXER_TYPE_REAL: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1282 case DEMUXER_TYPE_Y4M: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1283 case DEMUXER_TYPE_FILM: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1284 case DEMUXER_TYPE_ROQ: |
f51bd827ed1c
fixed MP3 ICY detection, return detected file format for open_stream
alex
parents:
4652
diff
changeset
|
1285 case DEMUXER_TYPE_AUDIO: |
8114
ba66375adb6f
Added OGG streaming support, patch from Balatoni Denes <pnis@coder.hu>
bertrand
parents:
8027
diff
changeset
|
1286 case DEMUXER_TYPE_OGG: |
4783 | 1287 case DEMUXER_TYPE_PLAYLIST: |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1288 case DEMUXER_TYPE_UNKNOWN: |
12175 | 1289 case DEMUXER_TYPE_NSV: |
3042 | 1290 // Generic start, doesn't need to filter |
1291 // the network stream, it's a raw stream | |
1292 ret = nop_streaming_start( stream ); | |
3604
6bd312199a75
If the demuxer type is unknown it will start an http streaming.
bertrand
parents:
3599
diff
changeset
|
1293 if( ret<0 ) { |
5915 | 1294 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
|
1295 } |
903 | 1296 break; |
1297 default: | |
5915 | 1298 mp_msg(MSGT_NETWORK,MSGL_ERR,"Unable to detect the streaming type\n"); |
3042 | 1299 ret = -1; |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1300 } |
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1301 |
3042 | 1302 if( ret<0 ) { |
4251
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1303 streaming_ctrl_free( stream->streaming_ctrl ); |
05affdf4bdcd
Moved network related code from open.c to network.c
bertrand
parents:
4236
diff
changeset
|
1304 stream->streaming_ctrl = NULL; |
4652 | 1305 } else if( stream->streaming_ctrl->buffering ) { |
7881
aba9301ed3c4
allow cache to be disabled (-nocache should override cachesize autodetection
arpi
parents:
7867
diff
changeset
|
1306 if(stream_cache_size<0) { |
6555 | 1307 // 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
|
1308 // buffer in KBytes, *5 because the prefill is 20% of the buffer. |
7867 | 1309 stream_cache_size = (stream->streaming_ctrl->prebuffer_size/1024)*5; |
8939 | 1310 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
|
1311 } |
7867 | 1312 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
|
1313 } |
6032 | 1314 |
3042 | 1315 return ret; |
903 | 1316 } |
1317 | |
1318 int | |
3042 | 1319 streaming_stop( stream_t *stream ) { |
1320 stream->streaming_ctrl->status = streaming_stopped_e; | |
999
92833c9472e8
Continue implementation of the network streaming part.
bertrand
parents:
903
diff
changeset
|
1321 return 0; |
903 | 1322 } |