1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  rtspenc: Make sure BYE packets are sent before TEARDOWN

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-11-01 19:40:08 +01:00
commit 1295377f0a
4 changed files with 19 additions and 7 deletions

View File

@ -641,7 +641,7 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
} }
#endif /* CONFIG_RTPDEC */ #endif /* CONFIG_RTPDEC */
void ff_rtsp_undo_setup(AVFormatContext *s) void ff_rtsp_undo_setup(AVFormatContext *s, int send_packets)
{ {
RTSPState *rt = s->priv_data; RTSPState *rt = s->priv_data;
int i; int i;
@ -656,6 +656,8 @@ void ff_rtsp_undo_setup(AVFormatContext *s)
av_write_trailer(rtpctx); av_write_trailer(rtpctx);
if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) { if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
uint8_t *ptr; uint8_t *ptr;
if (CONFIG_RTSP_MUXER && rtpctx->pb && send_packets)
ff_rtsp_tcp_write_packet(s, rtsp_st);
avio_close_dyn_buf(rtpctx->pb, &ptr); avio_close_dyn_buf(rtpctx->pb, &ptr);
av_free(ptr); av_free(ptr);
} else { } else {
@ -681,7 +683,7 @@ void ff_rtsp_close_streams(AVFormatContext *s)
int i, j; int i, j;
RTSPStream *rtsp_st; RTSPStream *rtsp_st;
ff_rtsp_undo_setup(s); ff_rtsp_undo_setup(s, 0);
for (i = 0; i < rt->nb_rtsp_streams; i++) { for (i = 0; i < rt->nb_rtsp_streams; i++) {
rtsp_st = rt->rtsp_streams[i]; rtsp_st = rt->rtsp_streams[i];
if (rtsp_st) { if (rtsp_st) {
@ -1547,7 +1549,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
return 0; return 0;
fail: fail:
ff_rtsp_undo_setup(s); ff_rtsp_undo_setup(s, 0);
return err; return err;
} }

View File

@ -597,6 +597,11 @@ int ff_sdp_parse(AVFormatContext *s, const char *content);
int ff_rtsp_tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, int ff_rtsp_tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
uint8_t *buf, int buf_size); uint8_t *buf, int buf_size);
/**
* Send buffered packets over TCP.
*/
int ff_rtsp_tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st);
/** /**
* Receive one packet from the RTSPStreams set up in the AVFormatContext * Receive one packet from the RTSPStreams set up in the AVFormatContext
* (which should contain a RTSPState struct as priv_data). * (which should contain a RTSPState struct as priv_data).
@ -615,7 +620,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
* Undo the effect of ff_rtsp_make_setup_request, close the * Undo the effect of ff_rtsp_make_setup_request, close the
* transport_priv and rtp_handle fields. * transport_priv and rtp_handle fields.
*/ */
void ff_rtsp_undo_setup(AVFormatContext *s); void ff_rtsp_undo_setup(AVFormatContext *s, int send_packets);
/** /**
* Open RTSP transport context. * Open RTSP transport context.

View File

@ -769,7 +769,7 @@ static int resetup_tcp(AVFormatContext *s)
av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port, NULL, 0, av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port, NULL, 0,
s->filename); s->filename);
ff_rtsp_undo_setup(s); ff_rtsp_undo_setup(s, 0);
return ff_rtsp_make_setup_request(s, host, port, RTSP_LOWER_TRANSPORT_TCP, return ff_rtsp_make_setup_request(s, host, port, RTSP_LOWER_TRANSPORT_TCP,
rt->real_challenge); rt->real_challenge);
} }

View File

@ -136,7 +136,7 @@ static int rtsp_write_header(AVFormatContext *s)
return 0; return 0;
} }
static int tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st) int ff_rtsp_tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st)
{ {
RTSPState *rt = s->priv_data; RTSPState *rt = s->priv_data;
AVFormatContext *rtpctx = rtsp_st->transport_priv; AVFormatContext *rtpctx = rtsp_st->transport_priv;
@ -217,7 +217,7 @@ static int rtsp_write_packet(AVFormatContext *s, AVPacket *pkt)
* packets, so we need to send them out on the TCP connection separately. * packets, so we need to send them out on the TCP connection separately.
*/ */
if (!ret && rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) if (!ret && rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP)
ret = tcp_write_packet(s, rtsp_st); ret = ff_rtsp_tcp_write_packet(s, rtsp_st);
return ret; return ret;
} }
@ -225,6 +225,11 @@ static int rtsp_write_close(AVFormatContext *s)
{ {
RTSPState *rt = s->priv_data; RTSPState *rt = s->priv_data;
// If we want to send RTCP_BYE packets, these are sent by av_write_trailer.
// Thus call this on all streams before doing the teardown. This is
// done within ff_rtsp_undo_setup.
ff_rtsp_undo_setup(s, 1);
ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL); ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL);
ff_rtsp_close_streams(s); ff_rtsp_close_streams(s);