annotate libmpdemux/network.c @ 4559:5dc383bb1c82

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