FFmpeg
udp.c
Go to the documentation of this file.
1 /*
2  * UDP prototype streaming system
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * UDP protocol
25  */
26 
27 #define _DEFAULT_SOURCE
28 #define _BSD_SOURCE /* Needed for using struct ip_mreq with recent glibc */
29 
30 #include "avformat.h"
31 #include "avio_internal.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/parseutils.h"
34 #include "libavutil/fifo.h"
35 #include "libavutil/intreadwrite.h"
36 #include "libavutil/avstring.h"
37 #include "libavutil/opt.h"
38 #include "libavutil/log.h"
39 #include "libavutil/time.h"
40 #include "internal.h"
41 #include "network.h"
42 #include "os_support.h"
43 #include "url.h"
44 #include "ip.h"
45 
46 #ifdef __APPLE__
47 #include "TargetConditionals.h"
48 #endif
49 
50 #if HAVE_UDPLITE_H
51 #include "udplite.h"
52 #else
53 /* On many Linux systems, udplite.h is missing but the kernel supports UDP-Lite.
54  * So, we provide a fallback here.
55  */
56 #define UDPLITE_SEND_CSCOV 10
57 #define UDPLITE_RECV_CSCOV 11
58 #endif
59 
60 #ifndef IPPROTO_UDPLITE
61 #define IPPROTO_UDPLITE 136
62 #endif
63 
64 #if HAVE_W32THREADS
65 #undef HAVE_PTHREAD_CANCEL
66 #define HAVE_PTHREAD_CANCEL 1
67 #endif
68 
69 #if HAVE_PTHREAD_CANCEL
70 #include "libavutil/thread.h"
71 #endif
72 
73 #ifndef IPV6_ADD_MEMBERSHIP
74 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
75 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
76 #endif
77 
78 #define UDP_TX_BUF_SIZE 32768
79 #define UDP_RX_BUF_SIZE 393216
80 #define UDP_MAX_PKT_SIZE 65536
81 #define UDP_HEADER_SIZE 8
82 
83 typedef struct UDPContext {
84  const AVClass *class;
85  int udp_fd;
86  int ttl;
89  int pkt_size;
98 
99  /* Circular Buffer variables for use in UDP receive code */
103  int64_t bitrate; /* number of bits to send per second */
104  int64_t burst_bits;
106 #if HAVE_PTHREAD_CANCEL
107  pthread_t circular_buffer_thread;
110  int thread_started;
111 #endif
112  uint8_t tmp[UDP_MAX_PKT_SIZE+4];
114  char *localaddr;
115  int timeout;
117  char *sources;
118  char *block;
120 } UDPContext;
121 
122 #define OFFSET(x) offsetof(UDPContext, x)
123 #define D AV_OPT_FLAG_DECODING_PARAM
124 #define E AV_OPT_FLAG_ENCODING_PARAM
125 static const AVOption options[] = {
126  { "buffer_size", "System data size (in bytes)", OFFSET(buffer_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
127  { "bitrate", "Bits to send per second", OFFSET(bitrate), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, .flags = E },
128  { "burst_bits", "Max length of bursts in bits (when using bitrate)", OFFSET(burst_bits), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, .flags = E },
129  { "localport", "Local port", OFFSET(local_port), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, D|E },
130  { "local_port", "Local port", OFFSET(local_port), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
131  { "localaddr", "Local address", OFFSET(localaddr), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = D|E },
132  { "udplite_coverage", "choose UDPLite head size which should be validated by checksum", OFFSET(udplite_coverage), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, D|E },
133  { "pkt_size", "Maximum UDP packet size", OFFSET(pkt_size), AV_OPT_TYPE_INT, { .i64 = 1472 }, -1, INT_MAX, .flags = D|E },
134  { "reuse", "explicitly allow reusing UDP sockets", OFFSET(reuse_socket), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, D|E },
135  { "reuse_socket", "explicitly allow reusing UDP sockets", OFFSET(reuse_socket), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, .flags = D|E },
136  { "broadcast", "explicitly allow or disallow broadcast destination", OFFSET(is_broadcast), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
137  { "ttl", "Time to live (multicast only)", OFFSET(ttl), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, INT_MAX, E },
138  { "connect", "set if connect() should be called on socket", OFFSET(is_connected), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, .flags = D|E },
139  { "fifo_size", "set the UDP receiving circular buffer size, expressed as a number of packets with size of 188 bytes", OFFSET(circular_buffer_size), AV_OPT_TYPE_INT, {.i64 = 7*4096}, 0, INT_MAX, D },
140  { "overrun_nonfatal", "survive in case of UDP receiving circular buffer overrun", OFFSET(overrun_nonfatal), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D },
141  { "timeout", "set raise error timeout, in microseconds (only in read mode)",OFFSET(timeout), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, D },
142  { "sources", "Source list", OFFSET(sources), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = D|E },
143  { "block", "Block list", OFFSET(block), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = D|E },
144  { NULL }
145 };
146 
147 static const AVClass udp_class = {
148  .class_name = "udp",
149  .item_name = av_default_item_name,
150  .option = options,
151  .version = LIBAVUTIL_VERSION_INT,
152 };
153 
155  .class_name = "udplite",
156  .item_name = av_default_item_name,
157  .option = options,
158  .version = LIBAVUTIL_VERSION_INT,
159 };
160 
161 static int udp_set_multicast_ttl(int sockfd, int mcastTTL,
162  struct sockaddr *addr)
163 {
164 #ifdef IP_MULTICAST_TTL
165  if (addr->sa_family == AF_INET) {
166  if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL, sizeof(mcastTTL)) < 0) {
167  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_MULTICAST_TTL)");
168  return ff_neterrno();
169  }
170  }
171 #endif
172 #if defined(IPPROTO_IPV6) && defined(IPV6_MULTICAST_HOPS)
173  if (addr->sa_family == AF_INET6) {
174  if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcastTTL, sizeof(mcastTTL)) < 0) {
175  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IPV6_MULTICAST_HOPS)");
176  return ff_neterrno();
177  }
178  }
179 #endif
180  return 0;
181 }
182 
183 static int udp_join_multicast_group(int sockfd, struct sockaddr *addr,struct sockaddr *local_addr)
184 {
185 #ifdef IP_ADD_MEMBERSHIP
186  if (addr->sa_family == AF_INET) {
187  struct ip_mreq mreq;
188 
189  mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
190  if (local_addr)
191  mreq.imr_interface= ((struct sockaddr_in *)local_addr)->sin_addr;
192  else
193  mreq.imr_interface.s_addr = INADDR_ANY;
194  if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
195  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_ADD_MEMBERSHIP)");
196  return ff_neterrno();
197  }
198  }
199 #endif
200 #if HAVE_STRUCT_IPV6_MREQ && defined(IPPROTO_IPV6)
201  if (addr->sa_family == AF_INET6) {
202  struct ipv6_mreq mreq6;
203 
204  memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr), sizeof(struct in6_addr));
205  //TODO: Interface index should be looked up from local_addr
206  mreq6.ipv6mr_interface = 0;
207  if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
208  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IPV6_ADD_MEMBERSHIP)");
209  return ff_neterrno();
210  }
211  }
212 #endif
213  return 0;
214 }
215 
216 static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr,struct sockaddr *local_addr)
217 {
218 #ifdef IP_DROP_MEMBERSHIP
219  if (addr->sa_family == AF_INET) {
220  struct ip_mreq mreq;
221 
222  mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
223  if (local_addr)
224  mreq.imr_interface = ((struct sockaddr_in *)local_addr)->sin_addr;
225  else
226  mreq.imr_interface.s_addr = INADDR_ANY;
227  if (setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
228  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_DROP_MEMBERSHIP)");
229  return -1;
230  }
231  }
232 #endif
233 #if HAVE_STRUCT_IPV6_MREQ && defined(IPPROTO_IPV6)
234  if (addr->sa_family == AF_INET6) {
235  struct ipv6_mreq mreq6;
236 
237  memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr), sizeof(struct in6_addr));
238  //TODO: Interface index should be looked up from local_addr
239  mreq6.ipv6mr_interface = 0;
240  if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
241  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IPV6_DROP_MEMBERSHIP)");
242  return -1;
243  }
244  }
245 #endif
246  return 0;
247 }
248 
250  int sockfd, struct sockaddr *addr,
251  int addr_len, struct sockaddr_storage *local_addr,
252  struct sockaddr_storage *sources,
253  int nb_sources, int include)
254 {
255  int i;
256  if (addr->sa_family != AF_INET) {
257 #if HAVE_STRUCT_GROUP_SOURCE_REQ && defined(MCAST_BLOCK_SOURCE)
258  /* For IPv4 prefer the old approach, as that alone works reliably on
259  * Windows and it also supports supplying the interface based on its
260  * address. */
261  int i;
262  for (i = 0; i < nb_sources; i++) {
263  struct group_source_req mreqs;
264  int level = addr->sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
265 
266  //TODO: Interface index should be looked up from local_addr
267  mreqs.gsr_interface = 0;
268  memcpy(&mreqs.gsr_group, addr, addr_len);
269  memcpy(&mreqs.gsr_source, &sources[i], sizeof(*sources));
270 
271  if (setsockopt(sockfd, level,
272  include ? MCAST_JOIN_SOURCE_GROUP : MCAST_BLOCK_SOURCE,
273  (const void *)&mreqs, sizeof(mreqs)) < 0) {
274  if (include)
275  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(MCAST_JOIN_SOURCE_GROUP)");
276  else
277  ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(MCAST_BLOCK_SOURCE)");
278  return ff_neterrno();
279  }
280  }
281  return 0;
282 #else
284  "Setting multicast sources only supported for IPv4\n");
285  return AVERROR(EINVAL);
286 #endif
287  }
288 #if HAVE_STRUCT_IP_MREQ_SOURCE && defined(IP_BLOCK_SOURCE)
289  for (i = 0; i < nb_sources; i++) {
290  struct ip_mreq_source mreqs;
291  if (sources[i].ss_family != AF_INET) {
292  av_log(h, AV_LOG_ERROR, "Source/block address %d is of incorrect protocol family\n", i + 1);
293  return AVERROR(EINVAL);
294  }
295 
296  mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
297  if (local_addr)
298  mreqs.imr_interface = ((struct sockaddr_in *)local_addr)->sin_addr;
299  else
300  mreqs.imr_interface.s_addr = INADDR_ANY;
301  mreqs.imr_sourceaddr.s_addr = ((struct sockaddr_in *)&sources[i])->sin_addr.s_addr;
302 
303  if (setsockopt(sockfd, IPPROTO_IP,
304  include ? IP_ADD_SOURCE_MEMBERSHIP : IP_BLOCK_SOURCE,
305  (const void *)&mreqs, sizeof(mreqs)) < 0) {
306  if (include)
307  ff_log_net_error(h, AV_LOG_ERROR, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP)");
308  else
309  ff_log_net_error(h, AV_LOG_ERROR, "setsockopt(IP_BLOCK_SOURCE)");
310  return ff_neterrno();
311  }
312  }
313 #else
314  return AVERROR(ENOSYS);
315 #endif
316  return 0;
317 }
319  struct sockaddr_storage *addr,
320  const char *hostname, int port)
321 {
322  struct addrinfo *res0;
323  int addr_len;
324 
325  res0 = ff_ip_resolve_host(h, hostname, port, SOCK_DGRAM, AF_UNSPEC, 0);
326  if (!res0) return AVERROR(EIO);
327  memcpy(addr, res0->ai_addr, res0->ai_addrlen);
328  addr_len = res0->ai_addrlen;
329  freeaddrinfo(res0);
330 
331  return addr_len;
332 }
333 
334 static int udp_socket_create(URLContext *h, struct sockaddr_storage *addr,
335  socklen_t *addr_len, const char *localaddr)
336 {
337  UDPContext *s = h->priv_data;
338  int udp_fd = -1;
339  struct addrinfo *res0, *res;
340  int family = AF_UNSPEC;
341 
342  if (((struct sockaddr *) &s->dest_addr)->sa_family)
343  family = ((struct sockaddr *) &s->dest_addr)->sa_family;
344  res0 = ff_ip_resolve_host(h, (localaddr && localaddr[0]) ? localaddr : NULL,
345  s->local_port,
346  SOCK_DGRAM, family, AI_PASSIVE);
347  if (!res0)
348  goto fail;
349  for (res = res0; res; res=res->ai_next) {
350  if (s->udplite_coverage)
351  udp_fd = ff_socket(res->ai_family, SOCK_DGRAM, IPPROTO_UDPLITE);
352  else
353  udp_fd = ff_socket(res->ai_family, SOCK_DGRAM, 0);
354  if (udp_fd != -1) break;
355  ff_log_net_error(NULL, AV_LOG_ERROR, "socket");
356  }
357 
358  if (udp_fd < 0)
359  goto fail;
360 
361  memcpy(addr, res->ai_addr, res->ai_addrlen);
362  *addr_len = res->ai_addrlen;
363 
364  freeaddrinfo(res0);
365 
366  return udp_fd;
367 
368  fail:
369  if (udp_fd >= 0)
370  closesocket(udp_fd);
371  if(res0)
372  freeaddrinfo(res0);
373  return -1;
374 }
375 
376 static int udp_port(struct sockaddr_storage *addr, int addr_len)
377 {
378  char sbuf[sizeof(int)*3+1];
379  int error;
380 
381  if ((error = getnameinfo((struct sockaddr *)addr, addr_len, NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV)) != 0) {
382  av_log(NULL, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(error));
383  return -1;
384  }
385 
386  return strtol(sbuf, NULL, 10);
387 }
388 
389 
390 /**
391  * If no filename is given to av_open_input_file because you want to
392  * get the local port first, then you must call this function to set
393  * the remote server address.
394  *
395  * url syntax: udp://host:port[?option=val...]
396  * option: 'ttl=n' : set the ttl value (for multicast only)
397  * 'localport=n' : set the local port
398  * 'pkt_size=n' : set max packet size
399  * 'reuse=1' : enable reusing the socket
400  * 'overrun_nonfatal=1': survive in case of circular buffer overrun
401  *
402  * @param h media file context
403  * @param uri of the remote server
404  * @return zero if no error.
405  */
406 int ff_udp_set_remote_url(URLContext *h, const char *uri)
407 {
408  UDPContext *s = h->priv_data;
409  char hostname[256], buf[10];
410  int port;
411  const char *p;
412 
413  av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri);
414 
415  /* set the destination address */
416  s->dest_addr_len = udp_set_url(h, &s->dest_addr, hostname, port);
417  if (s->dest_addr_len < 0) {
418  return AVERROR(EIO);
419  }
420  s->is_multicast = ff_is_multicast_address((struct sockaddr*) &s->dest_addr);
421  p = strchr(uri, '?');
422  if (p) {
423  if (av_find_info_tag(buf, sizeof(buf), "connect", p)) {
424  int was_connected = s->is_connected;
425  s->is_connected = strtol(buf, NULL, 10);
426  if (s->is_connected && !was_connected) {
427  if (connect(s->udp_fd, (struct sockaddr *) &s->dest_addr,
428  s->dest_addr_len)) {
429  s->is_connected = 0;
430  ff_log_net_error(h, AV_LOG_ERROR, "connect");
431  return AVERROR(EIO);
432  }
433  }
434  }
435  }
436 
437  return 0;
438 }
439 
440 /**
441  * Return the local port used by the UDP connection
442  * @param h media file context
443  * @return the local port number
444  */
446 {
447  UDPContext *s = h->priv_data;
448  return s->local_port;
449 }
450 
451 /**
452  * Return the udp file handle for select() usage to wait for several RTP
453  * streams at the same time.
454  * @param h media file context
455  */
457 {
458  UDPContext *s = h->priv_data;
459  return s->udp_fd;
460 }
461 
462 #if HAVE_PTHREAD_CANCEL
463 static void *circular_buffer_task_rx( void *_URLContext)
464 {
465  URLContext *h = _URLContext;
466  UDPContext *s = h->priv_data;
467  int old_cancelstate;
468 
470  pthread_mutex_lock(&s->mutex);
471  if (ff_socket_nonblock(s->udp_fd, 0) < 0) {
472  av_log(h, AV_LOG_ERROR, "Failed to set blocking mode");
473  s->circular_buffer_error = AVERROR(EIO);
474  goto end;
475  }
476  while(1) {
477  int len;
478  struct sockaddr_storage addr;
479  socklen_t addr_len = sizeof(addr);
480 
481  pthread_mutex_unlock(&s->mutex);
482  /* Blocking operations are always cancellation points;
483  see "General Information" / "Thread Cancelation Overview"
484  in Single Unix. */
486  len = recvfrom(s->udp_fd, s->tmp+4, sizeof(s->tmp)-4, 0, (struct sockaddr *)&addr, &addr_len);
488  pthread_mutex_lock(&s->mutex);
489  if (len < 0) {
490  if (ff_neterrno() != AVERROR(EAGAIN) && ff_neterrno() != AVERROR(EINTR)) {
491  s->circular_buffer_error = ff_neterrno();
492  goto end;
493  }
494  continue;
495  }
496  if (ff_ip_check_source_lists(&addr, &s->filters))
497  continue;
498  AV_WL32(s->tmp, len);
499 
500  if(av_fifo_space(s->fifo) < len + 4) {
501  /* No Space left */
502  if (s->overrun_nonfatal) {
503  av_log(h, AV_LOG_WARNING, "Circular buffer overrun. "
504  "Surviving due to overrun_nonfatal option\n");
505  continue;
506  } else {
507  av_log(h, AV_LOG_ERROR, "Circular buffer overrun. "
508  "To avoid, increase fifo_size URL option. "
509  "To survive in such case, use overrun_nonfatal option\n");
510  s->circular_buffer_error = AVERROR(EIO);
511  goto end;
512  }
513  }
514  av_fifo_generic_write(s->fifo, s->tmp, len+4, NULL);
515  pthread_cond_signal(&s->cond);
516  }
517 
518 end:
519  pthread_cond_signal(&s->cond);
520  pthread_mutex_unlock(&s->mutex);
521  return NULL;
522 }
523 
524 static void *circular_buffer_task_tx( void *_URLContext)
525 {
526  URLContext *h = _URLContext;
527  UDPContext *s = h->priv_data;
528  int64_t target_timestamp = av_gettime_relative();
529  int64_t start_timestamp = av_gettime_relative();
530  int64_t sent_bits = 0;
531  int64_t burst_interval = s->bitrate ? (s->burst_bits * 1000000 / s->bitrate) : 0;
532  int64_t max_delay = s->bitrate ? ((int64_t)h->max_packet_size * 8 * 1000000 / s->bitrate + 1) : 0;
533 
534  pthread_mutex_lock(&s->mutex);
535 
536  if (ff_socket_nonblock(s->udp_fd, 0) < 0) {
537  av_log(h, AV_LOG_ERROR, "Failed to set blocking mode");
538  s->circular_buffer_error = AVERROR(EIO);
539  goto end;
540  }
541 
542  for(;;) {
543  int len;
544  const uint8_t *p;
545  uint8_t tmp[4];
546  int64_t timestamp;
547 
548  len = av_fifo_size(s->fifo);
549 
550  while (len<4) {
551  if (s->close_req)
552  goto end;
553  pthread_cond_wait(&s->cond, &s->mutex);
554  len = av_fifo_size(s->fifo);
555  }
556 
557  av_fifo_generic_read(s->fifo, tmp, 4, NULL);
558  len = AV_RL32(tmp);
559 
560  av_assert0(len >= 0);
561  av_assert0(len <= sizeof(s->tmp));
562 
563  av_fifo_generic_read(s->fifo, s->tmp, len, NULL);
564 
565  pthread_mutex_unlock(&s->mutex);
566 
567  if (s->bitrate) {
568  timestamp = av_gettime_relative();
569  if (timestamp < target_timestamp) {
570  int64_t delay = target_timestamp - timestamp;
571  if (delay > max_delay) {
572  delay = max_delay;
573  start_timestamp = timestamp + delay;
574  sent_bits = 0;
575  }
576  av_usleep(delay);
577  } else {
578  if (timestamp - burst_interval > target_timestamp) {
579  start_timestamp = timestamp - burst_interval;
580  sent_bits = 0;
581  }
582  }
583  sent_bits += len * 8;
584  target_timestamp = start_timestamp + sent_bits * 1000000 / s->bitrate;
585  }
586 
587  p = s->tmp;
588  while (len) {
589  int ret;
590  av_assert0(len > 0);
591  if (!s->is_connected) {
592  ret = sendto (s->udp_fd, p, len, 0,
593  (struct sockaddr *) &s->dest_addr,
594  s->dest_addr_len);
595  } else
596  ret = send(s->udp_fd, p, len, 0);
597  if (ret >= 0) {
598  len -= ret;
599  p += ret;
600  } else {
601  ret = ff_neterrno();
602  if (ret != AVERROR(EAGAIN) && ret != AVERROR(EINTR)) {
603  pthread_mutex_lock(&s->mutex);
604  s->circular_buffer_error = ret;
605  pthread_mutex_unlock(&s->mutex);
606  return NULL;
607  }
608  }
609  }
610 
611  pthread_mutex_lock(&s->mutex);
612  }
613 
614 end:
615  pthread_mutex_unlock(&s->mutex);
616  return NULL;
617 }
618 
619 
620 #endif
621 
622 /* put it in UDP context */
623 /* return non zero if error */
624 static int udp_open(URLContext *h, const char *uri, int flags)
625 {
626  char hostname[1024], localaddr[1024] = "";
627  int port, udp_fd = -1, tmp, bind_ret = -1, dscp = -1;
628  UDPContext *s = h->priv_data;
629  int is_output;
630  const char *p;
631  char buf[256];
632  struct sockaddr_storage my_addr;
633  socklen_t len;
634  int ret;
635 
636  h->is_streamed = 1;
637 
638  is_output = !(flags & AVIO_FLAG_READ);
639  if (s->buffer_size < 0)
640  s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_RX_BUF_SIZE;
641 
642  if (s->sources) {
643  if ((ret = ff_ip_parse_sources(h, s->sources, &s->filters)) < 0)
644  goto fail;
645  }
646 
647  if (s->block) {
648  if ((ret = ff_ip_parse_blocks(h, s->block, &s->filters)) < 0)
649  goto fail;
650  }
651 
652  p = strchr(uri, '?');
653  if (p) {
654  if (av_find_info_tag(buf, sizeof(buf), "reuse", p)) {
655  char *endptr = NULL;
656  s->reuse_socket = strtol(buf, &endptr, 10);
657  /* assume if no digits were found it is a request to enable it */
658  if (buf == endptr)
659  s->reuse_socket = 1;
660  }
661  if (av_find_info_tag(buf, sizeof(buf), "overrun_nonfatal", p)) {
662  char *endptr = NULL;
663  s->overrun_nonfatal = strtol(buf, &endptr, 10);
664  /* assume if no digits were found it is a request to enable it */
665  if (buf == endptr)
666  s->overrun_nonfatal = 1;
667  if (!HAVE_PTHREAD_CANCEL)
669  "'overrun_nonfatal' option was set but it is not supported "
670  "on this build (pthread support is required)\n");
671  }
672  if (av_find_info_tag(buf, sizeof(buf), "ttl", p)) {
673  s->ttl = strtol(buf, NULL, 10);
674  }
675  if (av_find_info_tag(buf, sizeof(buf), "udplite_coverage", p)) {
676  s->udplite_coverage = strtol(buf, NULL, 10);
677  }
678  if (av_find_info_tag(buf, sizeof(buf), "localport", p)) {
679  s->local_port = strtol(buf, NULL, 10);
680  }
681  if (av_find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
682  s->pkt_size = strtol(buf, NULL, 10);
683  }
684  if (av_find_info_tag(buf, sizeof(buf), "buffer_size", p)) {
685  s->buffer_size = strtol(buf, NULL, 10);
686  }
687  if (av_find_info_tag(buf, sizeof(buf), "connect", p)) {
688  s->is_connected = strtol(buf, NULL, 10);
689  }
690  if (av_find_info_tag(buf, sizeof(buf), "dscp", p)) {
691  dscp = strtol(buf, NULL, 10);
692  }
693  if (av_find_info_tag(buf, sizeof(buf), "fifo_size", p)) {
694  s->circular_buffer_size = strtol(buf, NULL, 10);
695  if (!HAVE_PTHREAD_CANCEL)
697  "'circular_buffer_size' option was set but it is not supported "
698  "on this build (pthread support is required)\n");
699  }
700  if (av_find_info_tag(buf, sizeof(buf), "bitrate", p)) {
701  s->bitrate = strtoll(buf, NULL, 10);
702  if (!HAVE_PTHREAD_CANCEL)
704  "'bitrate' option was set but it is not supported "
705  "on this build (pthread support is required)\n");
706  }
707  if (av_find_info_tag(buf, sizeof(buf), "burst_bits", p)) {
708  s->burst_bits = strtoll(buf, NULL, 10);
709  }
710  if (av_find_info_tag(buf, sizeof(buf), "localaddr", p)) {
711  av_strlcpy(localaddr, buf, sizeof(localaddr));
712  }
713  if (av_find_info_tag(buf, sizeof(buf), "sources", p)) {
714  if ((ret = ff_ip_parse_sources(h, buf, &s->filters)) < 0)
715  goto fail;
716  }
717  if (av_find_info_tag(buf, sizeof(buf), "block", p)) {
718  if ((ret = ff_ip_parse_blocks(h, buf, &s->filters)) < 0)
719  goto fail;
720  }
721  if (!is_output && av_find_info_tag(buf, sizeof(buf), "timeout", p))
722  s->timeout = strtol(buf, NULL, 10);
723  if (is_output && av_find_info_tag(buf, sizeof(buf), "broadcast", p))
724  s->is_broadcast = strtol(buf, NULL, 10);
725  }
726  /* handling needed to support options picking from both AVOption and URL */
727  s->circular_buffer_size *= 188;
728  if (flags & AVIO_FLAG_WRITE) {
729  h->max_packet_size = s->pkt_size;
730  } else {
731  h->max_packet_size = UDP_MAX_PKT_SIZE;
732  }
733  h->rw_timeout = s->timeout;
734 
735  /* fill the dest addr */
736  av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri);
737 
738  /* XXX: fix av_url_split */
739  if (hostname[0] == '\0' || hostname[0] == '?') {
740  /* only accepts null hostname if input */
741  if (!(flags & AVIO_FLAG_READ))
742  goto fail;
743  } else {
744  if ((ret = ff_udp_set_remote_url(h, uri)) < 0)
745  goto fail;
746  }
747 
748  if ((s->is_multicast || s->local_port <= 0) && (h->flags & AVIO_FLAG_READ))
749  s->local_port = port;
750 
751  if (localaddr[0])
752  udp_fd = udp_socket_create(h, &my_addr, &len, localaddr);
753  else
754  udp_fd = udp_socket_create(h, &my_addr, &len, s->localaddr);
755  if (udp_fd < 0)
756  goto fail;
757 
758  s->local_addr_storage=my_addr; //store for future multicast join
759 
760  /* Follow the requested reuse option, unless it's multicast in which
761  * case enable reuse unless explicitly disabled.
762  */
763  if (s->reuse_socket > 0 || (s->is_multicast && s->reuse_socket < 0)) {
764  s->reuse_socket = 1;
765  if (setsockopt (udp_fd, SOL_SOCKET, SO_REUSEADDR, &(s->reuse_socket), sizeof(s->reuse_socket)) != 0) {
766  ret = ff_neterrno();
767  goto fail;
768  }
769  }
770 
771  if (s->is_broadcast) {
772 #ifdef SO_BROADCAST
773  if (setsockopt (udp_fd, SOL_SOCKET, SO_BROADCAST, &(s->is_broadcast), sizeof(s->is_broadcast)) != 0) {
774  ret = ff_neterrno();
775  goto fail;
776  }
777 #else
778  ret = AVERROR(ENOSYS);
779  goto fail;
780 #endif
781  }
782 
783  /* Set the checksum coverage for UDP-Lite (RFC 3828) for sending and receiving.
784  * The receiver coverage has to be less than or equal to the sender coverage.
785  * Otherwise, the receiver will drop all packets.
786  */
787  if (s->udplite_coverage) {
788  if (setsockopt (udp_fd, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, &(s->udplite_coverage), sizeof(s->udplite_coverage)) != 0)
789  av_log(h, AV_LOG_WARNING, "socket option UDPLITE_SEND_CSCOV not available");
790 
791  if (setsockopt (udp_fd, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, &(s->udplite_coverage), sizeof(s->udplite_coverage)) != 0)
792  av_log(h, AV_LOG_WARNING, "socket option UDPLITE_RECV_CSCOV not available");
793  }
794 
795  if (dscp >= 0) {
796  dscp <<= 2;
797  if (setsockopt (udp_fd, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp)) != 0) {
798  ret = ff_neterrno();
799  goto fail;
800  }
801  }
802 
803  /* If multicast, try binding the multicast address first, to avoid
804  * receiving UDP packets from other sources aimed at the same UDP
805  * port. This fails on windows. This makes sending to the same address
806  * using sendto() fail, so only do it if we're opened in read-only mode. */
807  if (s->is_multicast && (h->flags & AVIO_FLAG_READ)) {
808  bind_ret = bind(udp_fd,(struct sockaddr *)&s->dest_addr, len);
809  }
810  /* bind to the local address if not multicast or if the multicast
811  * bind failed */
812  /* the bind is needed to give a port to the socket now */
813  if (bind_ret < 0 && bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0) {
814  ff_log_net_error(h, AV_LOG_ERROR, "bind failed");
815  ret = ff_neterrno();
816  goto fail;
817  }
818 
819  len = sizeof(my_addr);
820  getsockname(udp_fd, (struct sockaddr *)&my_addr, &len);
821  s->local_port = udp_port(&my_addr, len);
822 
823  if (s->is_multicast) {
824  if (h->flags & AVIO_FLAG_WRITE) {
825  /* output */
826  if ((ret = udp_set_multicast_ttl(udp_fd, s->ttl, (struct sockaddr *)&s->dest_addr)) < 0)
827  goto fail;
828  }
829  if (h->flags & AVIO_FLAG_READ) {
830  /* input */
831  if (s->filters.nb_include_addrs) {
832  if ((ret = udp_set_multicast_sources(h, udp_fd,
833  (struct sockaddr *)&s->dest_addr,
834  s->dest_addr_len, &s->local_addr_storage,
835  s->filters.include_addrs,
836  s->filters.nb_include_addrs, 1)) < 0)
837  goto fail;
838  } else {
839  if ((ret = udp_join_multicast_group(udp_fd, (struct sockaddr *)&s->dest_addr,(struct sockaddr *)&s->local_addr_storage)) < 0)
840  goto fail;
841  }
842  if (s->filters.nb_exclude_addrs) {
843  if ((ret = udp_set_multicast_sources(h, udp_fd,
844  (struct sockaddr *)&s->dest_addr,
845  s->dest_addr_len, &s->local_addr_storage,
846  s->filters.exclude_addrs,
847  s->filters.nb_exclude_addrs, 0)) < 0)
848  goto fail;
849  }
850  }
851  }
852 
853  if (is_output) {
854  /* limit the tx buf size to limit latency */
855  tmp = s->buffer_size;
856  if (setsockopt(udp_fd, SOL_SOCKET, SO_SNDBUF, &tmp, sizeof(tmp)) < 0) {
857  ff_log_net_error(h, AV_LOG_ERROR, "setsockopt(SO_SNDBUF)");
858  ret = ff_neterrno();
859  goto fail;
860  }
861  } else {
862  /* set udp recv buffer size to the requested value (default UDP_RX_BUF_SIZE) */
863  tmp = s->buffer_size;
864  if (setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp)) < 0) {
865  ff_log_net_error(h, AV_LOG_WARNING, "setsockopt(SO_RECVBUF)");
866  }
867  len = sizeof(tmp);
868  if (getsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, &len) < 0) {
869  ff_log_net_error(h, AV_LOG_WARNING, "getsockopt(SO_RCVBUF)");
870  } else {
871  av_log(h, AV_LOG_DEBUG, "end receive buffer size reported is %d\n", tmp);
872  if(tmp < s->buffer_size)
873  av_log(h, AV_LOG_WARNING, "attempted to set receive buffer to size %d but it only ended up set as %d\n", s->buffer_size, tmp);
874  }
875 
876  /* make the socket non-blocking */
877  ff_socket_nonblock(udp_fd, 1);
878  }
879  if (s->is_connected) {
880  if (connect(udp_fd, (struct sockaddr *) &s->dest_addr, s->dest_addr_len)) {
881  ff_log_net_error(h, AV_LOG_ERROR, "connect");
882  ret = ff_neterrno();
883  goto fail;
884  }
885  }
886 
887  s->udp_fd = udp_fd;
888 
889 #if HAVE_PTHREAD_CANCEL
890  /*
891  Create thread in case of:
892  1. Input and circular_buffer_size is set
893  2. Output and bitrate and circular_buffer_size is set
894  */
895 
896  if (is_output && s->bitrate && !s->circular_buffer_size) {
897  /* Warn user in case of 'circular_buffer_size' is not set */
898  av_log(h, AV_LOG_WARNING,"'bitrate' option was set but 'circular_buffer_size' is not, but required\n");
899  }
900 
901  if ((!is_output && s->circular_buffer_size) || (is_output && s->bitrate && s->circular_buffer_size)) {
902  /* start the task going */
903  s->fifo = av_fifo_alloc(s->circular_buffer_size);
904  if (!s->fifo) {
905  ret = AVERROR(ENOMEM);
906  goto fail;
907  }
908  ret = pthread_mutex_init(&s->mutex, NULL);
909  if (ret != 0) {
910  av_log(h, AV_LOG_ERROR, "pthread_mutex_init failed : %s\n", strerror(ret));
911  ret = AVERROR(ret);
912  goto fail;
913  }
914  ret = pthread_cond_init(&s->cond, NULL);
915  if (ret != 0) {
916  av_log(h, AV_LOG_ERROR, "pthread_cond_init failed : %s\n", strerror(ret));
917  ret = AVERROR(ret);
918  goto cond_fail;
919  }
920  ret = pthread_create(&s->circular_buffer_thread, NULL, is_output?circular_buffer_task_tx:circular_buffer_task_rx, h);
921  if (ret != 0) {
922  av_log(h, AV_LOG_ERROR, "pthread_create failed : %s\n", strerror(ret));
923  ret = AVERROR(ret);
924  goto thread_fail;
925  }
926  s->thread_started = 1;
927  }
928 #endif
929 
930  return 0;
931 #if HAVE_PTHREAD_CANCEL
932  thread_fail:
933  pthread_cond_destroy(&s->cond);
934  cond_fail:
935  pthread_mutex_destroy(&s->mutex);
936 #endif
937  fail:
938  if (udp_fd >= 0)
939  closesocket(udp_fd);
940  av_fifo_freep(&s->fifo);
941  ff_ip_reset_filters(&s->filters);
942  return ret;
943 }
944 
945 static int udplite_open(URLContext *h, const char *uri, int flags)
946 {
947  UDPContext *s = h->priv_data;
948 
949  // set default checksum coverage
950  s->udplite_coverage = UDP_HEADER_SIZE;
951 
952  return udp_open(h, uri, flags);
953 }
954 
955 static int udp_read(URLContext *h, uint8_t *buf, int size)
956 {
957  UDPContext *s = h->priv_data;
958  int ret;
959  struct sockaddr_storage addr;
960  socklen_t addr_len = sizeof(addr);
961 #if HAVE_PTHREAD_CANCEL
962  int avail, nonblock = h->flags & AVIO_FLAG_NONBLOCK;
963 
964  if (s->fifo) {
965  pthread_mutex_lock(&s->mutex);
966  do {
967  avail = av_fifo_size(s->fifo);
968  if (avail) { // >=size) {
969  uint8_t tmp[4];
970 
971  av_fifo_generic_read(s->fifo, tmp, 4, NULL);
972  avail = AV_RL32(tmp);
973  if(avail > size){
974  av_log(h, AV_LOG_WARNING, "Part of datagram lost due to insufficient buffer size\n");
975  avail = size;
976  }
977 
978  av_fifo_generic_read(s->fifo, buf, avail, NULL);
979  av_fifo_drain(s->fifo, AV_RL32(tmp) - avail);
980  pthread_mutex_unlock(&s->mutex);
981  return avail;
982  } else if(s->circular_buffer_error){
983  int err = s->circular_buffer_error;
984  pthread_mutex_unlock(&s->mutex);
985  return err;
986  } else if(nonblock) {
987  pthread_mutex_unlock(&s->mutex);
988  return AVERROR(EAGAIN);
989  } else {
990  /* FIXME: using the monotonic clock would be better,
991  but it does not exist on all supported platforms. */
992  int64_t t = av_gettime() + 100000;
993  struct timespec tv = { .tv_sec = t / 1000000,
994  .tv_nsec = (t % 1000000) * 1000 };
995  int err = pthread_cond_timedwait(&s->cond, &s->mutex, &tv);
996  if (err) {
997  pthread_mutex_unlock(&s->mutex);
998  return AVERROR(err == ETIMEDOUT ? EAGAIN : err);
999  }
1000  nonblock = 1;
1001  }
1002  } while(1);
1003  }
1004 #endif
1005 
1006  if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
1007  ret = ff_network_wait_fd(s->udp_fd, 0);
1008  if (ret < 0)
1009  return ret;
1010  }
1011  ret = recvfrom(s->udp_fd, buf, size, 0, (struct sockaddr *)&addr, &addr_len);
1012  if (ret < 0)
1013  return ff_neterrno();
1014  if (ff_ip_check_source_lists(&addr, &s->filters))
1015  return AVERROR(EINTR);
1016  return ret;
1017 }
1018 
1019 static int udp_write(URLContext *h, const uint8_t *buf, int size)
1020 {
1021  UDPContext *s = h->priv_data;
1022  int ret;
1023 
1024 #if HAVE_PTHREAD_CANCEL
1025  if (s->fifo) {
1026  uint8_t tmp[4];
1027 
1028  pthread_mutex_lock(&s->mutex);
1029 
1030  /*
1031  Return error if last tx failed.
1032  Here we can't know on which packet error was, but it needs to know that error exists.
1033  */
1034  if (s->circular_buffer_error<0) {
1035  int err = s->circular_buffer_error;
1036  pthread_mutex_unlock(&s->mutex);
1037  return err;
1038  }
1039 
1040  if(av_fifo_space(s->fifo) < size + 4) {
1041  /* What about a partial packet tx ? */
1042  pthread_mutex_unlock(&s->mutex);
1043  return AVERROR(ENOMEM);
1044  }
1045  AV_WL32(tmp, size);
1046  av_fifo_generic_write(s->fifo, tmp, 4, NULL); /* size of packet */
1047  av_fifo_generic_write(s->fifo, (uint8_t *)buf, size, NULL); /* the data */
1048  pthread_cond_signal(&s->cond);
1049  pthread_mutex_unlock(&s->mutex);
1050  return size;
1051  }
1052 #endif
1053  if (!(h->flags & AVIO_FLAG_NONBLOCK)) {
1054  ret = ff_network_wait_fd(s->udp_fd, 1);
1055  if (ret < 0)
1056  return ret;
1057  }
1058 
1059  if (!s->is_connected) {
1060  ret = sendto (s->udp_fd, buf, size, 0,
1061  (struct sockaddr *) &s->dest_addr,
1062  s->dest_addr_len);
1063  } else
1064  ret = send(s->udp_fd, buf, size, 0);
1065 
1066  return ret < 0 ? ff_neterrno() : ret;
1067 }
1068 
1069 static int udp_close(URLContext *h)
1070 {
1071  UDPContext *s = h->priv_data;
1072 
1073 #if HAVE_PTHREAD_CANCEL
1074  // Request close once writing is finished
1075  if (s->thread_started && !(h->flags & AVIO_FLAG_READ)) {
1076  pthread_mutex_lock(&s->mutex);
1077  s->close_req = 1;
1078  pthread_cond_signal(&s->cond);
1079  pthread_mutex_unlock(&s->mutex);
1080  }
1081 #endif
1082 
1083  if (s->is_multicast && (h->flags & AVIO_FLAG_READ))
1084  udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr,(struct sockaddr *)&s->local_addr_storage);
1085 #if HAVE_PTHREAD_CANCEL
1086  if (s->thread_started) {
1087  int ret;
1088  // Cancel only read, as write has been signaled as success to the user
1089  if (h->flags & AVIO_FLAG_READ) {
1090 #ifdef _WIN32
1091  /* recvfrom() is not a cancellation point for win32, so we shutdown
1092  * the socket and abort pending IO, subsequent recvfrom() calls
1093  * will fail with WSAESHUTDOWN causing the thread to exit. */
1094  shutdown(s->udp_fd, SD_RECEIVE);
1095  CancelIoEx((HANDLE)(SOCKET)s->udp_fd, NULL);
1096 #else
1097  pthread_cancel(s->circular_buffer_thread);
1098 #endif
1099  }
1100  ret = pthread_join(s->circular_buffer_thread, NULL);
1101  if (ret != 0)
1102  av_log(h, AV_LOG_ERROR, "pthread_join(): %s\n", strerror(ret));
1103  pthread_mutex_destroy(&s->mutex);
1104  pthread_cond_destroy(&s->cond);
1105  }
1106 #endif
1107  closesocket(s->udp_fd);
1108  av_fifo_freep(&s->fifo);
1109  ff_ip_reset_filters(&s->filters);
1110  return 0;
1111 }
1112 
1114  .name = "udp",
1115  .url_open = udp_open,
1116  .url_read = udp_read,
1117  .url_write = udp_write,
1118  .url_close = udp_close,
1119  .url_get_file_handle = udp_get_file_handle,
1120  .priv_data_size = sizeof(UDPContext),
1121  .priv_data_class = &udp_class,
1123 };
1124 
1126  .name = "udplite",
1127  .url_open = udplite_open,
1128  .url_read = udp_read,
1129  .url_write = udp_write,
1130  .url_close = udp_close,
1131  .url_get_file_handle = udp_get_file_handle,
1132  .priv_data_size = sizeof(UDPContext),
1133  .priv_data_class = &udplite_context_class,
1135 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
pthread_mutex_t
_fmutex pthread_mutex_t
Definition: os2threads.h:53
PTHREAD_CANCEL_ENABLE
#define PTHREAD_CANCEL_ENABLE
Definition: w32pthreads.h:66
pthread_join
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
Definition: os2threads.h:94
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
ff_udp_get_local_port
int ff_udp_get_local_port(URLContext *h)
Return the local port used by the UDP connection.
Definition: udp.c:445
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
level
uint8_t level
Definition: svq3.c:204
udp_join_multicast_group
static int udp_join_multicast_group(int sockfd, struct sockaddr *addr, struct sockaddr *local_addr)
Definition: udp.c:183
AVERROR
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
opt.h
av_find_info_tag
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.
Definition: parseutils.c:751
UDPContext::pkt_size
int pkt_size
Definition: udp.c:89
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:426
UDPContext::is_connected
int is_connected
Definition: udp.c:97
PTHREAD_CANCEL_DISABLE
#define PTHREAD_CANCEL_DISABLE
Definition: w32pthreads.h:67
av_fifo_generic_write
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
Definition: fifo.c:122
URL_PROTOCOL_FLAG_NETWORK
#define URL_PROTOCOL_FLAG_NETWORK
Definition: url.h:34
ff_ip_parse_sources
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...
Definition: ip.c:143
udp_socket_create
static int udp_socket_create(URLContext *h, struct sockaddr_storage *addr, socklen_t *addr_len, const char *localaddr)
Definition: udp.c:334
thread.h
E
#define E
Definition: udp.c:124
pthread_mutex_init
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
Definition: os2threads.h:104
IPPROTO_UDPLITE
#define IPPROTO_UDPLITE
Definition: udp.c:61
NI_NUMERICSERV
#define NI_NUMERICSERV
Definition: network.h:203
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
OFFSET
#define OFFSET(x)
Definition: udp.c:122
sources
Note except for filters that can have queued frames and sources
Definition: filter_design.txt:285
AVOption
AVOption.
Definition: opt.h:247
ff_log_net_error
void ff_log_net_error(void *ctx, int level, const char *prefix)
Definition: network.c:581
ff_socket
int ff_socket(int af, int type, int proto)
Definition: network.c:183
udp_port
static int udp_port(struct sockaddr_storage *addr, int addr_len)
Definition: udp.c:376
ff_udp_set_remote_url
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,...
Definition: udp.c:406
UDPLITE_RECV_CSCOV
#define UDPLITE_RECV_CSCOV
Definition: udp.c:57
av_fifo_generic_read
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
Definition: fifo.c:213
udplite_context_class
static const AVClass udplite_context_class
Definition: udp.c:154
URLProtocol
Definition: url.h:54
os_support.h
UDPContext::bitrate
int64_t bitrate
Definition: udp.c:103
UDPContext::local_addr_storage
struct sockaddr_storage local_addr_storage
Definition: udp.c:116
UDPContext::is_broadcast
int is_broadcast
Definition: udp.c:91
av_fifo_drain
void av_fifo_drain(AVFifoBuffer *f, int size)
Discard data from the FIFO.
Definition: fifo.c:233
sockaddr_storage
Definition: network.h:111
AVFifoBuffer
Definition: fifo.h:31
UDPContext::is_multicast
int is_multicast
Definition: udp.c:90
UDPContext::fifo
AVFifoBuffer * fifo
Definition: udp.c:101
freeaddrinfo
#define freeaddrinfo
Definition: network.h:218
fifo.h
ff_ip_reset_filters
void ff_ip_reset_filters(IPSourceFilters *filters)
Resets the IP filter list and frees the internal fields of an IPSourceFilters structure.
Definition: ip.c:153
ff_udp_protocol
const URLProtocol ff_udp_protocol
Definition: udp.c:1113
fail
#define fail()
Definition: checkasm.h:127
UDPContext::filters
IPSourceFilters filters
Definition: udp.c:119
udp_set_url
static int udp_set_url(URLContext *h, struct sockaddr_storage *addr, const char *hostname, int port)
Definition: udp.c:318
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_fifo_space
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
Definition: fifo.c:82
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
UDPContext::remaining_in_dg
int remaining_in_dg
Definition: udp.c:113
UDPContext::close_req
int close_req
Definition: udp.c:105
AV_OPT_TYPE_INT64
@ AV_OPT_TYPE_INT64
Definition: opt.h:225
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
UDPContext::dest_addr_len
int dest_addr_len
Definition: udp.c:96
AVIO_FLAG_WRITE
#define AVIO_FLAG_WRITE
write-only
Definition: avio.h:604
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
pthread_create
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
Definition: os2threads.h:80
UDPContext::reuse_socket
int reuse_socket
Definition: udp.c:93
internal.h
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
ff_ip_parse_blocks
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...
Definition: ip.c:148
UDPContext::circular_buffer_size
int circular_buffer_size
Definition: udp.c:100
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
UDPContext::overrun_nonfatal
int overrun_nonfatal
Definition: udp.c:94
parseutils.h
ff_is_multicast_address
int ff_is_multicast_address(struct sockaddr *addr)
Definition: network.c:145
UDPContext::localaddr
char * localaddr
Definition: udp.c:114
time.h
ff_neterrno
#define ff_neterrno()
Definition: network.h:68
addrinfo::ai_addr
struct sockaddr * ai_addr
Definition: network.h:143
pthread_mutex_unlock
#define pthread_mutex_unlock(a)
Definition: ffprobe.c:68
UDPContext::buffer_size
int buffer_size
Definition: udp.c:88
ff_ip_resolve_host
struct addrinfo * ff_ip_resolve_host(void *log_ctx, const char *hostname, int port, int type, int family, int flags)
Resolves hostname into an addrinfo structure.
Definition: ip.c:63
options
static const AVOption options[]
Definition: udp.c:125
addrinfo::ai_family
int ai_family
Definition: network.h:139
UDPContext::udp_fd
int udp_fd
Definition: udp.c:85
UDPContext::circular_buffer_error
int circular_buffer_error
Definition: udp.c:102
UDPContext
Definition: udp.c:83
size
int size
Definition: twinvq_data.h:10344
UDP_RX_BUF_SIZE
#define UDP_RX_BUF_SIZE
Definition: udp.c:79
URLProtocol::name
const char * name
Definition: url.h:55
UDPContext::burst_bits
int64_t burst_bits
Definition: udp.c:104
ff_socket_nonblock
int ff_socket_nonblock(int socket, int enable)
UDPContext::block
char * block
Definition: udp.c:118
udplite_open
static int udplite_open(URLContext *h, const char *uri, int flags)
Definition: udp.c:945
gai_strerror
#define gai_strerror
Definition: network.h:225
bitrate
int64_t bitrate
Definition: h264_levels.c:131
UDPContext::local_port
int local_port
Definition: udp.c:92
pthread_t
Definition: os2threads.h:44
UDPContext::ttl
int ttl
Definition: udp.c:86
pthread_cond_destroy
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
Definition: os2threads.h:144
addrinfo::ai_next
struct addrinfo * ai_next
Definition: network.h:145
addrinfo::ai_addrlen
int ai_addrlen
Definition: network.h:142
pthread_mutex_destroy
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
Definition: os2threads.h:112
udp_close
static int udp_close(URLContext *h)
Definition: udp.c:1069
UDP_MAX_PKT_SIZE
#define UDP_MAX_PKT_SIZE
Definition: udp.c:80
URLContext
Definition: url.h:38
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
avio_internal.h
getnameinfo
#define getnameinfo
Definition: network.h:219
ip.h
UDPContext::dest_addr
struct sockaddr_storage dest_addr
Definition: udp.c:95
av_url_split
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.
Definition: utils.c:1001
url.h
len
int len
Definition: vorbis_enc_data.h:426
pthread_cond_t
Definition: os2threads.h:58
ff_udplite_protocol
const URLProtocol ff_udplite_protocol
Definition: udp.c:1125
pthread_setcancelstate
static int pthread_setcancelstate(int state, int *oldstate)
Definition: w32pthreads.h:186
udp_read
static int udp_read(URLContext *h, uint8_t *buf, int size)
Definition: udp.c:955
udp_set_multicast_sources
static int udp_set_multicast_sources(URLContext *h, int sockfd, struct sockaddr *addr, int addr_len, struct sockaddr_storage *local_addr, struct sockaddr_storage *sources, int nb_sources, int include)
Definition: udp.c:249
ret
ret
Definition: filter_design.txt:187
UDP_TX_BUF_SIZE
#define UDP_TX_BUF_SIZE
Definition: udp.c:78
D
#define D
Definition: udp.c:123
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
avformat.h
UDPContext::timeout
int timeout
Definition: udp.c:115
network.h
pthread_cond_signal
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
Definition: os2threads.h:152
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
IPSourceFilters
Structure for storing IP (UDP) source filters or block lists.
Definition: ip.h:29
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
IPV6_DROP_MEMBERSHIP
#define IPV6_DROP_MEMBERSHIP
Definition: udp.c:75
udp_write
static int udp_write(URLContext *h, const uint8_t *buf, int size)
Definition: udp.c:1019
ff_ip_check_source_lists
int ff_ip_check_source_lists(struct sockaddr_storage *source_addr_ptr, IPSourceFilters *s)
Checks the source address against a given IP source filter.
Definition: ip.c:44
udp_open
static int udp_open(URLContext *h, const char *uri, int flags)
Definition: udp.c:624
pthread_cond_wait
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
Definition: os2threads.h:192
av_gettime
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:603
av_fifo_size
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
Definition: fifo.c:77
av_fifo_freep
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
Definition: fifo.c:63
udp_get_file_handle
static int udp_get_file_handle(URLContext *h)
Return the udp file handle for select() usage to wait for several RTP streams at the same time.
Definition: udp.c:456
udp_set_multicast_ttl
static int udp_set_multicast_ttl(int sockfd, int mcastTTL, struct sockaddr *addr)
Definition: udp.c:161
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
AVIO_FLAG_NONBLOCK
#define AVIO_FLAG_NONBLOCK
Use non-blocking mode.
Definition: avio.h:622
UDPContext::tmp
uint8_t tmp[UDP_MAX_PKT_SIZE+4]
Definition: udp.c:112
UDPContext::sources
char * sources
Definition: udp.c:117
av_fifo_alloc
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
Definition: fifo.c:43
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
av_strlcpy
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.
Definition: avstring.c:83
pthread_cond_timedwait
static av_always_inline int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
Definition: os2threads.h:170
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
UDPContext::udplite_coverage
int udplite_coverage
Definition: udp.c:87
pthread_cond_init
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
Definition: os2threads.h:133
h
h
Definition: vp9dsp_template.c:2038
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
addrinfo
Definition: network.h:137
udp_leave_multicast_group
static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr, struct sockaddr *local_addr)
Definition: udp.c:216
IPV6_ADD_MEMBERSHIP
#define IPV6_ADD_MEMBERSHIP
Definition: udp.c:74
int
int
Definition: ffmpeg_filter.c:156
UDP_HEADER_SIZE
#define UDP_HEADER_SIZE
Definition: udp.c:81
cond
int(* cond)(enum AVPixelFormat pix_fmt)
Definition: pixdesc_query.c:28
udp_class
static const AVClass udp_class
Definition: udp.c:147
mutex
static AVMutex mutex
Definition: log.c:44
AI_PASSIVE
#define AI_PASSIVE
Definition: network.h:179
UDPLITE_SEND_CSCOV
#define UDPLITE_SEND_CSCOV
Definition: udp.c:56
pthread_mutex_lock
#define pthread_mutex_lock(a)
Definition: ffprobe.c:64
ff_network_wait_fd
int ff_network_wait_fd(int fd, int write)
Definition: network.c:69