libs/gst/base/gstbasesink.c: Be a bit nicer to badly behaving upstream elements that expect us to deal with non TIME ...

Original commit message from CVS:
* libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
Be a bit nicer to badly behaving upstream elements that expect
us to deal with non TIME segments and timestamps (such as fakesrc
in the testsuite).
This commit is contained in:
Wim Taymans 2006-04-07 14:50:06 +00:00
parent 9a897acec0
commit 902e249e88
2 changed files with 28 additions and 13 deletions

View file

@ -1,3 +1,10 @@
2006-04-07 Wim Taymans <wim@fluendo.com>
* libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
Be a bit nicer to badly behaving upstream elements that expect
us to deal with non TIME segments and timestamps (such as fakesrc
in the testsuite).
2006-04-07 Wim Taymans <wim@fluendo.com> 2006-04-07 Wim Taymans <wim@fluendo.com>
* gst/gstbus.c: * gst/gstbus.c:

View file

@ -855,6 +855,8 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
gint64 cstart, cstop; /* clipped raw timestamps */ gint64 cstart, cstop; /* clipped raw timestamps */
gint64 rstart, rstop; /* clipped timestamps converted to running time */ gint64 rstart, rstop; /* clipped timestamps converted to running time */
GstClockTime sstart, sstop; /* clipped timestamps converted to stream time */ GstClockTime sstart, sstop; /* clipped timestamps converted to stream time */
GstFormat format;
GstSegment *segment;
/* start with nothing */ /* start with nothing */
sstart = sstop = rstart = rstop = -1; sstart = sstop = rstart = rstop = -1;
@ -879,10 +881,6 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
} }
} }
/* no sync if we did not get a TIME segment format */
if (G_UNLIKELY (basesink->segment.format != GST_FORMAT_TIME))
goto done;
/* else do buffer sync code */ /* else do buffer sync code */
buffer = GST_BUFFER_CAST (obj); buffer = GST_BUFFER_CAST (obj);
@ -902,8 +900,19 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT
", stop: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); ", stop: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop));
/* collect segment and format for code clarity */
segment = &basesink->segment;
format = segment->format;
/* no timestamp clipping if we did not * get a TIME segment format */
if (G_UNLIKELY (format != GST_FORMAT_TIME)) {
cstart = start;
cstop = stop;
goto do_times;
}
/* clip */ /* clip */
if (G_UNLIKELY (!gst_segment_clip (&basesink->segment, GST_FORMAT_TIME, if (G_UNLIKELY (!gst_segment_clip (segment, GST_FORMAT_TIME,
(gint64) start, (gint64) stop, &cstart, &cstop))) (gint64) start, (gint64) stop, &cstart, &cstop)))
goto out_of_segment; goto out_of_segment;
@ -913,14 +922,13 @@ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
GST_TIME_ARGS (cstop)); GST_TIME_ARGS (cstop));
} }
sstart = do_times:
gst_segment_to_stream_time (&basesink->segment, GST_FORMAT_TIME, cstart); /* this can produce wrong values if we accumulated non-TIME segments. If this happens,
sstop = * upstream is behaving very badly */
gst_segment_to_stream_time (&basesink->segment, GST_FORMAT_TIME, cstop); sstart = gst_segment_to_stream_time (segment, format, cstart);
rstart = sstop = gst_segment_to_stream_time (segment, format, cstop);
gst_segment_to_running_time (&basesink->segment, GST_FORMAT_TIME, cstart); rstart = gst_segment_to_running_time (segment, format, cstart);
rstop = rstop = gst_segment_to_running_time (segment, format, cstop);
gst_segment_to_running_time (&basesink->segment, GST_FORMAT_TIME, cstop);
done: done:
/* save times */ /* save times */