annotate rtpproto.c @ 3068:9cc9ff5aff9c libavformat

set bps to uncompressed original sound data for compressed audio according to aiff specs, qt set it to 16 for mace and ima4, fail if block align is not set.
author bcoudurier
date Mon, 25 Feb 2008 12:00:31 +0000
parents 419e121ce80a
children e17b25e8a34e
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 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include "avformat.h"
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
22 #include "avstring.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #include <stdarg.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1670
diff changeset
26 #include "network.h"
2782
419e121ce80a Add #include "os_support.h" to restore OS/2 support.
diego
parents: 2274
diff changeset
27 #include "os_support.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #include <fcntl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 #define RTP_TX_BUF_SIZE (64 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 #define RTP_RX_BUF_SIZE (128 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 typedef struct RTPContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 URLContext *rtp_hd, *rtcp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 int rtp_fd, rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 } RTPContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 * If no filename is given to av_open_input_file because you want to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 * get the local port first, then you must call this function to set
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 * the remote server address.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 * @param uri of the remote server
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 * @return zero if no error.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 int rtp_set_remote_url(URLContext *h, const char *uri)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 int port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 char path[1024];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
55
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
56 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 udp_set_remote_url(s->rtp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port + 1, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 udp_set_remote_url(s->rtcp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 /* add option to url of the form:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 "http://host:port/path?option1=val1&option2=val2... */
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
70 static void url_add_option(char *buf, int buf_size, const char *fmt, ...)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 char buf1[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 va_list ap;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 va_start(ap, fmt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 if (strchr(buf, '?'))
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
77 av_strlcat(buf, "&", buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 else
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
79 av_strlcat(buf, "?", buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 vsnprintf(buf1, sizeof(buf1), fmt, ap);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
81 av_strlcat(buf, buf1, buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 va_end(ap);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
85 static void build_udp_url(char *buf, int buf_size,
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
86 const char *hostname, int port,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
87 int local_port, int multicast, int ttl)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 snprintf(buf, buf_size, "udp://%s:%d", hostname, port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 if (local_port >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 url_add_option(buf, buf_size, "localport=%d", local_port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 if (multicast)
1930
f67a8d12053d Remove parameter unused in format string.
reimar
parents: 1787
diff changeset
93 url_add_option(buf, buf_size, "multicast=1");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 if (ttl >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 url_add_option(buf, buf_size, "ttl=%d", ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 * url syntax: rtp://host:port[?option=val...]
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
100 * option: 'multicast=1' : enable multicast
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 * 'ttl=n' : set the ttl value (for multicast only)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 * 'localport=n' : set the local port to n
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 static int rtp_open(URLContext *h, const char *uri, int flags)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 RTPContext *s;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 int port, is_output, is_multicast, ttl, local_port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 char path[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 const char *p;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
113
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 is_output = (flags & URL_WRONLY);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 s = av_mallocz(sizeof(RTPContext));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 if (!s)
1787
eb16c64144ee This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents: 1754
diff changeset
118 return AVERROR(ENOMEM);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 h->priv_data = s;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
120
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
121 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 /* extract parameters */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 is_multicast = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 ttl = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 local_port = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 p = strchr(uri, '?');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 if (p) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 is_multicast = find_info_tag(buf, sizeof(buf), "multicast", p);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 ttl = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 if (find_info_tag(buf, sizeof(buf), "localport", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 local_port = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 build_udp_url(buf, sizeof(buf),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 hostname, port, local_port, is_multicast, ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 if (url_open(&s->rtp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 local_port = udp_get_local_port(s->rtp_hd);
2079
takis
parents: 2056
diff changeset
143 /* XXX: need to open another connection if the port is not even */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 /* well, should suppress localport in path */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
146
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 build_udp_url(buf, sizeof(buf),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 hostname, port + 1, local_port + 1, is_multicast, ttl);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 if (url_open(&s->rtcp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 goto fail;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
151
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 /* just to ease handle access. XXX: need to suppress direct handle
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 access */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 s->rtp_fd = udp_get_file_handle(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 s->rtcp_fd = udp_get_file_handle(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
157 h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 h->is_streamed = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 if (s->rtp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 url_close(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 if (s->rtcp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 url_close(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 av_free(s);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
167 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 64
diff changeset
170 static int rtp_read(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 struct sockaddr_in from;
1332
7474cc6383d4 fix some signedness warnings
mru
parents: 896
diff changeset
174 socklen_t from_len;
7474cc6383d4 fix some signedness warnings
mru
parents: 896
diff changeset
175 int len, fd_max, n;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
183 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
184 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
186 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 /* build fdset to listen to RTP and RTCP packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 fd_max = s->rtp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 FD_SET(s->rtp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 if (s->rtcp_fd > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 fd_max = s->rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 FD_SET(s->rtcp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 n = select(fd_max + 1, &rfds, NULL, NULL, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 if (n > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 /* first try RTCP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 if (FD_ISSET(s->rtcp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 len = recvfrom (s->rtcp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
207 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
208 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
210 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 /* then RTP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 if (FD_ISSET(s->rtp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
220 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
221 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
223 return AVERROR(EIO);
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 /**
2079
takis
parents: 2056
diff changeset
270 * Return the local port used by the RTP connection
0
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 };