summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim.muller@collabora.co.uk>2009-09-01 15:02:37 +0100
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-09-01 15:16:06 +0100
commit95af14d7bcf16fef0fd427d61eac1d6c044d01fb (patch)
treef596cb1b8cc03d22b05c8749d4c55c65d795f07a /sys
parente2e5a1da064f58dcbf5553ce7988c14c578db4f3 (diff)
v4lsrc: fix timestamping for when we do not have a clock yet
Should fix #559049.
Diffstat (limited to 'sys')
-rw-r--r--sys/v4l/v4lsrc_calls.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/sys/v4l/v4lsrc_calls.c b/sys/v4l/v4lsrc_calls.c
index da164534..31bd6dee 100644
--- a/sys/v4l/v4lsrc_calls.c
+++ b/sys/v4l/v4lsrc_calls.c
@@ -705,9 +705,10 @@ gst_v4lsrc_buffer_finalize (GstV4lSrcBuffer * v4lsrc_buffer)
GstBuffer *
gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
{
+ GstClockTime duration, timestamp, latency;
GstBuffer *buf;
+ GstClock *clock;
gint fps_n, fps_d;
- GstClockTime duration, timestamp, latency;
GST_DEBUG_OBJECT (v4lsrc, "creating buffer for frame %d", num);
@@ -723,16 +724,38 @@ gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
GST_BUFFER_DATA (buf) = gst_v4lsrc_get_buffer (v4lsrc, num);
GST_BUFFER_SIZE (buf) = v4lsrc->buffer_size;
GST_BUFFER_OFFSET (buf) = v4lsrc->offset++;
+ GST_BUFFER_OFFSET_END (buf) = v4lsrc->offset;
+
+ /* timestamps, LOCK to get clock and base time. */
+ GST_OBJECT_LOCK (v4lsrc);
+ if ((clock = GST_ELEMENT_CLOCK (v4lsrc))) {
+ /* we have a clock, get base time and ref clock */
+ timestamp = GST_ELEMENT_CAST (v4lsrc)->base_time;
+ gst_object_ref (clock);
+ } else {
+ /* no clock, can't set timestamps */
+ timestamp = GST_CLOCK_TIME_NONE;
+ }
+ GST_OBJECT_UNLOCK (v4lsrc);
- duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
- latency = duration;
+ duration =
+ gst_util_uint64_scale_int (GST_SECOND, fps_d * v4lsrc->offset, fps_n) -
+ gst_util_uint64_scale_int (GST_SECOND, fps_d * (v4lsrc->offset - 1),
+ fps_n);
- timestamp = gst_clock_get_time (GST_ELEMENT_CAST (v4lsrc)->clock);
- timestamp -= gst_element_get_base_time (GST_ELEMENT_CAST (v4lsrc));
- if (timestamp > latency)
- timestamp -= latency;
- else
- timestamp = 0;
+ latency = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
+
+ if (clock) {
+ /* the time now is the time of the clock minus the base time */
+ timestamp = gst_clock_get_time (clock) - timestamp;
+ gst_object_unref (clock);
+
+ /* adjust timestamp for frame latency (we assume we have a framerate) */
+ if (timestamp > latency)
+ timestamp -= latency;
+ else
+ timestamp = 0;
+ }
GST_BUFFER_TIMESTAMP (buf) = timestamp;
GST_BUFFER_DURATION (buf) = duration;