62 #define OFFSET(x) offsetof(RTPContext, x) 63 #define D AV_OPT_FLAG_DECODING_PARAM 64 #define E AV_OPT_FLAG_ENCODING_PARAM 66 {
"ttl",
"Time to live (in milliseconds, multicast only)",
OFFSET(
ttl),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
107 path,
sizeof(path), uri);
108 rtcp_port = port + 1;
110 p = strchr(uri,
'?');
113 rtcp_port = strtol(buf,
NULL, 10);
117 ff_url_join(buf,
sizeof(buf),
"udp",
NULL, hostname, port,
"%s", path);
120 ff_url_join(buf,
sizeof(buf),
"udp",
NULL, hostname, rtcp_port,
"%s", path);
126 int type,
int family,
int flags)
128 struct addrinfo hints = { 0 }, *res = 0;
132 snprintf(service,
sizeof(service),
"%d", port);
136 if ((error =
getaddrinfo(hostname, service, &hints, &res))) {
150 return (((
const struct sockaddr_in *)a)->sin_addr.s_addr !=
151 ((
const struct sockaddr_in *)b)->sin_addr.s_addr);
154 #if HAVE_STRUCT_SOCKADDR_IN6 156 const uint8_t *s6_addr_a = ((
const struct sockaddr_in6 *)a)->sin6_addr.s6_addr;
157 const uint8_t *s6_addr_b = ((
const struct sockaddr_in6 *)b)->sin6_addr.s6_addr;
158 return memcmp(s6_addr_a, s6_addr_b, 16);
167 return ntohs(((
const struct sockaddr_in *)ss)->sin_port);
168 #if HAVE_STRUCT_SOCKADDR_IN6 169 if (ss->ss_family == AF_INET6)
170 return ntohs(((
const struct sockaddr_in6 *)ss)->sin6_port);
178 ((
struct sockaddr_in *)ss)->sin_port = htons(port);
179 #if HAVE_STRUCT_SOCKADDR_IN6 180 else if (ss->ss_family == AF_INET6)
181 ((
struct sockaddr_in6 *)ss)->sin6_port = htons(port);
215 if (strchr(buf,
'?'))
219 vsnprintf(buf1,
sizeof(buf1), fmt, ap);
225 char *buf,
int buf_size,
226 const char *hostname,
227 int port,
int local_port,
228 const char *include_sources,
229 const char *exclude_sources)
233 url_add_option(buf, buf_size,
"localport=%d", local_port);
235 url_add_option(buf, buf_size,
"ttl=%d", s->
ttl);
237 url_add_option(buf, buf_size,
"buffer_size=%d", s->
buffer_size);
239 url_add_option(buf, buf_size,
"pkt_size=%d", s->
pkt_size);
241 url_add_option(buf, buf_size,
"connect=1");
242 if (include_sources && include_sources[0])
243 url_add_option(buf, buf_size,
"sources=%s", include_sources);
244 if (exclude_sources && exclude_sources[0])
245 url_add_option(buf, buf_size,
"block=%s", exclude_sources);
250 int *address_list_size_ptr)
254 char tmp =
'\0', *p = buf, *next;
259 next = strchr(p,
',');
276 dynarray_add(address_list_ptr, address_list_size_ptr, source_addr);
314 char hostname[256], include_sources[1024] =
"", exclude_sources[1024] =
"";
315 char *
sources = include_sources, *
block = exclude_sources;
321 path,
sizeof(path), uri);
326 p = strchr(uri,
'?');
329 s->
ttl = strtol(buf,
NULL, 10);
353 av_strlcpy(include_sources, buf,
sizeof(include_sources));
361 av_strlcpy(exclude_sources, buf,
sizeof(exclude_sources));
404 struct pollfd p[2] = {{s->
rtp_fd, POLLIN, 0}, {s->
rtcp_fd, POLLIN, 0}};
412 n = poll(p, 2, poll_delay);
415 for (i = 1; i >= 0; i--) {
416 if (!(p[i].revents & POLLIN))
418 *addr_lens[i] =
sizeof(*addrs[i]);
419 len = recvfrom(p[i].fd, buf, size, 0,
420 (
struct sockaddr *)addrs[i], addr_lens[i]);
453 "make sure the RTP muxer is used\n");
458 socklen_t *source_len, temp_len;
461 "Unable to send packet to source, no packets received yet\n");
472 source = &s->last_rtp_source;
476 source = &temp_source;
477 source_len = &temp_len;
479 temp_source = s->last_rtp_source;
483 "Not received any RTCP packets yet, inferring peer port " 484 "from the RTP port\n");
490 "Not received any RTP packets yet, inferring peer port " 491 "from the RTCP port\n");
500 ret = sendto(fd, buf, size, 0, (
struct sockaddr *) source,
569 int *hs = *handles =
av_malloc(
sizeof(**handles) * 2);
588 .priv_data_class = &rtp_class,
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_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
#define URL_PROTOCOL_FLAG_NETWORK
#define AV_LOG_WARNING
Something somehow does not look correct.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
int is_streamed
true if streamed (no seek possible), default = false
AVIOInterruptCB interrupt_callback
static int rtp_check_source_lists(RTPContext *s, struct sockaddr_storage *source_addr_ptr)
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
static void rtp_parse_addr_list(URLContext *h, char *buf, struct sockaddr_storage ***address_list_ptr, int *address_list_size_ptr)
const URLProtocol ff_rtp_protocol
static int compare_addr(const struct sockaddr_storage *a, const struct sockaddr_storage *b)
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static int rtp_write(URLContext *h, const uint8_t *buf, int size)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int rtp_close(URLContext *h)
miscellaneous OS support macros and functions.
socklen_t last_rtp_source_len
static int get_port(const struct sockaddr_storage *ss)
int ff_udp_get_local_port(URLContext *h)
Return the local port used by the UDP connection.
struct sockaddr_storage ** ssm_include_addrs
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.
int ffurl_open(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const URLProtocol **protocols, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it. ...
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
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...
static int rtp_read(URLContext *h, uint8_t *buf, int size)
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.
static const AVClass rtp_class
struct sockaddr_storage last_rtp_source last_rtcp_source
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 const AVOption options[]
static int rtp_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
int ffurl_get_file_handle(URLContext *h)
Return the file descriptor associated with this URL.
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
#define AV_LOG_INFO
Standard information.
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
#define AVIO_FLAG_NONBLOCK
Use non-blocking mode.
static void(WINAPI *cond_broadcast)(pthread_cond_t *cond)
socklen_t last_rtcp_source_len
Describe the class of an AVClass context structure.
static av_printf_format(3, 4)
add option to url of the form: "http://host:port/path?option1=val1&option2=val2...
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...
#define RTP_PT_IS_RTCP(x)
static void set_port(struct sockaddr_storage *ss, int port)
int ffurl_close(URLContext *h)
Close the resource accessed by the URLContext h, and free the memory used by it.
static struct addrinfo * rtp_resolve_host(const char *hostname, int port, int type, int family, int flags)
const struct URLProtocol ** protocols
A NULL-terminated list of protocols usable by the child contexts.
struct sockaddr_storage ** ssm_exclude_addrs
static int rtp_get_file_handle(URLContext *h)
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)
int ff_rtp_get_local_rtcp_port(URLContext *h)
Return the local rtcp port used by the RTP connection.
int max_packet_size
if non zero, the stream is packetized with this max packet size
int ff_network_wait_fd(int fd, int write)
unbuffered private I/O API
struct sockaddr * ai_addr
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...
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...