diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2017-03-14 17:44:45 +0100 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-10-06 00:22:10 -0300 |
commit | 1e27837265702b63db65122e97178a0ca4d25e05 (patch) | |
tree | 27ab1f61531c1681587d2bfbbcc1223aae510055 | |
parent | 51ebce7d7d614b15a9f27c67e419b4e2859335d7 (diff) | |
download | ffmpeg-1e27837265702b63db65122e97178a0ca4d25e05.tar.gz |
rtsp: Move message parsing to a separate function
Make easier to handle the polling function before we implement
full threading support.
(cherry picked from libav commit ca960161f087ca38267b88ce90592010c59584f1)
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavformat/rtsp.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 375d0d9e14..b6da61b95e 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1918,12 +1918,39 @@ redirect: #endif /* CONFIG_RTSP_DEMUXER || CONFIG_RTSP_MUXER */ #if CONFIG_RTPDEC +static int parse_rtsp_message(AVFormatContext *s) +{ + RTSPState *rt = s->priv_data; + int ret; + + if (rt->rtsp_flags & RTSP_FLAG_LISTEN) { + if (rt->state == RTSP_STATE_STREAMING) { + if (!ff_rtsp_parse_streaming_commands(s)) + return AVERROR_EOF; + else + av_log(s, AV_LOG_WARNING, + "Unable to answer to TEARDOWN\n"); + } else + return 0; + } else { + RTSPMessageHeader reply; + ret = ff_rtsp_read_reply(s, &reply, NULL, 0, NULL); + if (ret < 0) + return ret; + /* XXX: parse message */ + if (rt->state != RTSP_STATE_STREAMING) + return 0; + } + + return 0; +} + static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, uint8_t *buf, int buf_size, int64_t wait_end) { RTSPState *rt = s->priv_data; RTSPStream *rtsp_st; - int n, i, ret, tcp_fd, timeout_cnt = 0; + int n, i, ret, timeout_cnt = 0; struct pollfd *p = rt->p; int *fds = NULL, fdsnum, fdsidx; @@ -1933,11 +1960,8 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, return AVERROR(ENOMEM); if (rt->rtsp_hd) { - tcp_fd = ffurl_get_file_handle(rt->rtsp_hd); - p[rt->max_p].fd = tcp_fd; + p[rt->max_p].fd = ffurl_get_file_handle(rt->rtsp_hd); p[rt->max_p++].events = POLLIN; - } else { - tcp_fd = -1; } for (i = 0; i < rt->nb_rtsp_streams; i++) { rtsp_st = rt->rtsp_streams[i]; @@ -1968,7 +1992,7 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, return AVERROR(EAGAIN); n = poll(p, rt->max_p, POLL_TIMEOUT_MS); if (n > 0) { - int j = 1 - (tcp_fd == -1); + int j = rt->rtsp_hd ? 1 : 0; timeout_cnt = 0; for (i = 0; i < rt->nb_rtsp_streams; i++) { rtsp_st = rt->rtsp_streams[i]; @@ -1984,25 +2008,8 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, } } #if CONFIG_RTSP_DEMUXER - if (tcp_fd != -1 && p[0].revents & POLLIN) { - if (rt->rtsp_flags & RTSP_FLAG_LISTEN) { - if (rt->state == RTSP_STATE_STREAMING) { - if (!ff_rtsp_parse_streaming_commands(s)) - return AVERROR_EOF; - else - av_log(s, AV_LOG_WARNING, - "Unable to answer to TEARDOWN\n"); - } else - return 0; - } else { - RTSPMessageHeader reply; - ret = ff_rtsp_read_reply(s, &reply, NULL, 0, NULL); - if (ret < 0) - return ret; - /* XXX: parse message */ - if (rt->state != RTSP_STATE_STREAMING) - return 0; - } + if (rt->rtsp_hd && p[0].revents & POLLIN) { + return parse_rtsp_message(s); } #endif } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) { |