[gst-cvs] gst-plugins-good: imagefreeze: Always generate a perfectly timestamped stream
Sebastian Dröge
slomo at kemper.freedesktop.org
Sat Sep 4 05:56:23 PDT 2010
Module: gst-plugins-good
Branch: master
Commit: d8ef9bb6917414f0d357d149fa1449f7d3855206
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=d8ef9bb6917414f0d357d149fa1449f7d3855206
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date: Fri Aug 20 09:14:59 2010 +0200
imagefreeze: Always generate a perfectly timestamped stream
Before there could be rounding errors when calculating the duration,
resulting in timestamp + duration being smaller than the next buffer's
timestamp.
---
gst/imagefreeze/gstimagefreeze.c | 14 +++++++++-----
1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/gst/imagefreeze/gstimagefreeze.c b/gst/imagefreeze/gstimagefreeze.c
index b93d0a7..2b21906 100644
--- a/gst/imagefreeze/gstimagefreeze.c
+++ b/gst/imagefreeze/gstimagefreeze.c
@@ -717,7 +717,7 @@ gst_image_freeze_src_loop (GstPad * pad)
GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad));
GstBuffer *buffer;
guint64 offset;
- GstClockTime timestamp, duration;
+ GstClockTime timestamp, timestamp_end, duration;
gint64 cstart, cstop;
gboolean in_seg, eos;
@@ -770,24 +770,28 @@ gst_image_freeze_src_loop (GstPad * pad)
if (self->fps_n != 0) {
timestamp =
gst_util_uint64_scale (offset, self->fps_d * GST_SECOND, self->fps_n);
- duration = gst_util_uint64_scale_int (GST_SECOND, self->fps_d, self->fps_n);
+ timestamp_end =
+ gst_util_uint64_scale (offset + 1, self->fps_d * GST_SECOND,
+ self->fps_n);
+ duration = timestamp_end - timestamp;
} else {
timestamp = self->segment.start;
+ timestamp_end = GST_CLOCK_TIME_NONE;
duration = GST_CLOCK_TIME_NONE;
}
+
eos = (self->fps_n == 0 && offset > 0) ||
(self->segment.rate >= 0 && self->segment.stop != -1
&& timestamp > self->segment.stop) || (self->segment.rate < 0
&& offset == 0) || (self->segment.rate < 0
- && self->segment.start != -1
- && timestamp + duration < self->segment.start);
+ && self->segment.start != -1 && timestamp_end < self->segment.start);
if (self->fps_n == 0 && offset > 0)
in_seg = FALSE;
else
in_seg =
gst_segment_clip (&self->segment, GST_FORMAT_TIME, timestamp,
- timestamp + duration, &cstart, &cstop);
+ timestamp_end, &cstart, &cstop);
if (in_seg)
gst_segment_set_last_stop (&self->segment, GST_FORMAT_TIME, cstart);
More information about the Gstreamer-commits
mailing list