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 },
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);
135 return ntohs(((
const struct sockaddr_in *)ss)->sin_port);
136 #if HAVE_STRUCT_SOCKADDR_IN6 138 return ntohs(((
const struct sockaddr_in6 *)ss)->sin6_port);
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);
186 url_add_option(buf, buf_size,
"buffer_size=%d", s->
buffer_size);
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);
241 p = strchr(uri,
'?');
244 s->
ttl = strtol(buf,
NULL, 10);
274 av_strlcpy(include_sources, buf,
sizeof(include_sources));
281 av_strlcpy(exclude_sources, buf,
sizeof(exclude_sources));
298 if (strcmp(fec_protocol,
"prompeg")) {
304 while (*p && *p ==
'=') p++;
315 for (i = 0; i < max_retry_count; i++) {
384 struct pollfd p[2] = {{s->
rtp_fd, POLLIN, 0}, {s->
rtcp_fd, POLLIN, 0}};
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");
440 socklen_t *source_len, temp_len;
443 "Unable to send packet to source, no packets received yet\n");
454 source = &s->last_rtp_source;
458 source = &temp_source;
459 source_len = &temp_len;
461 temp_source = s->last_rtp_source;
465 "Not received any RTCP packets yet, inferring peer port " 466 "from the RTP port\n");
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);
569 .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.
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
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. ...
#define URL_PROTOCOL_FLAG_NETWORK
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
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
const char * av_default_item_name(void *ptr)
Return the context name.
int64_t rw_timeout
maximum time to wait for (network) read/write operation completion, in mcs
#define AVIO_FLAG_WRITE
write-only
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...
const URLProtocol ff_rtp_protocol
static int rtp_write(URLContext *h, const uint8_t *buf, int size)
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...
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.
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.
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a source
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
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...
const char * protocol_whitelist
static int rtp_read(URLContext *h, uint8_t *buf, int size)
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
void ff_ip_reset_filters(IPSourceFilters *filters)
Resets the IP filter list and frees the internal fields of an IPSourceFilters structure.
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 ss(width, name, subs,...)
static const AVClass rtp_class
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
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 ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
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.
#define AV_LOG_INFO
Standard information.
const char * protocol_blacklist
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.
socklen_t last_rtcp_source_len
int ff_ip_check_source_lists(struct sockaddr_storage *source_addr_ptr, IPSourceFilters *s)
Checks the source address against a given IP source filter.
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)
#define flags(name, subs,...)
static int rtp_get_file_handle(URLContext *h)
Return the local rtcp port used by the RTP connection.
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 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...
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
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
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...
Structure for storing IP (UDP) source filters or block lists.