From 23106e243bed3b7ac6fc5248681dfb522ffc7a9c Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Tue, 22 Jun 2010 15:46:51 +0300 Subject: [PATCH] v4l2: precalculate duration Have frame duration in the instance struct and calculate it after changing the caps. --- sys/v4l2/gstv4l2src.c | 18 +++++------------- sys/v4l2/gstv4l2src.h | 1 + sys/v4l2/v4l2src_calls.c | 13 ++++++++++++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index 6b2b451aff..7f2139a08e 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -913,7 +913,6 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) if (G_LIKELY (ret == GST_FLOW_OK && *buf)) { GstClock *clock; GstClockTime timestamp; - GstClockTime duration = GST_CLOCK_TIME_NONE; GST_BUFFER_OFFSET (*buf) = v4l2src->offset++; GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset; @@ -930,30 +929,23 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) } GST_OBJECT_UNLOCK (v4l2src); - if (clock) { + if (G_LIKELY (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); /* if we have a framerate adjust timestamp for frame latency */ - if (v4l2src->fps_n > 0 && v4l2src->fps_d > 0) { - GstClockTime latency; - - latency = gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d, - v4l2src->fps_n); - - if (timestamp > latency) - timestamp -= latency; + if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) { + if (timestamp > v4l2src->duration) + timestamp -= v4l2src->duration; else timestamp = 0; - - duration = latency; } } /* FIXME: use the timestamp from the buffer itself! */ GST_BUFFER_TIMESTAMP (*buf) = timestamp; - GST_BUFFER_DURATION (*buf) = duration; + GST_BUFFER_DURATION (*buf) = v4l2src->duration; } return ret; } diff --git a/sys/v4l2/gstv4l2src.h b/sys/v4l2/gstv4l2src.h index 68f45d97d6..13a3942da0 100644 --- a/sys/v4l2/gstv4l2src.h +++ b/sys/v4l2/gstv4l2src.h @@ -80,6 +80,7 @@ struct _GstV4l2Src guint64 offset; gint fps_d, fps_n; /* framerate if device is open */ + GstClockTime duration; /* duration of one frame */ GstV4l2SrcGetFunc get_frame; }; diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c index 9a2ff5de43..ebdb0b3391 100644 --- a/sys/v4l2/v4l2src_calls.c +++ b/sys/v4l2/v4l2src_calls.c @@ -272,7 +272,18 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat, v4l2src->fps_n = fps_n; v4l2src->fps_d = fps_d; - GST_INFO_OBJECT (v4l2src, "Set framerate to %u/%u", fps_n, fps_d); + + /* if we have a framerate pre-calculate duration */ + if (fps_n > 0 && fps_d > 0) { + v4l2src->duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n); + } else { + v4l2src->duration = GST_CLOCK_TIME_NONE; + } + + GST_INFO_OBJECT (v4l2src, + "Set framerate to %u/%u and duration to %" GST_TIME_FORMAT, fps_n, fps_d, + GST_TIME_ARGS (v4l2src->duration)); + done: