RTMPTE protocol support
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 20 Jul 2012 14:36:47 +0000 (16:36 +0200)
committerMartin Storsjö <martin@martin.st>
Mon, 23 Jul 2012 13:32:09 +0000 (16:32 +0300)
Signed-off-by: Martin Storsjö <martin@martin.st>
Changelog
configure
doc/general.texi
doc/protocols.texi
libavformat/Makefile
libavformat/allformats.c
libavformat/rtmpcrypt.c
libavformat/rtmpproto.c
libavformat/version.h

index d51f5d3..ea2c353 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -40,6 +40,7 @@ version <next>:
 - JPEG 2000 encoding support through OpenJPEG
 - G.723.1 demuxer and decoder
 - RTMPE protocol support
+- RTMPTE protocol support
 
 
 version 0.8:
index b862fd3..aa5797a 100755 (executable)
--- a/configure
+++ b/configure
@@ -1569,6 +1569,7 @@ rtmpe_protocol_select="ffrtmpcrypt_protocol"
 rtmps_protocol_deps="!librtmp_protocol"
 rtmps_protocol_select="tls_protocol"
 rtmpt_protocol_select="ffrtmphttp_protocol"
+rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
 rtmpts_protocol_select="ffrtmphttp_protocol"
 rtp_protocol_select="udp_protocol"
 sctp_protocol_deps="network netinet_sctp_h"
index c54ac00..0585554 100644 (file)
@@ -847,7 +847,7 @@ performance on systems without hardware floating point support).
 @item RTMPE        @tab X
 @item RTMPS        @tab X
 @item RTMPT        @tab X
-@item RTMPTE       @tab E
+@item RTMPTE       @tab X
 @item RTMPTS       @tab X
 @item RTP          @tab X
 @item SCTP         @tab X
index fcb4da8..7b84f25 100644 (file)
@@ -271,6 +271,14 @@ The Real-Time Messaging Protocol tunneled through HTTP (RTMPT) is used
 for streaming multimedia content within HTTP requests to traverse
 firewalls.
 
+@section rtmpte
+
+Encrypted Real-Time Messaging Protocol tunneled through HTTP.
+
+The Encrypted Real-Time Messaging Protocol tunneled through HTTP (RTMPTE)
+is used for streaming multimedia content within HTTP requests to traverse
+firewalls.
+
 @section rtmpts
 
 Real-Time Messaging Protocol tunneled through HTTPS.
index 31a5334..2263b96 100644 (file)
@@ -357,6 +357,7 @@ OBJS-$(CONFIG_RTMP_PROTOCOL)             += rtmpproto.o rtmppkt.o
 OBJS-$(CONFIG_RTMPE_PROTOCOL)            += rtmpproto.o rtmppkt.o
 OBJS-$(CONFIG_RTMPS_PROTOCOL)            += rtmpproto.o rtmppkt.o
 OBJS-$(CONFIG_RTMPT_PROTOCOL)            += rtmpproto.o rtmppkt.o
+OBJS-$(CONFIG_RTMPTE_PROTOCOL)           += rtmpproto.o rtmppkt.o
 OBJS-$(CONFIG_RTMPTS_PROTOCOL)           += rtmpproto.o rtmppkt.o
 OBJS-$(CONFIG_RTP_PROTOCOL)              += rtpproto.o
 OBJS-$(CONFIG_SCTP_PROTOCOL)             += sctp.o
index 4e694b2..40770e5 100644 (file)
@@ -263,6 +263,7 @@ void av_register_all(void)
     REGISTER_PROTOCOL (RTMPE, rtmpe);
     REGISTER_PROTOCOL (RTMPS, rtmps);
     REGISTER_PROTOCOL (RTMPT, rtmpt);
+    REGISTER_PROTOCOL (RTMPTE, rtmpte);
     REGISTER_PROTOCOL (RTMPTS, rtmpts);
     REGISTER_PROTOCOL (RTP, rtp);
     REGISTER_PROTOCOL (SCTP, sctp);
index e5afcc9..6a4332d 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "libavutil/blowfish.h"
 #include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
 #include "libavutil/rc4.h"
 #include "libavutil/xtea.h"
 
 
 /* protocol handler context */
 typedef struct RTMPEContext {
+    const AVClass *class;
     URLContext   *stream;            ///< TCP stream
     FF_DH        *dh;                ///< Diffie-Hellman context
     struct AVRC4 key_in;             ///< RC4 key used for decrypt data
     struct AVRC4 key_out;            ///< RC4 key used for encrypt data
     int          handshaked;         ///< flag indicating when the handshake is performed
+    int          tunneling;          ///< use a HTTP connection (RTMPTE)
 } RTMPEContext;
 
 static const uint8_t rtmpe8_keys[16][16] = {
@@ -248,11 +251,17 @@ static int rtmpe_open(URLContext *h, const char *uri, int flags)
 
     av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port, NULL, 0, uri);
 
