|
|
@@ -65,6 +65,7 @@ typedef struct RTSPState { |
|
|
|
enum RTSPServerType server_type; |
|
|
|
char last_reply[2048]; /* XXX: allocate ? */ |
|
|
|
RTPDemuxContext *cur_rtp; |
|
|
|
int need_subscription; |
|
|
|
} RTSPState; |
|
|
|
|
|
|
|
typedef struct RTSPStream { |
|
|
@@ -1034,6 +1035,9 @@ make_setup_request (AVFormatContext *s, const char *host, int port, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (rt->server_type == RTSP_SERVER_RDT) |
|
|
|
rt->need_subscription = 1; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
fail: |
|
|
@@ -1295,6 +1299,31 @@ static int rtsp_read_packet(AVFormatContext *s, |
|
|
|
int ret, len; |
|
|
|
uint8_t buf[RTP_MAX_PACKET_LENGTH]; |
|
|
|
|
|
|
|
if (rt->server_type == RTSP_SERVER_RDT && rt->need_subscription) { |
|
|
|
int i; |
|
|
|
RTSPHeader reply1, *reply = &reply1; |
|
|
|
char cmd[1024]; |
|
|
|
|
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"SET_PARAMETER %s RTSP/1.0\r\n" |
|
|
|
"Subscribe: ", |
|
|
|
s->filename); |
|
|
|
for (i = 0; i < rt->nb_rtsp_streams; i++) { |
|
|
|
if (i != 0) av_strlcat(cmd, ",", sizeof(cmd)); |
|
|
|
ff_rdt_subscribe_rule( |
|
|
|
rt->rtsp_streams[i]->rtp_ctx, |
|
|
|
cmd, sizeof(cmd), i, 0); |
|
|
|
} |
|
|
|
av_strlcat(cmd, "\r\n", sizeof(cmd)); |
|
|
|
rtsp_send_cmd(s, cmd, reply, NULL); |
|
|
|
if (reply->status_code != RTSP_STATUS_OK) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
rt->need_subscription = 0; |
|
|
|
|
|
|
|
if (rt->state == RTSP_STATE_PLAYING) |
|
|
|
rtsp_read_play (s); |
|
|
|
} |
|
|
|
|
|
|
|
/* get next frames from the same RTP packet */ |
|
|
|
if (rt->cur_rtp) { |
|
|
|
ret = rtp_parse_packet(rt->cur_rtp, pkt, NULL, 0); |
|
|
@@ -1342,6 +1371,7 @@ static int rtsp_read_play(AVFormatContext *s) |
|
|
|
|
|
|
|
av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state); |
|
|
|
|
|
|
|
if (!(rt->server_type == RTSP_SERVER_RDT && rt->need_subscription)) { |
|
|
|
if (rt->state == RTSP_STATE_PAUSED) { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"PLAY %s RTSP/1.0\r\n", |
|
|
@@ -1357,6 +1387,7 @@ static int rtsp_read_play(AVFormatContext *s) |
|
|
|
if (reply->status_code != RTSP_STATUS_OK) { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
rt->state = RTSP_STATE_PLAYING; |
|
|
|
return 0; |
|
|
|
} |
|
|
@@ -1372,7 +1403,7 @@ static int rtsp_read_pause(AVFormatContext *s) |
|
|
|
|
|
|
|
if (rt->state != RTSP_STATE_PLAYING) |
|
|
|
return 0; |
|
|
|
|
|
|
|
else if (!(rt->server_type == RTSP_SERVER_RDT && rt->need_subscription)) { |
|
|
|
snprintf(cmd, sizeof(cmd), |
|
|
|
"PAUSE %s RTSP/1.0\r\n", |
|
|
|
s->filename); |
|
|
@@ -1380,6 +1411,7 @@ static int rtsp_read_pause(AVFormatContext *s) |
|
|
|
if (reply->status_code != RTSP_STATUS_OK) { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
rt->state = RTSP_STATE_PAUSED; |
|
|
|
return 0; |
|
|
|
} |
|
|
|