rtspsrc: handle segment event
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 16 Nov 2012 14:38:29 +0000 (15:38 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 16 Nov 2012 14:38:29 +0000 (15:38 +0100)
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

index bb13c56..07588c1 100644 (file)
@@ -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) {