annotate rtpproto.c @ 1206:e60bf67d9bf8 libavformat

The reader ignores the size of the ASF data object and keeps on reading even beyond it. Therefore if the ASF file includes an index object at its end, the reader will treat the index like data, but of course will fail since it thinks that the data is corrupted. When reading an asf file with an index object, ffmpeg will complain at the end of the file that it read an invalid header. Patch by Kohn Emil Dan, < emild A cs P technion P ac P il > Original thead: Date: Apr 18, 2006 4:11 PM Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author gpoirier
date Sat, 29 Jul 2006 16:07:19 +0000
parents edbe5c3717f9
children 7474cc6383d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * RTP network protocol
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include <stdarg.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include <sys/types.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include <sys/socket.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #include <netinet/in.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 #ifndef __BEOS__
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 # include <arpa/inet.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 # include "barpainet.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 #include <netdb.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 #include <fcntl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 #define RTP_TX_BUF_SIZE (64 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 #define RTP_RX_BUF_SIZE (128 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 typedef struct RTPContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 URLContext *rtp_hd, *rtcp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 int rtp_fd, rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 } RTPContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 * If no filename is given to av_open_input_file because you want to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 * get the local port first, then you must call this function to set
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 * the remote server address.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 * @param uri of the remote server
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 * @return zero if no error.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 int rtp_set_remote_url(URLContext *h, const char *uri)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 int port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 char path[1024];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
59
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
60 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 udp_set_remote_url(s->rtp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port + 1, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 udp_set_remote_url(s->rtcp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 /* add option to url of the form:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 "http://host:port/path?option1=val1&option2=val2... */
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
74 static void url_add_option(char *buf, int buf_size, const char *fmt, ...)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 char buf1[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 va_list ap;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 va_start(ap, fmt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 if (strchr(buf, '?'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 pstrcat(buf, buf_size, "&");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 pstrcat(buf, buf_size, "?");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 vsnprintf(buf1, sizeof(buf1), fmt, ap);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 pstrcat(buf, buf_size, buf1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 va_end(ap);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
89 static void build_udp_url(char *buf, int buf_size,
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
90 const char *hostname, int port,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
91 int local_port, int multicast, int ttl)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 snprintf(buf, buf_size, "udp://%s:%d", hostname, port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 if (local_port >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 url_add_option(buf, buf_size, "localport=%d", local_port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 if (multicast)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 url_add_option(buf, buf_size, "multicast=1", multicast);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 if (ttl >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 url_add_option(buf, buf_size, "ttl=%d", ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 * url syntax: rtp://host:port[?option=val...]
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
104 * option: 'multicast=1' : enable multicast
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 * 'ttl=n' : set the ttl value (for multicast only)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 * 'localport=n' : set the local port to n
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 static int rtp_open(URLContext *h, const char *uri, int flags)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 RTPContext *s;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 int port, is_output, is_multicast, ttl, local_port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 char path[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 const char *p;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
117
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 is_output = (flags & URL_WRONLY);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 s = av_mallocz(sizeof(RTPContext));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 if (!s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 return -ENOMEM;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 h->priv_data = s;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
124
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
125 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 /* extract parameters */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 is_multicast = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 ttl = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 local_port = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 p = strchr(uri, '?');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 if (p) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 is_multicast = find_info_tag(buf, sizeof(buf), "multicast", p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 ttl = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 if (find_info_tag(buf, sizeof(buf), "localport", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 local_port = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 build_udp_url(buf, sizeof(buf),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 hostname, port, local_port, is_multicast, ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 if (url_open(&s->rtp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 local_port = udp_get_local_port(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 /* XXX: need to open another connexion if the port is not even */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 /* well, should suppress localport in path */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
150
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 build_udp_url(buf, sizeof(buf),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 hostname, port + 1, local_port + 1, is_multicast, ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 if (url_open(&s->rtcp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 goto fail;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
155
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 /* just to ease handle access. XXX: need to suppress direct handle
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 access */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 s->rtp_fd = udp_get_file_handle(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 s->rtcp_fd = udp_get_file_handle(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
161 h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 h->is_streamed = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 if (s->rtp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 url_close(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 if (s->rtcp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 url_close(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 av_free(s);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 65
diff changeset
171 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 64
diff changeset
174 static int rtp_read(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 struct sockaddr_in from;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 int from_len, len, fd_max, n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 if (len < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 if (errno == EAGAIN || errno == EINTR)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 continue;
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 65
diff changeset
188 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 /* build fdset to listen to RTP and RTCP packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 fd_max = s->rtp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 FD_SET(s->rtp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 if (s->rtcp_fd > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 fd_max = s->rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 FD_SET(s->rtcp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 n = select(fd_max + 1, &rfds, NULL, NULL, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 if (n > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 /* first try RTCP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 if (FD_ISSET(s->rtcp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 len = recvfrom (s->rtcp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 if (len < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 if (errno == EAGAIN || errno == EINTR)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 continue;
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 65
diff changeset
211 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 /* then RTP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 if (FD_ISSET(s->rtp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 if (len < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 if (errno == EAGAIN || errno == EINTR)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 continue;
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 65
diff changeset
223 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 64
diff changeset
233 static int rtp_write(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 URLContext *hd;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
238
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 if (buf[1] >= 200 && buf[1] <= 204) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 /* RTCP payload type */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 hd = s->rtcp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 /* RTP payload type */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 hd = s->rtp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 ret = url_write(hd, buf, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 struct timespec ts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 ts.tv_sec = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 ts.tv_nsec = 10 * 1000000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 nanosleep(&ts, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 static int rtp_close(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 url_close(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 url_close(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 av_free(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 * Return the local port used by the RTP connexion
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 * @return the local port number
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 int rtp_get_local_port(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 return udp_get_local_port(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 * Return the rtp and rtcp file handles for select() usage to wait for several RTP
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 * streams at the same time.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 * @param h media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 *prtp_fd = s->rtp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 *prtcp_fd = s->rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 URLProtocol rtp_protocol = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 "rtp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 rtp_open,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 rtp_read,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 rtp_write,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 NULL, /* seek */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 rtp_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 };