resindvd: Fix segment handling in the demuxer.
authorJan Schmidt <thaytan@noraisin.net>
Mon, 17 Sep 2012 13:59:34 +0000 (23:59 +1000)
committerJan Schmidt <thaytan@noraisin.net>
Mon, 17 Sep 2012 14:27:22 +0000 (00:27 +1000)
Transfer the incoming segment base time to the src
segment the demuxer sends downstream. Add some
(disabled) debug to the bin for tracking outgoing
timestamps.

ext/resindvd/gstmpegdemux.c
ext/resindvd/resindvdbin.c

index 87e6ffb..fe93483 100644 (file)
@@ -920,7 +920,8 @@ gst_flups_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 
       GST_DEBUG_OBJECT (demux,
           "demux: received new segment start %" G_GINT64_FORMAT " stop %"
-          G_GINT64_FORMAT " time %" G_GINT64_FORMAT, start, stop, time);
+          G_GINT64_FORMAT " time %" G_GINT64_FORMAT
+          " base %" G_GINT64_FORMAT, start, stop, time, base);
 
       adjust = base - start + SCR_MUNGE;
       start = base + SCR_MUNGE;
@@ -937,20 +938,22 @@ gst_flups_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
           stop = demux->src_segment.position;
       }
 
-      GST_DEBUG_OBJECT (demux,
-          "sending new segment: rate %g format %d, start: %"
-          G_GINT64_FORMAT ", stop: %" G_GINT64_FORMAT ", time: %"
-          G_GINT64_FORMAT " scr_adjust: %" G_GINT64_FORMAT "(%" GST_TIME_FORMAT
-          ")", segment->rate, segment->format, start, stop, time,
-          demux->scr_adjust,
-          GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->scr_adjust)));
-
       demux->src_segment.rate = segment->rate;
       demux->src_segment.applied_rate = segment->applied_rate;
       demux->src_segment.format = segment->format;
       demux->src_segment.start = start;
       demux->src_segment.stop = stop;
       demux->src_segment.time = time;
+      demux->src_segment.base = base;
+
+      GST_DEBUG_OBJECT (demux,
+          "sending new segment: rate %g format %d, start: %"
+          G_GINT64_FORMAT ", stop: %" G_GINT64_FORMAT ", time: %"
+          G_GINT64_FORMAT ", base: %" G_GINT64_FORMAT
+          ", scr_adjust: %" G_GINT64_FORMAT "(%" GST_TIME_FORMAT ")",
+          segment->rate, segment->format, start, stop, time, base,
+          demux->scr_adjust,
+          GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->scr_adjust)));
 
       if (demux->in_still && stop != -1) {
         /* Generate gap buffers, due to closing segment from a still-frame */
index c70f7b3..2ffb4b5 100644 (file)
@@ -353,6 +353,49 @@ _pad_block_destroy_notify (RsnDvdBinPadBlockCtx * ctx)
   g_slice_free (RsnDvdBinPadBlockCtx, ctx);
 }
 
+#if DEBUG_TIMING
+static GstPadProbeReturn
+dvdbin_dump_timing_info (GstPad * opad,
+    GstPadProbeInfo * info, gpointer userdata)
+{
+  if (GST_PAD_PROBE_INFO_TYPE (info) & (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
+          GST_PAD_PROBE_TYPE_EVENT_FLUSH)) {
+    GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
+    if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+      const GstSegment *seg;
+
+      gst_event_parse_segment (event, &seg);
+
+      g_print ("%s:%s segment: rate %g format %d, start: %"
+          GST_TIME_FORMAT ", stop: %" GST_TIME_FORMAT ", time: %"
+          GST_TIME_FORMAT " base: %" GST_TIME_FORMAT "\n",
+          GST_DEBUG_PAD_NAME (opad),
+          seg->rate, seg->format, GST_TIME_ARGS (seg->start),
+          GST_TIME_ARGS (seg->stop), GST_TIME_ARGS (seg->time),
+          GST_TIME_ARGS (seg->base));
+    } else if (GST_EVENT_TYPE (event) == GST_EVENT_GAP) {
+      GstClockTime ts, dur, end;
+      gst_event_parse_gap (event, &ts, &dur);
+      end = ts;
+      if (ts != GST_CLOCK_TIME_NONE && dur != GST_CLOCK_TIME_NONE)
+        end += dur;
+      g_print ("%s:%s Gap TS: %" GST_TIME_FORMAT " dur %" GST_TIME_FORMAT
+          " (to %" GST_TIME_FORMAT ")\n", GST_DEBUG_PAD_NAME (opad),
+          GST_TIME_ARGS (ts), GST_TIME_ARGS (dur), GST_TIME_ARGS (end));
+    } else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
+      g_print ("%s:%s FLUSHED\n", GST_DEBUG_PAD_NAME (opad));
+    }
+  }
+  if (GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_BUFFER) {
+    GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER (info);
+    g_print ("%s:%s Buffer PTS %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT
+        "\n", GST_DEBUG_PAD_NAME (opad), GST_TIME_ARGS (GST_BUFFER_PTS (buf)),
+        GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+  }
+  return GST_PAD_PROBE_OK;
+}
+#endif
+
 static gboolean
 try_link_pieces (GstElement * e1, const gchar * pad1, GstElement * e2,
     const gchar * pad2)
@@ -466,6 +509,13 @@ create_elements (RsnDvdBin * dvdbin)
   gst_object_unref (src);
   src = NULL;
 
+#if DEBUG_TIMING
+  gst_pad_add_probe (dvdbin->video_pad,
+      GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_BUFFER |
+      GST_PAD_PROBE_TYPE_EVENT_FLUSH,
+      (GstPadProbeCallback) dvdbin_dump_timing_info, NULL, NULL);
+#endif
+
   /* FIXME: Merge stream-selection logic to core and switch back */
   if (!try_create_piece (dvdbin, DVD_ELEM_SPU_SELECT, NULL,
           RSN_TYPE_INPUT_SELECTOR, "subpselect", "Subpicture stream selector"))