|
|
@@ -437,11 +437,16 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, |
|
|
|
} |
|
|
|
} |
|
|
|
/* put a default control url */ |
|
|
|
av_strlcpy(rtsp_st->control_url, s->filename, |
|
|
|
av_strlcpy(rtsp_st->control_url, rt->control_uri, |
|
|
|
sizeof(rtsp_st->control_url)); |
|
|
|
break; |
|
|
|
case 'a': |
|
|
|
if (av_strstart(p, "control:", &p) && s->nb_streams > 0) { |
|
|
|
if (av_strstart(p, "control:", &p)) { |
|
|
|
if (s->nb_streams == 0) { |
|
|
|
if (!strncmp(p, "rtsp://", 7)) |
|
|
|
av_strlcpy(rt->control_uri, p, |
|
|
|
sizeof(rt->control_uri)); |
|
|
|
} else { |
|
|
|
char proto[32]; |
|
|
|
/* get the control url */ |
|
|
|
st = s->streams[s->nb_streams - 1]; |
|
|
@@ -452,6 +457,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, |
|
|
|
NULL, NULL, 0, p); |
|
|
|
if (proto[0] == '\0') { |
|
|
|
/* relative control URL */ |
|
|
|
if (rtsp_st->control_url[strlen(rtsp_st->control_url)-1]!='/') |
|
|
|
av_strlcat(rtsp_st->control_url, "/", |
|
|
|
sizeof(rtsp_st->control_url)); |
|
|
|
av_strlcat(rtsp_st->control_url, p, |
|
|
@@ -459,6 +465,7 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, |
|
|
|
} else |
|
|
|
av_strlcpy(rtsp_st->control_url, p, |
|
|
|
sizeof(rtsp_st->control_url)); |
|
|
|
} |
|
|
|
} else if (av_strstart(p, "rtpmap:", &p) && s->nb_streams > 0) { |
|
|
|
/* NOTE: rtpmap is only supported AFTER the 'm=' tag */ |
|
|
|
get_word(buf1, sizeof(buf1), &p); |
|
|
@@ -1203,12 +1210,12 @@ static int rtsp_read_play(AVFormatContext *s) |
|
|
|
if (rt->state == RTSP_STATE_PAUSED) { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"PLAY %s RTSP/1.0\r\n", |
|
|
|
s->filename); |
|
|
|
rt->control_uri); |
|
|
|
} else { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"PLAY %s RTSP/1.0\r\n" |
|
|
|
"Range: npt=%0.3f-\r\n", |
|
|
|
s->filename, |
|
|
|
rt->control_uri, |
|
|
|
(double)rt->seek_timestamp / AV_TIME_BASE); |
|
|
|
} |
|
|
|
rtsp_send_cmd(s, cmd, reply, NULL); |
|
|
@@ -1290,6 +1297,8 @@ redirect: |
|
|
|
|
|
|
|
/* request options supported by the server; this also detects server |
|
|
|
* type */ |
|
|
|
av_strlcpy(rt->control_uri, s->filename, |
|
|
|
sizeof(rt->control_uri)); |
|
|
|
for (rt->server_type = RTSP_SERVER_RTP;;) { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"OPTIONS %s RTSP/1.0\r\n", s->filename); |
|
|
@@ -1590,7 +1599,7 @@ static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"SET_PARAMETER %s RTSP/1.0\r\n" |
|
|
|
"Unsubscribe: %s\r\n", |
|
|
|
s->filename, rt->last_subscription); |
|
|
|
rt->control_uri, rt->last_subscription); |
|
|
|
rtsp_send_cmd(s, cmd, reply, NULL); |
|
|
|
if (reply->status_code != RTSP_STATUS_OK) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
@@ -1608,7 +1617,7 @@ static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"SET_PARAMETER %s RTSP/1.0\r\n" |
|
|
|
"Subscribe: ", |
|
|
|
s->filename); |
|
|
|
rt->control_uri); |
|
|
|
for (i = 0; i < rt->nb_rtsp_streams; i++) { |
|
|
|
rule_nr = 0; |
|
|
|
for (r = 0; r < s->nb_streams; r++) { |
|
|
@@ -1648,7 +1657,7 @@ static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
if (rt->server_type == RTSP_SERVER_WMS) { |
|
|
|
snprintf(cmd, sizeof(cmd) - 1, |
|
|
|
"GET_PARAMETER %s RTSP/1.0\r\n", |
|
|
|
s->filename); |
|
|
|
rt->control_uri); |
|
|
|
rtsp_send_cmd_async(s, cmd); |
|
|
|
} else { |
|
|
|
rtsp_send_cmd_async(s, "OPTIONS * RTSP/1.0\r\n"); |
|
|
@@ -1672,7 +1681,7 @@ static int rtsp_read_pause(AVFormatContext *s) |
|
|
|
else if (!(rt->server_type == RTSP_SERVER_REAL && rt->need_subscription)) { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"PAUSE %s RTSP/1.0\r\n", |
|
|
|
s->filename); |
|
|
|
rt->control_uri); |
|
|
|
rtsp_send_cmd(s, cmd, reply, NULL); |
|
|
|
if (reply->status_code != RTSP_STATUS_OK) { |
|
|
|
return -1; |
|
|
|