-    if (port < 0)
-        port = 1935;
+    if (rt->tunneling) {
+        if (port < 0)
+            port = 80;
+        ff_url_join(url, sizeof(url), "ffrtmphttp", NULL, host, port, NULL);
+    } else {
+        if (port < 0)
+            port = 1935;
+        ff_url_join(url, sizeof(url), "tcp", NULL, host, port, NULL);
+    }
 
-    /* open the tcp connection */
-    ff_url_join(url, sizeof(url), "tcp", NULL, host, port, NULL);
+    /* open the tcp or ffrtmphttp connection */
     if ((ret = ffurl_open(&rt->stream, url, AVIO_FLAG_READ_WRITE,
                           &h->interrupt_callback, NULL)) < 0) {
         rtmpe_close(h);
@@ -298,6 +307,21 @@ static int rtmpe_write(URLContext *h, const uint8_t *buf, int size)
     return size;
 }
 
+#define OFFSET(x) offsetof(RTMPEContext, x)
+#define DEC AV_OPT_FLAG_DECODING_PARAM
+
+static const AVOption ffrtmpcrypt_options[] = {
+    {"ffrtmpcrypt_tunneling", "Use a HTTP tunneling connection (RTMPTE).", OFFSET(tunneling), AV_OPT_TYPE_INT, {0}, 0, 1, DEC},
+    { NULL },
+};
+
+static const AVClass ffrtmpcrypt_class = {
+    .class_name = "ffrtmpcrypt",
+    .item_name  = av_default_item_name,
+    .option     = ffrtmpcrypt_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 URLProtocol ff_ffrtmpcrypt_protocol = {
     .name            = "ffrtmpcrypt",
     .url_open        = rtmpe_open,
@@ -306,4 +330,5 @@ URLProtocol ff_ffrtmpcrypt_protocol = {
     .url_close       = rtmpe_close,
     .priv_data_size  = sizeof(RTMPEContext),
     .flags           = URL_PROTOCOL_FLAG_NETWORK,
+    .priv_data_class = &ffrtmpcrypt_class,
 };
index 67a89c5..f7ba7d5 100644 (file)
@@ -1192,7 +1192,10 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
         if (port < 0)
             port = RTMPS_DEFAULT_PORT;
         ff_url_join(buf, sizeof(buf), "tls", NULL, hostname, port, NULL);
-    } else if (!strcmp(proto, "rtmpe")) {
+    } else if (!strcmp(proto, "rtmpe") || (!strcmp(proto, "rtmpte"))) {
+        if (!strcmp(proto, "rtmpte"))
+            av_dict_set(&opts, "ffrtmpcrypt_tunneling", "1", 1);
+
         /* open the encrypted connection */
         ff_url_join(buf, sizeof(buf), "ffrtmpcrypt", NULL, hostname, port, NULL);
         rt->encrypted = 1;
@@ -1574,6 +1577,24 @@ URLProtocol ff_rtmpt_protocol = {
     .priv_data_class = &rtmpt_class,
 };
 
+static const AVClass rtmpte_class = {
+    .class_name = "rtmpte",
+    .item_name  = av_default_item_name,
+    .option     = rtmp_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+URLProtocol ff_rtmpte_protocol = {
+    .name            = "rtmpte",
+    .url_open        = rtmp_open,
+    .url_read        = rtmp_read,
+    .url_write       = rtmp_write,
+    .url_close       = rtmp_close,
+    .priv_data_size  = sizeof(RTMPContext),
+    .flags           = URL_PROTOCOL_FLAG_NETWORK,
+    .priv_data_class = &rtmpte_class,
+};
+
 static const AVClass rtmpts_class = {
     .class_name = "rtmpts",
     .item_name  = av_default_item_name,
index 3681e8d..bc6cae6 100644 (file)
@@ -30,7 +30,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 54
-#define LIBAVFORMAT_VERSION_MINOR 11
+#define LIBAVFORMAT_VERSION_MINOR 12
 #define LIBAVFORMAT_VERSION_MICRO  0
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \