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 d51f5d3106d662ec222064d5e10aee279a81dce2..ea2c353a15d811d477e869bffa5178ab5e7de5ad 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 b862fd3f24ff88dee83eb9a9ec3353eec8014db1..aa5797ab9adf276829e432ead26a1fad143bcd49 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 c54ac00125d8494d267d3bc39506ae142c603edf..05855542bfd239dcf3c2168f895ffcf4179fd404 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 fcb4da801ed5020c1740b1db8cdf5423bbd87fcf..7b84f258150896afe736602f31514220b6e0e8d0 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 31a53345e758b9702c305d6efa6b0908d5c32e40..2263b9648d75ec4606d3ba58ddacf4f88e5c8117 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 4e694b26fe95fb28646bb26ccc2c8b270ea68054..40770e525358d8d8864f18288a0b668f684df1d4 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 e5afcc94ffdb50fcf612f136eb8bc809f9d23342..6a4332de865845e4b05146a65a6a8b45596a7685 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 67a89c5c8279fae38e664b6c79ebc43981e86ac3..f7ba7d5ef8c6249f2b86b341f0c852083d9c9205 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 3681e8db13de33ab1e19b2c00159b02f08a783d8..bc6cae664b669992b86312f2564cedcea57fe41f 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, \