aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/rtmphttp.c
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2012-07-17 12:02:43 +0200
committerMartin Storsjö <martin@martin.st>2012-07-17 14:02:55 +0300
commit86991ce2dde3358025be134b4c7939923cd81542 (patch)
tree49a253885707c133bd95fa8a893630326187a5c5 /libavformat/rtmphttp.c
parent6aedabc9b68cab7b65833415953e958ac2c77f80 (diff)
downloadffmpeg-86991ce2dde3358025be134b4c7939923cd81542.tar.gz
RTMPTS protocol support
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtmphttp.c')
-rw-r--r--libavformat/rtmphttp.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/libavformat/rtmphttp.c b/libavformat/rtmphttp.c
index febe4b31d5..9d20b40bb6 100644
--- a/libavformat/rtmphttp.c
+++ b/libavformat/rtmphttp.c
@@ -30,11 +30,14 @@
#include "libavutil/time.h"
#include "internal.h"
#include "http.h"
+#include "rtmp.h"
#define RTMPT_DEFAULT_PORT 80
+#define RTMPTS_DEFAULT_PORT RTMPS_DEFAULT_PORT
/* protocol handler context */
typedef struct RTMP_HTTPContext {
+ const AVClass *class;
URLContext *stream; ///< HTTP stream
char host[256]; ///< hostname of the server
int port; ///< port to connect (default is 80)
@@ -46,6 +49,7 @@ typedef struct RTMP_HTTPContext {
int initialized; ///< flag indicating when the http context is initialized
int finishing; ///< flag indicating when the client closes the connection
int nb_bytes_read; ///< number of bytes read since the last request
+ int tls; ///< use Transport Security Layer (RTMPTS)
} RTMP_HTTPContext;
static int rtmp_http_send_cmd(URLContext *h, const char *cmd)
@@ -185,9 +189,6 @@ static int rtmp_http_open(URLContext *h, const char *uri, int flags)
av_url_split(NULL, 0, NULL, 0, rt->host, sizeof(rt->host), &rt->port,
NULL, 0, uri);
- if (rt->port < 0)
- rt->port = RTMPT_DEFAULT_PORT;
-
/* This is the first request that is sent to the server in order to
* register a client on the server and start a new session. The server
* replies with a unique id (usually a number) that is used by the client
@@ -195,7 +196,15 @@ static int rtmp_http_open(URLContext *h, const char *uri, int flags)
* Note: the reply doesn't contain a value for the polling interval.
* A successful connect resets the consecutive index that is used
* in the URLs. */
- ff_url_join(url, sizeof(url), "http", NULL, rt->host, rt->port, "/open/1");
+ if (rt->tls) {
+ if (rt->port < 0)
+ rt->port = RTMPTS_DEFAULT_PORT;
+ ff_url_join(url, sizeof(url), "https", NULL, rt->host, rt->port, "/open/1");
+ } else {
+ if (rt->port < 0)
+ rt->port = RTMPT_DEFAULT_PORT;
+ ff_url_join(url, sizeof(url), "http", NULL, rt->host, rt->port, "/open/1");
+ }
/* alloc the http context */
if ((ret = ffurl_alloc(&rt->stream, url, AVIO_FLAG_READ_WRITE, NULL)) < 0)
@@ -240,6 +249,21 @@ fail:
return ret;
}
+#define OFFSET(x) offsetof(RTMP_HTTPContext, x)
+#define DEC AV_OPT_FLAG_DECODING_PARAM
+
+static const AVOption ffrtmphttp_options[] = {
+ {"ffrtmphttp_tls", "Use a HTTPS tunneling connection (RTMPTS).", OFFSET(tls), AV_OPT_TYPE_INT, {0}, 0, 1, DEC},
+ { NULL },
+};
+
+static const AVClass ffrtmphttp_class = {
+ .class_name = "ffrtmphttp",
+ .item_name = av_default_item_name,
+ .option = ffrtmphttp_options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
URLProtocol ff_ffrtmphttp_protocol = {
.name = "ffrtmphttp",
.url_open = rtmp_http_open,
@@ -248,4 +272,5 @@ URLProtocol ff_ffrtmphttp_protocol = {
.url_close = rtmp_http_close,
.priv_data_size = sizeof(RTMP_HTTPContext),
.flags = URL_PROTOCOL_FLAG_NETWORK,
+ .priv_data_class= &ffrtmphttp_class,
};