66 #define OFFSET(x) offsetof(RTPContext, x)
67 #define D AV_OPT_FLAG_DECODING_PARAM
68 #define E AV_OPT_FLAG_ENCODING_PARAM
70 {
"ttl",
"Time to live (in milliseconds, multicast only)",
OFFSET(ttl),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
71 {
"buffer_size",
"Send/Receive buffer size (in bytes)",
OFFSET(buffer_size),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
72 {
"rtcp_port",
"Custom rtcp port",
OFFSET(rtcp_port),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
73 {
"local_rtpport",
"Local rtp port",
OFFSET(local_rtpport),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
74 {
"local_rtcpport",
"Local rtcp port",
OFFSET(local_rtcpport),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
76 {
"write_to_source",
"Send packets to the source address of the latest received packet",
OFFSET(write_to_source),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, .flags =
D|
E },
77 {
"pkt_size",
"Maximum packet size",
OFFSET(pkt_size),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
79 {
"timeout",
"set timeout (in microseconds) of socket I/O operations",
OFFSET(rw_timeout),
AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags =
D|
E },
114 path,
sizeof(path), uri);
115 rtcp_port = port + 1;
117 p = strchr(uri,
'?');
120 rtcp_port = strtol(buf,
NULL, 10);
124 ff_url_join(buf,
sizeof(buf),
"udp",
NULL, hostname, port,
"%s", path);
127 ff_url_join(buf,
sizeof(buf),
"udp",
NULL, hostname, rtcp_port,
"%s", path);
134 if (
ss->ss_family == AF_INET)
135 return ntohs(((
const struct sockaddr_in *)
ss)->sin_port);
136 #if HAVE_STRUCT_SOCKADDR_IN6
137 if (
ss->ss_family == AF_INET6)
138 return ntohs(((
const struct sockaddr_in6 *)
ss)->sin6_port);
145 if (
ss->ss_family == AF_INET)
146 ((
struct sockaddr_in *)
ss)->sin_port = htons(port);
147 #if HAVE_STRUCT_SOCKADDR_IN6
148 else if (
ss->ss_family == AF_INET6)
149 ((
struct sockaddr_in6 *)
ss)->sin6_port = htons(port);
164 if (strchr(buf,
'?'))
174 char *buf,
int buf_size,
175 const char *hostname,
176 int port,
int local_port,
177 const char *include_sources,
178 const char *exclude_sources)
182 url_add_option(buf, buf_size,
"localport=%d", local_port);
184 url_add_option(buf, buf_size,
"ttl=%d",
s->ttl);
185 if (
s->buffer_size >= 0)
186 url_add_option(buf, buf_size,
"buffer_size=%d",
s->buffer_size);
187 if (
s->pkt_size >= 0)
188 url_add_option(buf, buf_size,
"pkt_size=%d",
s->pkt_size);
190 url_add_option(buf, buf_size,
"connect=1");
192 url_add_option(buf, buf_size,
"dscp=%d",
s->dscp);
193 url_add_option(buf, buf_size,
"fifo_size=0");
194 if (include_sources && include_sources[0])
195 url_add_option(buf, buf_size,
"sources=%s", include_sources);
196 if (exclude_sources && exclude_sources[0])
197 url_add_option(buf, buf_size,
"block=%s", exclude_sources);
226 char hostname[256], include_sources[1024] =
"", exclude_sources[1024] =
"";
227 char *sources = include_sources, *
block = exclude_sources;
228 char *fec_protocol =
NULL;
232 int i, max_retry_count = 3;
236 path,
sizeof(path), uri);
238 if (
s->rtcp_port < 0)
239 s->rtcp_port = rtp_port + 1;
241 p = strchr(uri,
'?');
244 s->ttl = strtol(buf,
NULL, 10);
247 s->rtcp_port = strtol(buf,
NULL, 10);
250 s->local_rtpport = strtol(buf,
NULL, 10);
253 s->local_rtpport = strtol(buf,
NULL, 10);
256 s->local_rtcpport = strtol(buf,
NULL, 10);
259 s->pkt_size = strtol(buf,
NULL, 10);
262 s->connect = strtol(buf,
NULL, 10);
265 s->write_to_source = strtol(buf,
NULL, 10);
268 s->dscp = strtol(buf,
NULL, 10);
271 s->rw_timeout = strtol(buf,
NULL, 10);
274 av_strlcpy(include_sources, buf,
sizeof(include_sources));
278 sources =
s->sources;
281 av_strlcpy(exclude_sources, buf,
sizeof(exclude_sources));
288 if (
s->rw_timeout >= 0)
289 h->rw_timeout =
s->rw_timeout;
291 if (
s->fec_options_str) {
292 p =
s->fec_options_str;
298 if (strcmp(fec_protocol,
"prompeg")) {
303 p =
s->fec_options_str + strlen(fec_protocol);
304 while (*p && *p ==
'=') p++;
315 for (
i = 0;
i < max_retry_count;
i++) {
317 hostname, rtp_port,
s->local_rtpport,
320 NULL,
h->protocol_whitelist,
h->protocol_blacklist,
h) < 0)
323 if(
s->local_rtpport == 65535) {
324 s->local_rtpport = -1;
328 if (
s->local_rtcpport < 0) {
329 s->local_rtcpport =
s->local_rtpport + 1;
331 hostname,
s->rtcp_port,
s->local_rtcpport,
334 &
h->interrupt_callback,
NULL,
335 h->protocol_whitelist,
h->protocol_blacklist,
h) < 0) {
336 s->local_rtpport =
s->local_rtcpport = -1;
342 hostname,
s->rtcp_port,
s->local_rtcpport,
345 NULL,
h->protocol_whitelist,
h->protocol_blacklist,
h) < 0)
354 &fec_opts,
h->protocol_whitelist,
h->protocol_blacklist,
h) < 0)
363 h->max_packet_size =
s->rtp_hd->max_packet_size;
384 struct pollfd p[2] = {{
s->rtp_fd, POLLIN, 0}, {
s->rtcp_fd, POLLIN, 0}};
387 socklen_t *addr_lens[2] = { &
s->last_rtp_source_len, &
s->last_rtcp_source_len };
393 n = poll(p, 2, poll_delay);
396 for (
i = 1;
i >= 0;
i--) {
397 if (!(p[
i].revents & POLLIN))
399 *addr_lens[
i] =
sizeof(*addrs[
i]);
400 len = recvfrom(p[
i].fd, buf,
size, 0,
401 (
struct sockaddr *)addrs[
i], addr_lens[
i]);
412 }
else if (n == 0 &&
h->rw_timeout > 0 && --runs <= 0) {
435 "make sure the RTP muxer is used\n");
437 if (
s->write_to_source) {
440 socklen_t *source_len, temp_len;
441 if (!
s->last_rtp_source.ss_family && !
s->last_rtcp_source.ss_family) {
443 "Unable to send packet to source, no packets received yet\n");
450 source = &
s->last_rtcp_source;
451 source_len = &
s->last_rtcp_source_len;
454 source = &
s->last_rtp_source;
455 source_len = &
s->last_rtp_source_len;
458 source = &temp_source;
459 source_len = &temp_len;
461 temp_source =
s->last_rtp_source;
462 temp_len =
s->last_rtp_source_len;
465 "Not received any RTCP packets yet, inferring peer port "
466 "from the RTP port\n");
468 temp_source =
s->last_rtcp_source;
469 temp_len =
s->last_rtcp_source_len;
472 "Not received any RTP packets yet, inferring peer port "
473 "from the RTCP port\n");
482 ret = sendto(fd, buf,
size, 0, (
struct sockaddr *) source,
550 int *hs = *handles =
av_malloc(
sizeof(**handles) * 2);
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it.
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
int ffurl_get_file_handle(URLContext *h)
Return the file descriptor associated with this URL.
#define AVIO_FLAG_WRITE
write-only
#define AVIO_FLAG_NONBLOCK
Use non-blocking mode.
#define flags(name, subs,...)
#define ss(width, name, subs,...)
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it.
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
#define LIBAVUTIL_VERSION_INT
int ff_ip_check_source_lists(struct sockaddr_storage *source_addr_ptr, IPSourceFilters *s)
Checks the source address against a given IP source filter.
void ff_ip_reset_filters(IPSourceFilters *filters)
Resets the IP filter list and frees the internal fields of an IPSourceFilters structure.
int ff_ip_parse_blocks(void *log_ctx, const char *buf, IPSourceFilters *filters)
Parses the address[,address] source block list in buf and adds it to the filters in the IPSourceFilte...
int ff_ip_parse_sources(void *log_ctx, const char *buf, IPSourceFilters *filters)
Parses the address[,address] source list in buf and adds it to the filters in the IPSourceFilters str...
common internal API header
int ff_network_wait_fd(int fd, int write)
miscellaneous OS support macros and functions.
int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
Attempt to find a specific tag in a URL.
typedef void(RENAME(mix_any_func_type))
#define RTP_PT_IS_RTCP(x)
static int get_port(const struct sockaddr_storage *ss)
static void build_udp_url(RTPContext *s, char *buf, int buf_size, const char *hostname, int port, int local_port, const char *include_sources, const char *exclude_sources)
static int rtp_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
static const AVOption options[]
static int rtp_get_file_handle(URLContext *h)
Return the local rtcp port used by the RTP connection.
const URLProtocol ff_rtp_protocol
static int rtp_open(URLContext *h, const char *uri, int flags)
url syntax: rtp://host:port[?option=val...] option: 'ttl=n' : set the ttl value (for multicast only) ...
static av_printf_format(3, 4)
add option to url of the form: "http://host:port/path?option1=val1&option2=val2...
static int rtp_write(URLContext *h, const uint8_t *buf, int size)
static int rtp_close(URLContext *h)
static void set_port(struct sockaddr_storage *ss, int port)
static const AVClass rtp_class
static int rtp_read(URLContext *h, uint8_t *buf, int size)
int ff_rtp_set_remote_url(URLContext *h, const char *uri)
If no filename is given to av_open_input_file because you want to get the local port first,...
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Structure for storing IP (UDP) source filters or block lists.
struct sockaddr_storage last_rtp_source last_rtcp_source
socklen_t last_rtp_source_len
socklen_t last_rtcp_source_len
int ff_udp_get_local_port(URLContext *h)
Return the local port used by the UDP connection.
int ff_udp_set_remote_url(URLContext *h, const char *uri)
If no filename is given to av_open_input_file because you want to get the local port first,...
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
unbuffered private I/O API
#define URL_PROTOCOL_FLAG_NETWORK