]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtpproto.c
Add a lowercase parameter to ff_data_to_hex
[ffmpeg] / libavformat / rtpproto.c
index b78c759b02e425cbb77bbd1727b83eda2e94195b..35bbc186361d38049b6c0cb0d5b622e1e2e7d745 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * RTP network protocol
- * Copyright (c) 2002 Fabrice Bellard.
+ * Copyright (c) 2002 Fabrice Bellard
  *
  * This file is part of FFmpeg.
  *
  */
 
 /**
- * @file rtpproto.c
+ * @file libavformat/rtpproto.c
  * RTP protocol
  */
 
 #include "libavutil/avstring.h"
 #include "avformat.h"
+#include "rtpdec.h"
 
 #include <unistd.h>
 #include <stdarg.h>
+#include "internal.h"
 #include "network.h"
 #include "os_support.h"
 #include <fcntl.h>
-#ifdef HAVE_SYS_SELECT_H
+#if HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
+#include <sys/time.h>
 
 #define RTP_TX_BUF_SIZE  (64 * 1024)
 #define RTP_RX_BUF_SIZE  (128 * 1024)
@@ -63,13 +66,13 @@ int rtp_set_remote_url(URLContext *h, const char *uri)
     char buf[1024];
     char path[1024];
 
-    url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
-              path, sizeof(path), uri);
+    ff_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
+                 path, sizeof(path), uri);
 
-    snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port, path);
+    ff_url_join(buf, sizeof(buf), "udp", NULL, hostname, port, "%s", path);
     udp_set_remote_url(s->rtp_hd, buf);
 
-    snprintf(buf, sizeof(buf), "udp://%s:%d%s", hostname, port + 1, path);
+    ff_url_join(buf, sizeof(buf), "udp", NULL, hostname, port + 1, "%s", path);
     udp_set_remote_url(s->rtcp_hd, buf);
     return 0;
 }
@@ -100,7 +103,7 @@ static void build_udp_url(char *buf, int buf_size,
                           int local_port, int ttl,
                           int max_packet_size)
 {
-    snprintf(buf, buf_size, "udp://%s:%d", hostname, port);
+    ff_url_join(buf, buf_size, "udp", NULL, hostname, port, NULL);
     if (local_port >= 0)
         url_add_option(buf, buf_size, "localport=%d", local_port);
     if (ttl >= 0)
@@ -133,8 +136,8 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
         return AVERROR(ENOMEM);
     h->priv_data = s;
 
-    url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
-              path, sizeof(path), uri);
+    ff_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port,
+                 path, sizeof(path), uri);
     /* extract parameters */
     ttl = -1;
     local_port = -1;
@@ -169,8 +172,8 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
 
     /* just to ease handle access. XXX: need to suppress direct handle
        access */
-    s->rtp_fd = udp_get_file_handle(s->rtp_hd);
-    s->rtcp_fd = udp_get_file_handle(s->rtcp_hd);
+    s->rtp_fd = url_get_file_handle(s->rtp_hd);
+    s->rtcp_fd = url_get_file_handle(s->rtcp_hd);
 
     h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
     h->is_streamed = 1;
@@ -192,6 +195,7 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
     socklen_t from_len;
     int len, fd_max, n;
     fd_set rfds;
+    struct timeval tv;
 #if 0
     for(;;) {
         from_len = sizeof(from);
@@ -207,6 +211,8 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
     }
 #else
     for(;;) {
+        if (url_interrupt_cb())
+            return AVERROR(EINTR);
         /* build fdset to listen to RTP and RTCP packets */
         FD_ZERO(&rfds);
         fd_max = s->rtp_fd;
@@ -214,7 +220,9 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
         if (s->rtcp_fd > fd_max)
             fd_max = s->rtcp_fd;
         FD_SET(s->rtcp_fd, &rfds);
-        n = select(fd_max + 1, &rfds, NULL, NULL, NULL);
+        tv.tv_sec = 0;
+        tv.tv_usec = 100 * 1000;
+        n = select(fd_max + 1, &rfds, NULL, NULL, &tv);
         if (n > 0) {
             /* first try RTCP */
             if (FD_ISSET(s->rtcp_fd, &rfds)) {
@@ -242,6 +250,8 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size)
                 }
                 break;
             }
+        } else if (n < 0) {
+            return AVERROR(EIO);
         }
     }
 #endif
@@ -296,6 +306,7 @@ int rtp_get_local_port(URLContext *h)
     return udp_get_local_port(s->rtp_hd);
 }
 
+#if (LIBAVFORMAT_VERSION_MAJOR <= 52)
 /**
  * Return the rtp and rtcp file handles for select() usage to wait for
  * several RTP streams at the same time.
@@ -309,6 +320,13 @@ void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd)
     *prtp_fd = s->rtp_fd;
     *prtcp_fd = s->rtcp_fd;
 }
+#endif
+
+static int rtp_get_file_handle(URLContext *h)
+{
+    RTPContext *s = h->priv_data;
+    return s->rtp_fd;
+}
 
 URLProtocol rtp_protocol = {
     "rtp",
@@ -317,4 +335,5 @@ URLProtocol rtp_protocol = {
     rtp_write,
     NULL, /* seek */
     rtp_close,
+    .url_get_file_handle = rtp_get_file_handle,
 };