annotate libmpdemux/network.c @ 15148:067f10ad6538

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