baseparse: adjust seek handling and newsegment sending
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Mon, 21 Dec 2009 17:18:39 +0000 (18:18 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 8 Apr 2011 14:44:48 +0000 (15:44 +0100)
Perform sanity check on type of seek, and only perform one that is
appropriately supported.  Adjust downstream newsegment event
to first buffer timestamp that is sent downstream.

gst/audioparsers/gstbaseparse.c

index 8e2a2ae..3fa8ea8 100644 (file)
@@ -976,6 +976,19 @@ gst_base_parse_push_buffer (GstBaseParse * parse, GstBuffer * buffer)
 
   gst_buffer_set_caps (buffer, GST_PAD_CAPS (parse->srcpad));
 
+  /* segment times are typically estimates,
+   * actual frame data might lead subclass to different timestamps,
+   * so override segment start from what is supplied there */
+  if (G_UNLIKELY (parse->pending_segment && !parse->priv->passthrough &&
+          GST_CLOCK_TIME_IS_VALID (last_stop))) {
+    gst_event_unref (parse->pending_segment);
+    /* stop time possibly lost this way,
+     * but unlikely and not really supported */
+    parse->pending_segment =
+        gst_event_new_new_segment (FALSE, parse->segment.rate,
+        parse->segment.format, last_stop, -1, last_stop);
+  }
+
   /* and should then also be linked downstream, so safe to send some events */
   if (parse->priv->pad_mode == GST_ACTIVATE_PULL) {
     if (G_UNLIKELY (parse->close_segment)) {
@@ -1955,6 +1968,12 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
     }
   }
 
+  /* to much estimating going on to support this sensibly,
+   * and no eos/end-of-segment loop handling either ... */
+  if (stop_type != GST_SEEK_TYPE_NONE || (flags & GST_SEEK_FLAG_SEGMENT))
+    goto wrong_type;
+  stop = -1;
+
   /* get flush flag */
   flush = flags & GST_SEEK_FLAG_FLUSH;