|
|
@ -1588,10 +1588,13 @@ void ff_rtsp_close_connections(AVFormatContext *s) |
|
|
|
int ff_rtsp_connect(AVFormatContext *s) |
|
|
|
int ff_rtsp_connect(AVFormatContext *s) |
|
|
|
{ |
|
|
|
{ |
|
|
|
RTSPState *rt = s->priv_data; |
|
|
|
RTSPState *rt = s->priv_data; |
|
|
|
char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128]; |
|
|
|
char proto[128], host[1024], path[1024]; |
|
|
|
|
|
|
|
char tcpname[1024], cmd[2048], auth[128]; |
|
|
|
|
|
|
|
const char *lower_rtsp_proto = "tcp"; |
|
|
|
int port, err, tcp_fd; |
|
|
|
int port, err, tcp_fd; |
|
|
|
RTSPMessageHeader reply1 = {0}, *reply = &reply1; |
|
|
|
RTSPMessageHeader reply1 = {0}, *reply = &reply1; |
|
|
|
int lower_transport_mask = 0; |
|
|
|
int lower_transport_mask = 0; |
|
|
|
|
|
|
|
int default_port = RTSP_DEFAULT_PORT; |
|
|
|
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); |
|
|
@ -1618,15 +1621,23 @@ int ff_rtsp_connect(AVFormatContext *s) |
|
|
|
rt->lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |
|
|
|
rt->lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |
|
|
|
|
|
|
|
|
|
|
|
redirect: |
|
|
|
redirect: |
|
|
|
lower_transport_mask = rt->lower_transport_mask; |
|
|
|
|
|
|
|
/* extract hostname and port */ |
|
|
|
/* extract hostname and port */ |
|
|
|
av_url_split(NULL, 0, auth, sizeof(auth), |
|
|
|
av_url_split(proto, sizeof(proto), auth, sizeof(auth), |
|
|
|
host, sizeof(host), &port, path, sizeof(path), s->filename); |
|
|
|
host, sizeof(host), &port, path, sizeof(path), s->filename); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!strcmp(proto, "rtsps")) { |
|
|
|
|
|
|
|
lower_rtsp_proto = "tls"; |
|
|
|
|
|
|
|
default_port = RTSPS_DEFAULT_PORT; |
|
|
|
|
|
|
|
rt->lower_transport_mask = 1 << RTSP_LOWER_TRANSPORT_TCP; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (*auth) { |
|
|
|
if (*auth) { |
|
|
|
av_strlcpy(rt->auth, auth, sizeof(rt->auth)); |
|
|
|
av_strlcpy(rt->auth, auth, sizeof(rt->auth)); |
|
|
|
} |
|
|
|
} |
|
|
|
if (port < 0) |
|
|
|
if (port < 0) |
|
|
|
port = RTSP_DEFAULT_PORT; |
|
|
|
port = default_port; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lower_transport_mask = rt->lower_transport_mask; |
|
|
|
|
|
|
|
|
|
|
|
if (!lower_transport_mask) |
|
|
|
if (!lower_transport_mask) |
|
|
|
lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |
|
|
|
lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |
|
|
@ -1646,7 +1657,7 @@ redirect: |
|
|
|
/* Construct the URI used in request; this is similar to s->filename,
|
|
|
|
/* Construct the URI used in request; this is similar to s->filename,
|
|
|
|
* but with authentication credentials removed and RTSP specific options |
|
|
|
* but with authentication credentials removed and RTSP specific options |
|
|
|
* stripped out. */ |
|
|
|
* stripped out. */ |
|
|
|
ff_url_join(rt->control_uri, sizeof(rt->control_uri), "rtsp", NULL, |
|
|
|
ff_url_join(rt->control_uri, sizeof(rt->control_uri), proto, NULL, |
|
|
|
host, port, "%s", path); |
|
|
|
host, port, "%s", path); |
|
|
|
|
|
|
|
|
|
|
|
if (rt->control_transport == RTSP_MODE_TUNNEL) { |
|
|
|
if (rt->control_transport == RTSP_MODE_TUNNEL) { |
|
|
@ -1725,7 +1736,8 @@ redirect: |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
/* open the tcp connection */ |
|
|
|
/* open the tcp connection */ |
|
|
|
ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, |
|
|
|
ff_url_join(tcpname, sizeof(tcpname), lower_rtsp_proto, NULL, |
|
|
|
|
|
|
|
host, port, |
|
|
|
"?timeout=%d", rt->stimeout); |
|
|
|
"?timeout=%d", rt->stimeout); |
|
|
|
if (ffurl_open(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE, |
|
|
|
if (ffurl_open(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE, |
|
|
|
&s->interrupt_callback, NULL) < 0) { |
|
|
|
&s->interrupt_callback, NULL) < 0) { |
|
|
|