diff options
author | Jan Schmidt <thaytan@noraisin.net> | 2012-09-17 23:59:34 +1000 |
---|---|---|
committer | Jan Schmidt <thaytan@noraisin.net> | 2012-09-18 00:27:22 +1000 |
commit | c90cdadbe42db3d1ee68e1d4d6d2cd2a90da5ae2 (patch) | |
tree | 76f37d1d585ed22fefbc0d428f18d168be38a00e | |
parent | 14e220f6001da2bfd2e1dd76d488b4a634487777 (diff) | |
download | gstreamer-plugins-bad-c90cdadbe42db3d1ee68e1d4d6d2cd2a90da5ae2.tar.gz |
resindvd: Fix segment handling in the demuxer.
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.
-rw-r--r-- | ext/resindvd/gstmpegdemux.c | 21 | ||||
-rw-r--r-- | ext/resindvd/resindvdbin.c | 50 |
2 files changed, 62 insertions, 9 deletions
diff --git a/ext/resindvd/gstmpegdemux.c b/ext/resindvd/gstmpegdemux.c index 87e6ffbbb..fe934832f 100644 --- a/ext/resindvd/gstmpegdemux.c +++ b/ext/resindvd/gstmpegdemux.c @@ -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 */ diff --git a/ext/resindvd/resindvdbin.c b/ext/resindvd/resindvdbin.c index c70f7b39d..2ffb4b5cc 100644 --- a/ext/resindvd/resindvdbin.c +++ b/ext/resindvd/resindvdbin.c @@ -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")) |