annotate rtpproto.c @ 4387:5c42816e12c6 libavformat

Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This allows these functions to peek back and retrieve values from the demuxer's context (or RTSPState). The ASF/RTP payload parser will use this to be able to parse SDP values (which occur even before the payload ID is given), store them in the RTSPState and then retrieve them while parsing payload data. See "[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet() function pointer (was: transport context)" mailinglist thread.
author rbultje
date Fri, 06 Feb 2009 01:37:19 +0000
parents 49c1d3b27727
children b34d9614b887
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
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4206
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard
0
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 */
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
21
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
22 /**
4331
49c1d3b27727 Use full internal pathname in doxygen @file directives.
diego
parents: 4251
diff changeset
23 * @file libavformat/rtpproto.c
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
24 * RTP protocol
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
25 */
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
26
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3229
diff changeset
27 #include "libavutil/avstring.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 #include <stdarg.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1670
diff changeset
32 #include "network.h"
2782
419e121ce80a Add #include "os_support.h" to restore OS/2 support.
diego
parents: 2274
diff changeset
33 #include "os_support.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 #include <fcntl.h>
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 3720
diff changeset
35 #if HAVE_SYS_SELECT_H
3712
30d4d95e068f Add needed include, make it compile without -D_BSD_SOURCE.
michael
parents: 3286
diff changeset
36 #include <sys/select.h>
3720
1968303c7566 Surround '#include <sys/select>' by HAVE_SYS_SELECT_H.
diego
parents: 3712
diff changeset
37 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 #define RTP_TX_BUF_SIZE (64 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 #define RTP_RX_BUF_SIZE (128 * 1024)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 typedef struct RTPContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 URLContext *rtp_hd, *rtcp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 int rtp_fd, rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 } RTPContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 * If no filename is given to av_open_input_file because you want to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 * get the local port first, then you must call this function to set
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 * the remote server address.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 * @param uri of the remote server
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 * @return zero if no error.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 */
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
56
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 int rtp_set_remote_url(URLContext *h, const char *uri)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 int port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 char path[1024];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
65
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
66 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 udp_set_remote_url(s->rtp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port + 1, path);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 udp_set_remote_url(s->rtcp_hd, buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
78 /**
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
79 * add option to url of the form:
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
80 * "http://host:port/path?option1=val1&option2=val2...
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
81 */
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
82
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
83 static void url_add_option(char *buf, int buf_size, const char *fmt, ...)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 char buf1[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 va_list ap;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 va_start(ap, fmt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 if (strchr(buf, '?'))
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
90 av_strlcat(buf, "&", buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 else
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
92 av_strlcat(buf, "?", buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 vsnprintf(buf1, sizeof(buf1), fmt, ap);
2193
5ce5fad0dfac replace the uses of old string functions that Reimar missed
mru
parents: 2079
diff changeset
94 av_strlcat(buf, buf1, buf_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 va_end(ap);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97
64
b0e0eb595e29 * static,const,compiler warning cleanup
kabi
parents: 0
diff changeset
98 static void build_udp_url(char *buf, int buf_size,
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
99 const char *hostname, int port,
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
100 int local_port, int ttl,
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
101 int max_packet_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 snprintf(buf, buf_size, "udp://%s:%d", hostname, port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 if (local_port >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 url_add_option(buf, buf_size, "localport=%d", local_port);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 if (ttl >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 url_add_option(buf, buf_size, "ttl=%d", ttl);
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
108 if (max_packet_size >=0)
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
109 url_add_option(buf, buf_size, "pkt_size=%d", max_packet_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
112 /**
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 * url syntax: rtp://host:port[?option=val...]
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 2782
diff changeset
114 * option: 'ttl=n' : set the ttl value (for multicast only)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 * 'localport=n' : set the local port to n
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
116 * 'pkt_size=n' : set max packet size
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 */
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
119
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 static int rtp_open(URLContext *h, const char *uri, int flags)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 RTPContext *s;
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
123 int port, is_output, ttl, local_port, max_packet_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 char buf[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 char path[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 const char *p;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
128
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 is_output = (flags & URL_WRONLY);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 s = av_mallocz(sizeof(RTPContext));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 if (!s)
1787
eb16c64144ee This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents: 1754
diff changeset
133 return AVERROR(ENOMEM);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 h->priv_data = s;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
135
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
136 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 path, sizeof(path), uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 /* extract parameters */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 ttl = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 local_port = -1;
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
141 max_packet_size = -1;
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
142
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 p = strchr(uri, '?');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 if (p) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 ttl = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 if (find_info_tag(buf, sizeof(buf), "localport", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 local_port = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 }
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
151 if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
152 max_packet_size = strtol(buf, NULL, 10);
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
153 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 build_udp_url(buf, sizeof(buf),
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
157 hostname, port, local_port, ttl, max_packet_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 if (url_open(&s->rtp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 local_port = udp_get_local_port(s->rtp_hd);
2079
takis
parents: 2056
diff changeset
161 /* XXX: need to open another connection if the port is not even */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 /* well, should suppress localport in path */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
164
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 build_udp_url(buf, sizeof(buf),
3228
697a11d7e3cf Expose max_packet_size from the rtp protocol
lu_zero
parents: 3221
diff changeset
166 hostname, port + 1, local_port + 1, ttl, max_packet_size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 if (url_open(&s->rtcp_hd, buf, flags) < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 goto fail;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
169
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 /* just to ease handle access. XXX: need to suppress direct handle
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 access */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 s->rtp_fd = udp_get_file_handle(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 s->rtcp_fd = udp_get_file_handle(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
175 h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 h->is_streamed = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 if (s->rtp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181 url_close(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 if (s->rtcp_hd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 url_close(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 av_free(s);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
185 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 64
diff changeset
188 static int rtp_read(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 struct sockaddr_in from;
1332
7474cc6383d4 fix some signedness warnings
mru
parents: 896
diff changeset
192 socklen_t from_len;
7474cc6383d4 fix some signedness warnings
mru
parents: 896
diff changeset
193 int len, fd_max, n;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 fd_set rfds;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
201 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
202 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
204 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 /* build fdset to listen to RTP and RTCP packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 FD_ZERO(&rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 fd_max = s->rtp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213 FD_SET(s->rtp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 if (s->rtcp_fd > fd_max)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 fd_max = s->rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 FD_SET(s->rtcp_fd, &rfds);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 n = select(fd_max + 1, &rfds, NULL, NULL, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 if (n > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219 /* first try RTCP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
220 if (FD_ISSET(s->rtcp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 len = recvfrom (s->rtcp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
225 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
226 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
228 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 /* then RTP */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 if (FD_ISSET(s->rtp_fd, &rfds)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 from_len = sizeof(from);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 len = recvfrom (s->rtp_fd, buf, size, 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 (struct sockaddr *)&from, &from_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
238 if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1930
diff changeset
239 ff_neterrno() == FF_NETERROR(EINTR))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 continue;
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2200
diff changeset
241 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 }
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 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 64
diff changeset
251 static int rtp_write(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 URLContext *hd;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 511
diff changeset
256
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 if (buf[1] >= 200 && buf[1] <= 204) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 /* RTCP payload type */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 hd = s->rtcp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 /* RTP payload type */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 hd = s->rtp_hd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 ret = url_write(hd, buf, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 struct timespec ts;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 ts.tv_sec = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 ts.tv_nsec = 10 * 1000000;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 nanosleep(&ts, NULL);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 static int rtp_close(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 url_close(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 url_close(s->rtcp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 av_free(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 /**
2079
takis
parents: 2056
diff changeset
288 * Return the local port used by the RTP connection
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 * @return the local port number
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 */
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
292
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 int rtp_get_local_port(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 return udp_get_local_port(s->rtp_hd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 /**
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
300 * Return the rtp and rtcp file handles for select() usage to wait for
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
301 * several RTP streams at the same time.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 * @param h media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 */
3229
510fab17efc3 Cleanup comments and make them doxygen parsable.
lu_zero
parents: 3228
diff changeset
304
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307 RTPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 *prtp_fd = s->rtp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 *prtcp_fd = s->rtcp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 URLProtocol rtp_protocol = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 "rtp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 rtp_open,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 rtp_read,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 rtp_write,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 NULL, /* seek */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 rtp_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 };