annotate libmpdemux/network.c @ 5623:cdf5b88bdaa8

Most of informational printk's ifdef'd. Now without debug only initial and error messages go to syslog. eyck added to list of people who messed with this file(?).
author eyck
date Sun, 14 Apr 2002 23:14:26 +0000
parents 41d2da3bd082
children bcaf7af53056
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
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
19 #include "stream.h"
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
20 #include "demuxer.h"
4289
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
21 #include "../cfgparser.h"
4825
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
22 #include "mpdemux.h"
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
23
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
24 #include "network.h"
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
25 #include "http.h"
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
26 #include "url.h"
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
27 #include "asf.h"
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
28 #include "rtp.h"
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
29
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
30 extern int verbose;
4289
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
31 extern m_config_t *mconfig;
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
32
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
33 static struct {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
34 char *mime_type;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
35 int demuxer_type;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
36 } mime_type_table[] = {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
37 // 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
38 { "audio/mpeg", DEMUXER_TYPE_AUDIO },
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
39 // MPEG streaming
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
40 { "video/mpeg", DEMUXER_TYPE_MPEG_PS },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
41 // AVI ??? => video/x-msvideo
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
42 { "video/x-msvideo", DEMUXER_TYPE_AVI },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
43 // MOV => video/quicktime
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
44 { "video/quicktime", DEMUXER_TYPE_MOV },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
45 // ASF
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
46 { "audio/x-ms-wax", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
47 { "audio/x-ms-wma", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
48 { "video/x-ms-asf", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
49 { "video/x-ms-afs", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
50 { "video/x-ms-wvx", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
51 { "video/x-ms-wmv", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
52 { "video/x-ms-wma", DEMUXER_TYPE_ASF },
4783
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
53 // Playlists
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
54 { "audio/x-scpls", DEMUXER_TYPE_PLAYLIST },
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
55 { "audio/x-mpegurl", DEMUXER_TYPE_PLAYLIST },
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
56 { "audio/x-pls", DEMUXER_TYPE_PLAYLIST }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
57 };
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
58
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
59 static struct {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
60 char *extension;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
61 int demuxer_type;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
62 } extensions_table[] = {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
63 { "mpeg", DEMUXER_TYPE_MPEG_PS },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
64 { "mpg", DEMUXER_TYPE_MPEG_PS },
3072
8dbc1954e49b added some new types
alex
parents: 3042
diff changeset
65 { "mpe", DEMUXER_TYPE_MPEG_ES },
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
66 { "avi", DEMUXER_TYPE_AVI },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
67 { "mov", DEMUXER_TYPE_MOV },
3072
8dbc1954e49b added some new types
alex
parents: 3042
diff changeset
68 { "qt", DEMUXER_TYPE_MOV },
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
69 { "asx", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
70 { "asf", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
71 { "wmv", DEMUXER_TYPE_ASF },
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
72 { "wma", DEMUXER_TYPE_ASF },
3072
8dbc1954e49b added some new types
alex
parents: 3042
diff changeset
73 { "viv", DEMUXER_TYPE_VIVO },
4236
0c809c541aa1 added .rm (real) and .y4m (yuv4mpeg)
alex
parents: 4146
diff changeset
74 { "rm", DEMUXER_TYPE_REAL },
0c809c541aa1 added .rm (real) and .y4m (yuv4mpeg)
alex
parents: 4146
diff changeset
75 { "y4m", DEMUXER_TYPE_Y4M },
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
76 { "mp3", DEMUXER_TYPE_AUDIO },
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
77 { "wav", DEMUXER_TYPE_AUDIO },
4783
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
78 { "pls", DEMUXER_TYPE_PLAYLIST },
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
79 { "m3u", DEMUXER_TYPE_PLAYLIST }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
80 };
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
81
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
82 streaming_ctrl_t *
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
83 streaming_ctrl_new( ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
84 streaming_ctrl_t *streaming_ctrl;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
85 streaming_ctrl = (streaming_ctrl_t*)malloc(sizeof(streaming_ctrl_t));
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
86 if( streaming_ctrl==NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
87 printf("Failed to allocate memory\n");
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
88 return NULL;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
89 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
90 memset( streaming_ctrl, 0, sizeof(streaming_ctrl_t) );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
91 return streaming_ctrl;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
92 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
93
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
94 void
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
95 streaming_ctrl_free( streaming_ctrl_t *streaming_ctrl ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
96 if( streaming_ctrl==NULL ) return;
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
97 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
98 if( streaming_ctrl->buffer ) free( streaming_ctrl->buffer );
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
99 if( streaming_ctrl->data ) free( streaming_ctrl->data );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
100 free( streaming_ctrl );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
101 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
102
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
103 int
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
104 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
105 struct rtpheader rh;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
106 char *data;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
107 int len;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
108 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
109 static unsigned short sequence;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
110
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
111 if( buffer==NULL || length<0 ) return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
112
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
113 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
114 if( got_first && rh.b.sequence != (unsigned short)(sequence+1) )
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
115 printf("RTP packet sequence error! Expected: %d, received: %d\n",
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
116 sequence+1, rh.b.sequence);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
117 got_first = 1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
118 sequence = rh.b.sequence;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
119 memcpy(buffer, data, len);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
120 return(len);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
121 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
122
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
123 // Connect to a server using a TCP connection
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
124 int
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
125 connect2Server(char *host, int port) {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
126 int socket_server_fd;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
127 int err, err_len;
4825
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
128 int ret,count = 0;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
129 fd_set set;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
130 struct timeval tv;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
131 struct sockaddr_in server_address;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
132
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
133 printf("Connecting to server %s:%d ...\n", host, port );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
134
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
135 socket_server_fd = socket(AF_INET, SOCK_STREAM, 0);
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
136 if( socket_server_fd==-1 ) {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
137 perror("Failed to create socket");
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
138 return -1;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
139 }
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
140
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
141 if( isalpha(host[0]) ) {
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
142 struct hostent *hp;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
143 hp=(struct hostent*)gethostbyname( host );
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
144 if( hp==NULL ) {
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
145 printf("Counldn't resolve name: %s\n", host);
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
146 return -1;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
147 }
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
148 memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length );
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
149 } else {
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
150 inet_pton(AF_INET, host, &server_address.sin_addr);
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
151 }
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
152 server_address.sin_family=AF_INET;
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
153 server_address.sin_port=htons(port);
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
154
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
155 // Turn the socket as non blocking so we can timeout on the connection
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
156 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK );
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
157 if( connect( socket_server_fd, (struct sockaddr*)&server_address, sizeof(server_address) )==-1 ) {
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
158 if( errno!=EINPROGRESS ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
159 perror("Failed to connect to server");
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
160 close(socket_server_fd);
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
161 return -1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
162 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
163 }
4825
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
164 tv.tv_sec = 0;
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
165 tv.tv_usec = 500000;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
166 FD_ZERO( &set );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
167 FD_SET( socket_server_fd, &set );
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
168 // 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
169 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) {
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
170 if( ret<0 ) perror("select failed");
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
171 else if(ret > 0) break;
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
172 else if(count > 15 || mpdemux_check_interrupt(500)) {
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
173 if(count > 15)
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
174 printf("Connection timeout\n");
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
175 else
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
176 printf("Connection interuppted by user\n");
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
177 return -1;
4825
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
178 }
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
179 count++;
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
180 FD_ZERO( &set );
41d2da3bd082 Make blocking call in libmpdemux interuptable (only with new input,
albeu
parents: 4817
diff changeset
181 FD_SET( socket_server_fd, &set );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
182 }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
183
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
184 // Turn back the socket as blocking
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
185 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK );
3494
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
186 // Check if there were any error
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
187 err_len = sizeof(int);
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
188 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
189 if(ret < 0) {
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
190 printf("getsockopt failed : %s\n",strerror(errno));
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
191 return -1;
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
192 }
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
193 if(err > 0) {
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
194 printf("Connect error : %s\n",strerror(err));
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
195 return -1;
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
196 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
197 return socket_server_fd;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
198 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
199
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
200 URL_t*
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
201 check4proxies( URL_t *url ) {
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
202 URL_t *url_out = NULL;
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
203 if( url==NULL ) return NULL;
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
204 url_out = url_new( url->url );
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
205 if( !strcasecmp(url->protocol, "http_proxy") ) {
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
206 printf("Using HTTP proxy: http://%s:%d\n", url->hostname, url->port );
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
207 return url_out;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
208 }
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
209 // Check if the http_proxy environment variable is set.
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
210 if( !strcasecmp(url->protocol, "http") ) {
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
211 char *proxy;
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
212 proxy = getenv("http_proxy");
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
213 if( proxy!=NULL ) {
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
214 // We got a proxy, build the URL to use it
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
215 int len;
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
216 char *new_url;
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
217 URL_t *tmp_url;
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
218 URL_t *proxy_url = url_new( proxy );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
219
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
220 if( proxy_url==NULL ) {
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
221 printf("Invalid proxy setting...Trying without proxy.\n");
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
222 return url_out;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
223 }
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
224
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
225 printf("Using HTTP proxy: %s\n", proxy_url->url );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
226 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
227 new_url = malloc( len+1 );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
228 if( new_url==NULL ) {
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
229 printf("Memory allocation failed\n");
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
230 return url_out;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
231 }
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
232 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
233 tmp_url = url_new( new_url );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
234 if( tmp_url==NULL ) {
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
235 return url_out;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
236 }
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
237 url_free( url_out );
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
238 url_out = tmp_url;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
239 free( new_url );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
240 url_free( proxy_url );
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
241 }
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
242 }
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
243 return url_out;
4146
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
244 }
925046ea34ec Added support for the environment variable http_proxy.
bertrand
parents: 4145
diff changeset
245
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
246 int
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
247 http_send_request( URL_t *url ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
248 HTTP_header_t *http_hdr;
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
249 URL_t *server_url;
3585
cb985ea11ed5 Added the Host field in the HTTP request.
bertrand
parents: 3494
diff changeset
250 char str[80];
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
251 int fd;
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
252 int ret;
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
253 int proxy = 0; // Boolean
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
254
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
255 http_hdr = http_new_header();
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
256
4145
c66fddd8867c Changed the proxy protocol to http_proxy.
bertrand
parents: 4121
diff changeset
257 if( !strcasecmp(url->protocol, "http_proxy") ) {
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
258 proxy = 1;
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
259 server_url = url_new( (url->file)+1 );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
260 http_set_uri( http_hdr, server_url->url );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
261 } else {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
262 server_url = url;
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
263 http_set_uri( http_hdr, server_url->file );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
264 }
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
265 snprintf(str, 80, "Host: %s", server_url->hostname );
3585
cb985ea11ed5 Added the Host field in the HTTP request.
bertrand
parents: 3494
diff changeset
266 http_set_field( http_hdr, str);
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
267 http_set_field( http_hdr, "User-Agent: MPlayer");
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
268 http_set_field( http_hdr, "Connection: closed");
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
269 if( http_build_request( http_hdr )==NULL ) {
841
c906b7600fc6 Included "netdb.h" file needed.
bertrand
parents: 833
diff changeset
270 return -1;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
271 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
272
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
273 if( proxy ) {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
274 if( url->port==0 ) url->port = 8080; // Default port for the proxy server
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
275 fd = connect2Server( url->hostname, url->port );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
276 url_free( server_url );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
277 } else {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
278 if( server_url->port==0 ) server_url->port = 80; // Default port for the web server
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
279 fd = connect2Server( server_url->hostname, server_url->port );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
280 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
281 if( fd<0 ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
282 return -1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
283 }
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
284 if( verbose ) {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
285 printf("Request: [%s]\n", http_hdr->buffer );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
286 }
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
287
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
288 ret = write( fd, http_hdr->buffer, http_hdr->buffer_size );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
289 if( ret!=http_hdr->buffer_size ) {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
290 printf("Error while sending HTTP request: didn't sent all the request\n");
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
291 return -1;
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
292 }
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
293
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
294 http_free( http_hdr );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
295
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
296 return fd;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
297 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
298
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
299 HTTP_header_t *
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
300 http_read_response( int fd ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
301 HTTP_header_t *http_hdr;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
302 char response[BUFFER_SIZE];
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
303 int i;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
304
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
305 http_hdr = http_new_header();
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
306 if( http_hdr==NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
307 return NULL;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
308 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
309
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
310 do {
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
311 i = read( fd, response, BUFFER_SIZE );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
312 if( i<0 ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
313 printf("Read failed\n");
3365
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
314 http_free( http_hdr );
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
315 return NULL;
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
316 }
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
317 if( i==0 ) {
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
318 printf("http_read_response read 0 -ie- EOF\n");
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
319 http_free( http_hdr );
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
320 return NULL;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
321 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
322 http_response_append( http_hdr, response, i );
2489
0ecc1b4f7cf8 Added ASF http server streaming (Not mms streaming).
bertrand
parents: 2310
diff changeset
323 } while( !http_is_header_entire( http_hdr ) );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
324 http_response_parse( http_hdr );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
325 return http_hdr;
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
326 }
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents:
diff changeset
327
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
328 // 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
329 // we might be able to guess the streaming type.
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
330 int
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
331 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
332 HTTP_header_t *http_hdr;
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
333 unsigned int i;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
334 int fd=-1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
335 int redirect;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
336 char *extension;
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
337 char *content_type;
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
338 char *next_url;
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
339
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
340 URL_t *url = streaming_ctrl->url;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
341 *file_format = DEMUXER_TYPE_UNKNOWN;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
342
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
343 do {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
344 *fd_out = -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
345 next_url = NULL;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
346 extension = NULL;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
347 content_type = NULL;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
348 redirect = 0;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
349
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
350 if( url==NULL ) {
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
351 return -1;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
352 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
353
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
354 // Get the extension of the file if present
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
355 if( url->file!=NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
356 for( i=strlen(url->file) ; i>0 ; i-- ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
357 if( url->file[i]=='.' ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
358 extension=(url->file)+i+1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
359 break;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
360 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
361 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
362 }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
363 extension=NULL;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
364 if( extension!=NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
365 printf("Extension: %s\n", extension );
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
366 // Look for the extension in the extensions table
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
367 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
368 if( !strcasecmp(extension, extensions_table[i].extension) ) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
369 *file_format = extensions_table[i].demuxer_type;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
370 return 0;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
371 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
372 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
373 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
374
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
375 // Checking for RTSP
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
376 if( !strcasecmp(url->protocol, "rtsp") ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
377 printf("RTSP protocol not yet implemented!\n");
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
378 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
379 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
380
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
381 // Checking for RTP
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
382 if( !strcasecmp(url->protocol, "rtp") ) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
383 if( url->port==0 ) {
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
384 printf("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
385 return -1;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
386 }
4553
bab3aac84143 ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents: 4302
diff changeset
387 return 0;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
388 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
389
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
390 // Checking for ASF
3453
10577da4a7b1 Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents: 3424
diff changeset
391 if( !strncasecmp(url->protocol, "mms", 3) ) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
392 *file_format = DEMUXER_TYPE_ASF;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
393 return 0;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
394 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
395
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
396 // HTTP based protocol
4145
c66fddd8867c Changed the proxy protocol to http_proxy.
bertrand
parents: 4121
diff changeset
397 if( !strcasecmp(url->protocol, "http") || !strcasecmp(url->protocol, "http_proxy") ) {
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
398 fd = http_send_request( url );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
399 if( fd<0 ) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
400 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
401 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
402
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
403 http_hdr = http_read_response( fd );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
404 if( http_hdr==NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
405 close( fd );
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
406 http_free( http_hdr );
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
407 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
408 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
409
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
410 *fd_out=fd;
4121
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
411 if( verbose ) {
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
412 http_debug_hdr( http_hdr );
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
413 }
a71d4ffc6c97 Added proxy support.
bertrand
parents: 4072
diff changeset
414
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
415 streaming_ctrl->data = (void*)http_hdr;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
416
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
417 // Check if the response is an ICY status_code reason_phrase
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
418 if( !strcasecmp(http_hdr->protocol, "ICY") ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
419 // Ok, we have detected an mp3 streaming
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
420 *file_format = DEMUXER_TYPE_AUDIO;
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
421 return 0;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
422 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
423
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
424 switch( http_hdr->status_code ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
425 case 200: // OK
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
426 // Look if we can use the Content-Type
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
427 content_type = http_get_field( http_hdr, "Content-Type" );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
428 if( content_type!=NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
429 printf("Content-Type: [%s]\n", content_type );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
430 printf("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
431 // Check in the mime type table for a demuxer type
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
432 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
433 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
434 *file_format = mime_type_table[i].demuxer_type;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
435 return 0;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
436 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
437 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
438 }
4817
1e46f40dcd0e Handle HTTP OK response that doesn't contain a mime-type.
bertrand
parents: 4802
diff changeset
439 // 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
440 // we should try raw HTTP
1e46f40dcd0e Handle HTTP OK response that doesn't contain a mime-type.
bertrand
parents: 4802
diff changeset
441 return 0;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
442 // Redirect
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
443 case 301: // Permanently
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
444 case 302: // Temporarily
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
445 // TODO: RFC 2616, recommand to detect infinite redirection loops
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
446 next_url = http_get_field( http_hdr, "Location" );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
447 if( next_url!=NULL ) {
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
448 close( fd );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
449 url_free( url );
4802
9c06b312ced6 Finnaly figured out this little long living bug
albeu
parents: 4783
diff changeset
450 streaming_ctrl->url = url = url_new( next_url );
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
451 http_free( http_hdr );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
452 redirect = 1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
453 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
454 break;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
455 default:
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
456 printf("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
457 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
458 }
3453
10577da4a7b1 Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents: 3424
diff changeset
459 } else {
10577da4a7b1 Added a data field in the streaming_ctrl_t struct, to store any
bertrand
parents: 3424
diff changeset
460 printf("Unknown protocol '%s'\n", url->protocol );
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
461 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
462 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
463 } while( redirect );
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
464
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
465 return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
466 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
467
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
468 int
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
469 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
470 //printf("streaming_bufferize\n");
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
471 streaming_ctrl->buffer = (char*)malloc(size);
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
472 if( streaming_ctrl->buffer==NULL ) {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
473 printf("Memory allocation failed\n");
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
474 return -1;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
475 }
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
476 memcpy( streaming_ctrl->buffer, buffer, size );
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
477 streaming_ctrl->buffer_size = size;
3599
2141db140d84 nop_steraming fixed
arpi
parents: 3585
diff changeset
478 return size;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
479 }
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
480
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
481 int
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
482 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
483 int len=0;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
484 //printf("nop_streaming_read\n");
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
485 if( stream_ctrl->buffer_size!=0 ) {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
486 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
487 //printf("%d bytes in buffer\n", stream_ctrl->buffer_size);
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
488 len = (size<buffer_len)?size:buffer_len;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
489 memcpy( buffer, (stream_ctrl->buffer)+(stream_ctrl->buffer_pos), len );
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
490 stream_ctrl->buffer_pos += len;
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
491 //printf("buffer_pos = %d\n", stream_ctrl->buffer_pos );
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
492 if( stream_ctrl->buffer_pos>=stream_ctrl->buffer_size ) {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
493 free( stream_ctrl->buffer );
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
494 stream_ctrl->buffer = NULL;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
495 stream_ctrl->buffer_size = 0;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
496 stream_ctrl->buffer_pos = 0;
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
497 //printf("buffer cleaned\n");
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
498 }
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
499 //printf("read %d bytes from buffer\n", len );
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
500 }
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
501
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
502 if( len<size ) {
3365
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
503 int ret;
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
504 ret = read( fd, buffer+len, size-len );
3494
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
505 if( ret<0 ) {
fb9de639ed30 Applied the patch from Alban Bedel <albeu@free.fr>.
bertrand
parents: 3453
diff changeset
506 printf("nop_streaming_read error : %s\n",strerror(errno));
3365
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
507 }
eb1c24557dad Checked the return values on read.
bertrand
parents: 3072
diff changeset
508 len += ret;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
509 //printf("read %d bytes from network\n", len );
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
510 }
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
511
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
512 return len;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
513 }
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
514
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
515 int
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
516 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
517 return -1;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
518 }
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
519
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
520 int
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
521 nop_streaming_start( stream_t *stream ) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
522 HTTP_header_t *http_hdr = NULL;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
523 int fd;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
524 if( stream==NULL ) return -1;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
525
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
526 fd = stream->fd;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
527 if( fd<0 ) {
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
528 fd = http_send_request( stream->streaming_ctrl->url );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
529 if( fd<0 ) return -1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
530 http_hdr = http_read_response( fd );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
531 if( http_hdr==NULL ) return -1;
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
532
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
533 switch( http_hdr->status_code ) {
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
534 case 200: // OK
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
535 printf("Content-Type: [%s]\n", http_get_field(http_hdr, "Content-Type") );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
536 printf("Content-Length: [%s]\n", http_get_field(http_hdr, "Content-Length") );
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
537 if( http_hdr->body_size>0 ) {
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
538 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
539 http_free( http_hdr );
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
540 return -1;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
541 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
542 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
543 break;
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
544 default:
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
545 printf("Server return %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase );
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
546 close( fd );
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
547 fd = -1;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
548 }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
549 stream->fd = fd;
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
550 } else {
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
551 http_hdr = (HTTP_header_t*)stream->streaming_ctrl->data;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
552 if( http_hdr->body_size>0 ) {
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
553 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
554 http_free( http_hdr );
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
555 stream->streaming_ctrl->data = NULL;
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
556 return -1;
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
557 }
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
558 }
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
559 }
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
560
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
561 if( http_hdr ) {
3732
837ed2f1ed5e possible uninit pointer free()'d
pl
parents: 3686
diff changeset
562 http_free( http_hdr );
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
563 stream->streaming_ctrl->data = NULL;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
564 }
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
565
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
566 stream->streaming_ctrl->streaming_read = nop_streaming_read;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
567 stream->streaming_ctrl->streaming_seek = nop_streaming_seek;
4730
330462dd5569 Changed the default prefill cache value for raw network input stream.
bertrand
parents: 4729
diff changeset
568 stream->streaming_ctrl->prebuffer_size = 8192; // KBytes
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
569 stream->streaming_ctrl->buffering = 1;
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
570 stream->streaming_ctrl->status = streaming_playing_e;
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
571 return 0;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
572 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
573
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
574 // Start listening on a UDP port. If multicast, join the group.
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
575 int
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
576 rtp_open_socket( URL_t *url ) {
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
577 int socket_server_fd, rxsockbufsz;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
578 int err, err_len;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
579 fd_set set;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
580 struct sockaddr_in server_address;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
581 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
582 struct timeval tv;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
583
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
584 printf("Listening for traffic on %s:%d ...\n", url->hostname, url->port );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
585
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
586 socket_server_fd = socket(AF_INET, SOCK_DGRAM, 0);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
587 // 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
588 if( socket_server_fd==-1 ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
589 perror("Failed to create socket");
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
590 return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
591 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
592
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
593 if( isalpha(url->hostname[0]) ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
594 struct hostent *hp =(struct hostent*)gethostbyname( url->hostname );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
595 if( hp==NULL ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
596 printf("Counldn't resolve name: %s\n", url->hostname);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
597 return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
598 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
599 memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
600 } else {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
601 inet_pton(AF_INET, url->hostname, &server_address.sin_addr);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
602 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
603 server_address.sin_family=AF_INET;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
604 server_address.sin_port=htons(url->port);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
605
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
606 if( bind( socket_server_fd, (struct sockaddr*)&server_address, sizeof(server_address) )==-1 ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
607 if( errno!=EINPROGRESS ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
608 perror("Failed to connect to server");
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
609 close(socket_server_fd);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
610 return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
611 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
612 }
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
613
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
614 // 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
615 rxsockbufsz = 240 * 1024;
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
616 if( setsockopt( socket_server_fd, SOL_SOCKET, SO_RCVBUF, &rxsockbufsz, sizeof(rxsockbufsz))) {
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
617 perror("Couldn't set receive socket buffer size");
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
618 }
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
619
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
620 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
621 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
622 //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
623 mcast.imr_interface.s_addr = 0;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
624 if( setsockopt( socket_server_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcast, sizeof(mcast))) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
625 perror("IP_ADD_MEMBERSHIP failed (do you have multicasting enabled in your kernel?)");
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
626 return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
627 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
628 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
629
4553
bab3aac84143 ehh. i forgot to commit this patch: fix RTP streaming. patch by Dave Chapman <dave@dchapman.com>
arpi
parents: 4302
diff changeset
630 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
631 tv.tv_usec = (1 * 1000000); // 1 second timeout
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
632 FD_ZERO( &set );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
633 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
634 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
635 //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
636 err_len = sizeof( err );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
637 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
638 if( err ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
639 printf("Timeout! No data from host %s\n", url->hostname );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
640 printf("Socket error: %d\n", err );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
641 close(socket_server_fd);
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
642 return -1;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
643 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
644 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
645 return socket_server_fd;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
646 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
647
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
648 int
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
649 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
650 return read_rtp_from_server( fd, buffer, size );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
651 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
652
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
653 int
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
654 rtp_streaming_start( stream_t *stream ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
655 streaming_ctrl_t *streaming_ctrl;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
656 int fd;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
657
3732
837ed2f1ed5e possible uninit pointer free()'d
pl
parents: 3686
diff changeset
658 if( stream==NULL ) return -1;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
659 streaming_ctrl = stream->streaming_ctrl;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
660 fd = stream->fd;
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
661
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
662 if( fd<0 ) {
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
663 fd = rtp_open_socket( (streaming_ctrl->url) );
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
664 if( fd<0 ) return -1;
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
665 stream->fd = fd;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
666 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
667
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
668 streaming_ctrl->streaming_read = rtp_streaming_read;
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
669 streaming_ctrl->streaming_seek = nop_streaming_seek;
4289
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
670 streaming_ctrl->prebuffer_size = 4096; // KBytes
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
671 streaming_ctrl->buffering = 0;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
672 streaming_ctrl->status = streaming_playing_e;
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
673 return 0;
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
674 }
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
675
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
676 int
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
677 streaming_start(stream_t *stream, int *demuxer_type, URL_t *url) {
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
678 int ret;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
679 if( stream==NULL ) return -1;
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
680
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
681 stream->streaming_ctrl = streaming_ctrl_new();
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
682 if( stream->streaming_ctrl==NULL ) {
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
683 return -1;
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
684 }
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
685 stream->streaming_ctrl->url = check4proxies( url );
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
686 ret = autodetectProtocol( stream->streaming_ctrl, &stream->fd, demuxer_type );
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
687 if( ret<0 ) {
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
688 return -1;
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
689 }
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
690 ret = -1;
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
691
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
692 // 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
693 if( !strcasecmp( stream->streaming_ctrl->url->protocol, "rtp")) {
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
694 if(stream->fd >= 0) {
4041
879a668ee540 various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents: 3732
diff changeset
695 if(close(stream->fd) < 0)
879a668ee540 various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents: 3732
diff changeset
696 printf("streaming_start : Closing socket %d failed %s\n",stream->fd,strerror(errno));
879a668ee540 various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents: 3732
diff changeset
697 }
879a668ee540 various small streaming fixes by Alban Bedel <albeu@free.fr>
arpi
parents: 3732
diff changeset
698 stream->fd = -1;
4072
eac2948c00d4 Applied RTP patch from Brian Kuschak <bkuschak@yahoo.com>
bertrand
parents: 4046
diff changeset
699 ret = rtp_streaming_start( stream );
4046
f732854e3d16 Kept the HTTP connection open after autodetect, so
bertrand
parents: 4041
diff changeset
700 } else
3686
bed6226ffb46 RTP support patch by Brian Kuschak <bkuschak@yahoo.com>
arpi
parents: 3604
diff changeset
701 // For connection-oriented streams, we can usually determine the streaming type.
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
702 switch( *demuxer_type ) {
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
703 case DEMUXER_TYPE_ASF:
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
704 // Send the appropriate HTTP request
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
705 // Need to filter the network stream.
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
706 // ASF raw stream is encapsulated.
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
707 ret = asf_streaming_start( stream );
3604
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
708 if( ret<0 ) {
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
709 printf("asf_streaming_start failed\n");
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
710 }
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
711 break;
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
712 case DEMUXER_TYPE_MPEG_ES:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
713 case DEMUXER_TYPE_MPEG_PS:
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
714 case DEMUXER_TYPE_AVI:
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
715 case DEMUXER_TYPE_MOV:
4729
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
716 case DEMUXER_TYPE_VIVO:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
717 case DEMUXER_TYPE_FLI:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
718 case DEMUXER_TYPE_REAL:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
719 case DEMUXER_TYPE_Y4M:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
720 case DEMUXER_TYPE_FILM:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
721 case DEMUXER_TYPE_ROQ:
f51bd827ed1c fixed MP3 ICY detection, return detected file format for open_stream
alex
parents: 4652
diff changeset
722 case DEMUXER_TYPE_AUDIO:
4783
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
723 case DEMUXER_TYPE_PLAYLIST:
3604
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
724 case DEMUXER_TYPE_UNKNOWN:
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
725 // Generic start, doesn't need to filter
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
726 // the network stream, it's a raw stream
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
727 ret = nop_streaming_start( stream );
3604
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
728 if( ret<0 ) {
4289
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
729 printf("nop_streaming_start failed\n");
3604
6bd312199a75 If the demuxer type is unknown it will start an http streaming.
bertrand
parents: 3599
diff changeset
730 }
4783
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
731 if((*demuxer_type) == DEMUXER_TYPE_PLAYLIST)
17f29765ea77 Support for retriving mp3 playlist from the network
albeu
parents: 4730
diff changeset
732 stream->type = STREAMTYPE_PLAYLIST;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
733 break;
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
734 default:
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
735 printf("Unable to detect the streaming type\n");
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
736 ret = -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
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
739 if( ret<0 ) {
4251
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
740 streaming_ctrl_free( stream->streaming_ctrl );
05affdf4bdcd Moved network related code from open.c to network.c
bertrand
parents: 4236
diff changeset
741 stream->streaming_ctrl = NULL;
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
742 } else if( stream->streaming_ctrl->buffering ) {
4302
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
743 int cache_size = 0;
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
744 int ret, val;
4293
1b6f6519b037 Add a check to not set the cache size if the user alredy set it.
albeu
parents: 4289
diff changeset
745 ret = m_config_is_option_set(mconfig,"cache");
1b6f6519b037 Add a check to not set the cache size if the user alredy set it.
albeu
parents: 4289
diff changeset
746 if(ret < 0) {
4302
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
747 printf("Unable to know if cache size option was set\n");
4293
1b6f6519b037 Add a check to not set the cache size if the user alredy set it.
albeu
parents: 4289
diff changeset
748 } else if(!ret) {
4302
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
749 // cache option not set, will use the our computed value.
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
750 // buffer in KBytes, *5 because the prefill is 20% of the buffer.
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
751 val = (stream->streaming_ctrl->prebuffer_size/1024)*5;
4652
17cf55182029 Cleaned up the way proxies checking was done.
bertrand
parents: 4553
diff changeset
752 if( val<16 ) val = 16; // 16KBytes min buffer
4302
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
753 if( m_config_set_int( mconfig, "cache", val )<0 ) {
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
754 printf("Unable to set the cache size option\n");
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
755 } else {
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
756 cache_size = val;
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
757 }
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
758 } else {
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
759 // cache option set, will use the given one.
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
760 val = m_config_get_int( mconfig, "cache", NULL );
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
761 if( val<0 ) {
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
762 printf("Unable to retrieve the cache option value\n");
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
763 } else {
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
764 cache_size = val;
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
765 }
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
766 }
9f12fd5f47d0 Modified the cache option value setting/reading, so we can report
bertrand
parents: 4293
diff changeset
767 printf("Cache size set to %d KBytes\n", cache_size );
4289
973c6912c586 Set the cache value if the network layer was able to compute it.
bertrand
parents: 4251
diff changeset
768 }
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
769 return ret;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
770 }
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
771
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
772 int
3042
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
773 streaming_stop( stream_t *stream ) {
6b6fa2be9b97 Removed my buffer hack to use cache2.
bertrand
parents: 2555
diff changeset
774 stream->streaming_ctrl->status = streaming_stopped_e;
999
92833c9472e8 Continue implementation of the network streaming part.
bertrand
parents: 903
diff changeset
775 return 0;
903
7f6641b1b0df Added autodetection of potential stream type.
bertrand
parents: 841
diff changeset
776 }