mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 08:41:07 +00:00
v4lsrc: fix timestamping for when we do not have a clock yet
Should fix #559049.
This commit is contained in:
parent
e2e5a1da06
commit
95af14d7bc
1 changed files with 33 additions and 10 deletions
|
@ -705,9 +705,10 @@ gst_v4lsrc_buffer_finalize (GstV4lSrcBuffer * v4lsrc_buffer)
|
||||||
GstBuffer *
|
GstBuffer *
|
||||||
gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
|
gst_v4lsrc_buffer_new (GstV4lSrc * v4lsrc, gint num)
|
||||||
{
|
{
|
||||||
GstBuffer *buf;
|
|
||||||
gint fps_n, fps_d;
|
|
||||||
GstClockTime duration, timestamp, latency;
|
GstClockTime duration, timestamp, latency;
|
||||||
|
GstBuffer *buf;
|
||||||
|
GstClock *clock;
|
||||||
|
gint fps_n, fps_d;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (v4lsrc, "creating buffer for frame %d", num);
|
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_DATA (buf) = gst_v4lsrc_get_buffer (v4lsrc, num);
|
||||||
GST_BUFFER_SIZE (buf) = v4lsrc->buffer_size;
|
GST_BUFFER_SIZE (buf) = v4lsrc->buffer_size;
|
||||||
GST_BUFFER_OFFSET (buf) = v4lsrc->offset++;
|
GST_BUFFER_OFFSET (buf) = v4lsrc->offset++;
|
||||||
|
GST_BUFFER_OFFSET_END (buf) = v4lsrc->offset;
|
||||||
|
|
||||||
duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
|
/* timestamps, LOCK to get clock and base time. */
|
||||||
latency = duration;
|
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);
|
||||||
|
|
||||||
timestamp = gst_clock_get_time (GST_ELEMENT_CAST (v4lsrc)->clock);
|
duration =
|
||||||
timestamp -= gst_element_get_base_time (GST_ELEMENT_CAST (v4lsrc));
|
gst_util_uint64_scale_int (GST_SECOND, fps_d * v4lsrc->offset, fps_n) -
|
||||||
if (timestamp > latency)
|
gst_util_uint64_scale_int (GST_SECOND, fps_d * (v4lsrc->offset - 1),
|
||||||
timestamp -= latency;
|
fps_n);
|
||||||
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_TIMESTAMP (buf) = timestamp;
|
||||||
GST_BUFFER_DURATION (buf) = duration;
|
GST_BUFFER_DURATION (buf) = duration;
|
||||||
|
|
Loading…
Reference in a new issue