Mercurial > libavformat.hg
changeset 6093:e688babd14df libavformat
RTSP: Add a second URLContext for outgoing messages
Done in preparation for RTSP over HTTP.
Patch by Josh Allmann, joshua dot allmann at gmail
author | mstorsjo |
---|---|
date | Sat, 05 Jun 2010 19:41:43 +0000 |
parents | cf2a5047e031 |
children | e6d6b3826eb2 |
files | rtsp.c rtsp.h rtspenc.c |
diffstat | 3 files changed, 28 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/rtsp.c Fri Jun 04 23:31:46 2010 +0000 +++ b/rtsp.c Sat Jun 05 19:41:43 2010 +0000 @@ -1032,9 +1032,9 @@ dprintf(s, "Sending:\n%s--\n", buf); - url_write(rt->rtsp_hd, buf, strlen(buf)); + url_write(rt->rtsp_hd_out, buf, strlen(buf)); if (send_content_length > 0 && send_content) - url_write(rt->rtsp_hd, send_content, send_content_length); + url_write(rt->rtsp_hd_out, send_content, send_content_length); rt->last_cmd_time = av_gettime(); } @@ -1454,12 +1454,19 @@ return 0; } +void ff_rtsp_close_connections(AVFormatContext *s) +{ + RTSPState *rt = s->priv_data; + if (rt->rtsp_hd_out != rt->rtsp_hd) url_close(rt->rtsp_hd_out); + url_close(rt->rtsp_hd); +} + int ff_rtsp_connect(AVFormatContext *s) { RTSPState *rt = s->priv_data; char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128]; char *option_list, *option, *filename; - URLContext *rtsp_hd; + URLContext *rtsp_hd, *rtsp_hd_out; int port, err, tcp_fd; RTSPMessageHeader reply1 = {}, *reply = &reply1; int lower_transport_mask = 0; @@ -1538,7 +1545,9 @@ err = AVERROR(EIO); goto fail; } + rtsp_hd_out = rtsp_hd; rt->rtsp_hd = rtsp_hd; + rt->rtsp_hd_out = rtsp_hd_out; rt->seq = 0; tcp_fd = url_get_file_handle(rtsp_hd); @@ -1612,7 +1621,7 @@ return 0; fail: ff_rtsp_close_streams(s); - url_close(rt->rtsp_hd); + ff_rtsp_close_connections(s); if (reply->status_code >=300 && reply->status_code < 400 && s->iformat) { av_strlcpy(s->filename, reply->location, sizeof(s->filename)); av_log(s, AV_LOG_INFO, "Status %d: Redirecting to %s\n", @@ -1641,7 +1650,7 @@ } else { if (rtsp_read_play(s) < 0) { ff_rtsp_close_streams(s); - url_close(rt->rtsp_hd); + ff_rtsp_close_connections(s); return AVERROR_INVALIDDATA; } } @@ -1986,7 +1995,7 @@ ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL); ff_rtsp_close_streams(s); - url_close(rt->rtsp_hd); + ff_rtsp_close_connections(s); ff_network_close(); return 0; }
--- a/rtsp.h Fri Jun 04 23:31:46 2010 +0000 +++ b/rtsp.h Sat Jun 05 19:41:43 2010 +0000 @@ -278,6 +278,10 @@ /** The synchronized start time of the output streams. */ int64_t start_time; + + /** Additional output handle, used when input and output are done + * separately, eg for HTTP tunneling. */ + URLContext *rtsp_hd_out; } RTSPState; /** @@ -434,4 +438,11 @@ */ void ff_rtsp_close_streams(AVFormatContext *s); +/** + * Close all connection handles within the RTSP (de)muxer + * + * @param rt RTSP (de)muxer context + */ +void ff_rtsp_close_connections(AVFormatContext *rt); + #endif /* AVFORMAT_RTSP_H */
--- a/rtspenc.c Fri Jun 04 23:31:46 2010 +0000 +++ b/rtspenc.c Sat Jun 05 19:41:43 2010 +0000 @@ -57,7 +57,7 @@ if (rtsp_write_record(s) < 0) { ff_rtsp_close_streams(s); - url_close(rt->rtsp_hd); + ff_rtsp_close_connections(s); return AVERROR_INVALIDDATA; } return 0; @@ -162,7 +162,7 @@ ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL); ff_rtsp_close_streams(s); - url_close(rt->rtsp_hd); + ff_rtsp_close_connections(s); ff_network_close(); return 0; }