Commit c3b517da authored by Jun Li's avatar Jun Li Committed by Carl Eugen Hoyos

avformat/rtsp: Add https tunneling support

Add https based tunneling for RTSP/RTP. Tested on Axis and Bosch cameras.
Https is widely used for security consideration.
parent 699d0c2a
...@@ -87,6 +87,7 @@ const AVOption ff_rtsp_options[] = { ...@@ -87,6 +87,7 @@ const AVOption ff_rtsp_options[] = {
{ "tcp", "TCP", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_TCP}, 0, 0, DEC|ENC, "rtsp_transport" }, \ { "tcp", "TCP", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_TCP}, 0, 0, DEC|ENC, "rtsp_transport" }, \
{ "udp_multicast", "UDP multicast", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_UDP_MULTICAST}, 0, 0, DEC, "rtsp_transport" }, { "udp_multicast", "UDP multicast", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_UDP_MULTICAST}, 0, 0, DEC, "rtsp_transport" },
{ "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" }, { "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
{ "https", "HTTPS tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTPS )}, 0, 0, DEC, "rtsp_transport" },
RTSP_FLAG_OPTS("rtsp_flags", "set RTSP flags"), RTSP_FLAG_OPTS("rtsp_flags", "set RTSP flags"),
{ "listen", "wait for incoming connections", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_LISTEN}, 0, 0, DEC, "rtsp_flags" }, { "listen", "wait for incoming connections", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_LISTEN}, 0, 0, DEC, "rtsp_flags" },
{ "prefer_tcp", "try RTP via TCP first, if available", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_PREFER_TCP}, 0, 0, DEC|ENC, "rtsp_flags" }, { "prefer_tcp", "try RTP via TCP first, if available", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_PREFER_TCP}, 0, 0, DEC|ENC, "rtsp_flags" },
...@@ -1669,6 +1670,7 @@ int ff_rtsp_connect(AVFormatContext *s) ...@@ -1669,6 +1670,7 @@ int ff_rtsp_connect(AVFormatContext *s)
RTSPMessageHeader reply1, *reply = &reply1; RTSPMessageHeader reply1, *reply = &reply1;
int lower_transport_mask = 0; int lower_transport_mask = 0;
int default_port = RTSP_DEFAULT_PORT; int default_port = RTSP_DEFAULT_PORT;
int https_tunnel = 0;
char real_challenge[64] = ""; char real_challenge[64] = "";
struct sockaddr_storage peer; struct sockaddr_storage peer;
socklen_t peer_len = sizeof(peer); socklen_t peer_len = sizeof(peer);
...@@ -1687,7 +1689,9 @@ int ff_rtsp_connect(AVFormatContext *s) ...@@ -1687,7 +1689,9 @@ int ff_rtsp_connect(AVFormatContext *s)
s->max_delay = s->iformat ? DEFAULT_REORDERING_DELAY : 0; s->max_delay = s->iformat ? DEFAULT_REORDERING_DELAY : 0;
rt->control_transport = RTSP_MODE_PLAIN; rt->control_transport = RTSP_MODE_PLAIN;
if (rt->lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_HTTP)) { if (rt->lower_transport_mask & ((1 << RTSP_LOWER_TRANSPORT_HTTP) |
(1 << RTSP_LOWER_TRANSPORT_HTTPS))) {
https_tunnel = !!(rt->lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_HTTPS));
rt->lower_transport_mask = 1 << RTSP_LOWER_TRANSPORT_TCP; rt->lower_transport_mask = 1 << RTSP_LOWER_TRANSPORT_TCP;
rt->control_transport = RTSP_MODE_TUNNEL; rt->control_transport = RTSP_MODE_TUNNEL;
} }
...@@ -1741,7 +1745,7 @@ redirect: ...@@ -1741,7 +1745,7 @@ redirect:
char sessioncookie[17]; char sessioncookie[17];
char headers[1024]; char headers[1024];
ff_url_join(httpname, sizeof(httpname), "http", auth, host, port, "%s", path); ff_url_join(httpname, sizeof(httpname), https_tunnel ? "https" : "http", auth, host, port, "%s", path);
snprintf(sessioncookie, sizeof(sessioncookie), "%08x%08x", snprintf(sessioncookie, sizeof(sessioncookie), "%08x%08x",
av_get_random_seed(), av_get_random_seed()); av_get_random_seed(), av_get_random_seed());
......
...@@ -42,6 +42,7 @@ enum RTSPLowerTransport { ...@@ -42,6 +42,7 @@ enum RTSPLowerTransport {
RTSP_LOWER_TRANSPORT_HTTP = 8, /**< HTTP tunneled - not a proper RTSP_LOWER_TRANSPORT_HTTP = 8, /**< HTTP tunneled - not a proper
transport mode as such, transport mode as such,
only for use via AVOptions */ only for use via AVOptions */
RTSP_LOWER_TRANSPORT_HTTPS, /**< HTTPS tunneled */
RTSP_LOWER_TRANSPORT_CUSTOM = 16, /**< Custom IO - not a public RTSP_LOWER_TRANSPORT_CUSTOM = 16, /**< Custom IO - not a public
option for lower_transport_mask, option for lower_transport_mask,
but set in the SDP demuxer based but set in the SDP demuxer based
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment