Commit 23106e24 authored by Stefan Kost's avatar Stefan Kost
Browse files

v4l2: precalculate duration

Have frame duration in the instance struct and calculate it after changing the caps.
parent ac8e87bb
...@@ -913,7 +913,6 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) ...@@ -913,7 +913,6 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
if (G_LIKELY (ret == GST_FLOW_OK && *buf)) { if (G_LIKELY (ret == GST_FLOW_OK && *buf)) {
GstClock *clock; GstClock *clock;
GstClockTime timestamp; GstClockTime timestamp;
GstClockTime duration = GST_CLOCK_TIME_NONE;
GST_BUFFER_OFFSET (*buf) = v4l2src->offset++; GST_BUFFER_OFFSET (*buf) = v4l2src->offset++;
GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset; GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset;
...@@ -930,30 +929,23 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) ...@@ -930,30 +929,23 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
} }
GST_OBJECT_UNLOCK (v4l2src); GST_OBJECT_UNLOCK (v4l2src);
if (clock) { if (G_LIKELY (clock)) {
/* the time now is the time of the clock minus the base time */ /* the time now is the time of the clock minus the base time */
timestamp = gst_clock_get_time (clock) - timestamp; timestamp = gst_clock_get_time (clock) - timestamp;
gst_object_unref (clock); gst_object_unref (clock);
/* if we have a framerate adjust timestamp for frame latency */ /* if we have a framerate adjust timestamp for frame latency */
if (v4l2src->fps_n > 0 && v4l2src->fps_d > 0) { if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) {
GstClockTime latency; if (timestamp > v4l2src->duration)
timestamp -= v4l2src->duration;
latency = gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
v4l2src->fps_n);
if (timestamp > latency)
timestamp -= latency;
else else
timestamp = 0; timestamp = 0;
duration = latency;
} }
} }
/* FIXME: use the timestamp from the buffer itself! */ /* FIXME: use the timestamp from the buffer itself! */
GST_BUFFER_TIMESTAMP (*buf) = timestamp; GST_BUFFER_TIMESTAMP (*buf) = timestamp;
GST_BUFFER_DURATION (*buf) = duration; GST_BUFFER_DURATION (*buf) = v4l2src->duration;
} }
return ret; return ret;
} }
......
...@@ -80,6 +80,7 @@ struct _GstV4l2Src ...@@ -80,6 +80,7 @@ struct _GstV4l2Src
guint64 offset; guint64 offset;
gint fps_d, fps_n; /* framerate if device is open */ gint fps_d, fps_n; /* framerate if device is open */
GstClockTime duration; /* duration of one frame */
GstV4l2SrcGetFunc get_frame; GstV4l2SrcGetFunc get_frame;
}; };
......
...@@ -272,7 +272,18 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat, ...@@ -272,7 +272,18 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat,
v4l2src->fps_n = fps_n; v4l2src->fps_n = fps_n;
v4l2src->fps_d = fps_d; 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: done:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment