diff options
author | Martin Storsjö <martin@martin.st> | 2010-03-22 15:07:05 +0000 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2010-03-22 15:07:05 +0000 |
commit | b7dc88fc68759ddd79caf291d75e715930362aac (patch) | |
tree | 1e8113b72296b9a80a945fd1e0c07478f84848d7 /libavformat/rtsp.c | |
parent | 5d7bc46c2d15cb7ab9a717feac418a92562c14f5 (diff) | |
download | ffmpeg-b7dc88fc68759ddd79caf291d75e715930362aac.tar.gz |
Add support for TCP as lower transport in the RTSP muxer
Originally committed as revision 22634 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r-- | libavformat/rtsp.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 160495b5f8..7e754336b8 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -584,7 +584,13 @@ void ff_rtsp_close_streams(AVFormatContext *s) if (s->oformat) { AVFormatContext *rtpctx = rtsp_st->transport_priv; av_write_trailer(rtpctx); + if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) { + uint8_t *ptr; + url_close_dyn_buf(rtpctx->pb, &ptr); + av_free(ptr); + } else { url_fclose(rtpctx->pb); + } av_metadata_free(&rtpctx->streams[0]->metadata); av_metadata_free(&rtpctx->metadata); av_free(rtpctx->streams[0]); @@ -644,11 +650,20 @@ static void *rtsp_rtp_mux_open(AVFormatContext *s, AVStream *st, av_free(rtpctx->streams[0]->codec); rtpctx->streams[0]->codec = st->codec; + if (handle) { url_fdopen(&rtpctx->pb, handle); + } else + url_open_dyn_packet_buf(&rtpctx->pb, RTSP_TCP_MAX_PACKET_SIZE); ret = av_write_header(rtpctx); if (ret) { + if (handle) { url_fclose(rtpctx->pb); + } else { + uint8_t *ptr; + url_close_dyn_buf(rtpctx->pb, &ptr); + av_free(ptr); + } av_free(rtpctx->streams[0]); av_free(rtpctx); return NULL; @@ -1464,11 +1479,12 @@ redirect: lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; if (s->oformat) { - /* Only UDP output is supported at the moment. */ - lower_transport_mask &= 1 << RTSP_LOWER_TRANSPORT_UDP; + /* Only UDP or TCP - UDP multicast isn't supported. */ + lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_UDP) | + (1 << RTSP_LOWER_TRANSPORT_TCP); if (!lower_transport_mask) { av_log(s, AV_LOG_ERROR, "Unsupported lower transport method, " - "only UDP is supported for output.\n"); + "only UDP and TCP are supported for output.\n"); err = AVERROR(EINVAL); goto fail; } |