From c28bfa89020f5642b3cf742806f04ca35f230814 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 16 Nov 2012 15:38:29 +0100 Subject: [PATCH] rtspsrc: handle segment event Make a segment event when we send a new range header to a client (first PLAY request or after a seek). Send the segment event in interleaved mode. Clean the segment event on cleanup Fixes https://bugzilla.gnome.org/show_bug.cgi?id=688382 --- gst/rtsp/gstrtspsrc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index bb13c5680c..07588c18bc 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -1247,6 +1247,10 @@ gst_rtspsrc_cleanup (GstRTSPSrc * src) gst_sdp_message_free (src->sdp); src->sdp = NULL; } + if (src->start_segment) { + gst_event_unref (src->start_segment); + src->start_segment = NULL; + } } #define PARSE_INT(p, del, res) \ @@ -1924,11 +1928,6 @@ gst_rtspsrc_perform_seek (GstRTSPSrc * src, GstEvent * event) GST_DEBUG_OBJECT (src, "Creating newsegment from %" G_GINT64_FORMAT " to %" G_GINT64_FORMAT, src->segment.position, stop); - /* store the newsegment event so it can be sent from the streaming thread. */ - if (src->start_segment) - gst_event_unref (src->start_segment); - src->start_segment = gst_event_new_segment (&src->segment); - /* mark discont */ GST_DEBUG_OBJECT (src, "mark DISCONT, we did a seek to another position"); for (walk = src->streams; walk; walk = g_list_next (walk)) { @@ -3577,6 +3576,7 @@ gst_rtspsrc_loop_interleaved (GstRTSPSrc * src) GstFlowReturn ret = GST_FLOW_OK; GstBuffer *buf; gboolean is_rtcp, have_data; + GstEvent *event; /* here we are only interested in data messages */ have_data = FALSE; @@ -3707,6 +3707,10 @@ gst_rtspsrc_loop_interleaved (GstRTSPSrc * src) gst_rtspsrc_activate_streams (src); src->need_activate = FALSE; } + if ((event = src->start_segment) != NULL) { + src->start_segment = NULL; + gst_rtspsrc_push_event (src, event); + } if (src->base_time == -1) { /* Take current running_time. This timestamp will be put on @@ -6197,6 +6201,11 @@ gst_rtspsrc_play (GstRTSPSrc * src, GstSegment * segment, gboolean async) gst_rtsp_message_add_header (&request, GST_RTSP_HDR_RANGE, hval); g_free (hval); + + /* store the newsegment event so it can be sent from the streaming thread. */ + if (src->start_segment) + gst_event_unref (src->start_segment); + src->start_segment = gst_event_new_segment (&src->segment); } if (segment->rate != 1.0) {