Commit c6c09213 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

[media] v4l: Document timestamp behaviour to correspond to reality

Document that monotonic timestamps are taken after the corresponding frame
has been received, not when the reception has begun. This corresponds to the
reality of current drivers: the timestamp is naturally taken when the
hardware triggers an interrupt to tell the driver to handle the received
frame.

Remove the note on timestamp accuracy as it is fairly subjective what is
actually an unstable timestamp.

Also remove explanation that output buffer timestamps can be used to delay
outputting a frame.

Remove the footnote saying we always use realtime clock.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@iki.fi>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent f1343281
...@@ -339,8 +339,8 @@ returns immediately with an &EAGAIN; when no buffer is available. The ...@@ -339,8 +339,8 @@ returns immediately with an &EAGAIN; when no buffer is available. The
queues as a side effect. Since there is no notion of doing anything queues as a side effect. Since there is no notion of doing anything
"now" on a multitasking system, if an application needs to synchronize "now" on a multitasking system, if an application needs to synchronize
with another event it should examine the &v4l2-buffer; with another event it should examine the &v4l2-buffer;
<structfield>timestamp</structfield> of captured buffers, or set the <structfield>timestamp</structfield> of captured or outputted buffers.
field before enqueuing buffers for output.</para> </para>
<para>Drivers implementing memory mapping I/O must <para>Drivers implementing memory mapping I/O must
support the <constant>VIDIOC_REQBUFS</constant>, support the <constant>VIDIOC_REQBUFS</constant>,
...@@ -457,7 +457,7 @@ queues and unlocks all buffers as a side effect. Since there is no ...@@ -457,7 +457,7 @@ queues and unlocks all buffers as a side effect. Since there is no
notion of doing anything "now" on a multitasking system, if an notion of doing anything "now" on a multitasking system, if an
application needs to synchronize with another event it should examine application needs to synchronize with another event it should examine
the &v4l2-buffer; <structfield>timestamp</structfield> of captured the &v4l2-buffer; <structfield>timestamp</structfield> of captured
buffers, or set the field before enqueuing buffers for output.</para> or outputted buffers.</para>
<para>Drivers implementing user pointer I/O must <para>Drivers implementing user pointer I/O must
support the <constant>VIDIOC_REQBUFS</constant>, support the <constant>VIDIOC_REQBUFS</constant>,
...@@ -620,8 +620,7 @@ returns immediately with an &EAGAIN; when no buffer is available. The ...@@ -620,8 +620,7 @@ returns immediately with an &EAGAIN; when no buffer is available. The
unlocks all buffers as a side effect. Since there is no notion of doing unlocks all buffers as a side effect. Since there is no notion of doing
anything "now" on a multitasking system, if an application needs to synchronize anything "now" on a multitasking system, if an application needs to synchronize
with another event it should examine the &v4l2-buffer; with another event it should examine the &v4l2-buffer;
<structfield>timestamp</structfield> of captured buffers, or set the field <structfield>timestamp</structfield> of captured or outputted buffers.</para>
before enqueuing buffers for output.</para>
<para>Drivers implementing DMABUF importing I/O must support the <para>Drivers implementing DMABUF importing I/O must support the
<constant>VIDIOC_REQBUFS</constant>, <constant>VIDIOC_QBUF</constant>, <constant>VIDIOC_REQBUFS</constant>, <constant>VIDIOC_QBUF</constant>,
...@@ -654,38 +653,11 @@ plane, are stored in struct <structname>v4l2_plane</structname> instead. ...@@ -654,38 +653,11 @@ plane, are stored in struct <structname>v4l2_plane</structname> instead.
In that case, struct <structname>v4l2_buffer</structname> contains an array of In that case, struct <structname>v4l2_buffer</structname> contains an array of
plane structures.</para> plane structures.</para>
<para>Nominally timestamps refer to the first data byte transmitted. <para>For timestamp types that are sampled from the system clock
In practice however the wide range of hardware covered by the V4L2 API (V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC) it is guaranteed that the timestamp is
limits timestamp accuracy. Often an interrupt routine will taken after the complete frame has been received (or transmitted in
sample the system clock shortly after the field or frame was stored case of video output devices). For other kinds of
completely in memory. So applications must expect a constant timestamps this may vary depending on the driver.</para>
difference up to one field or frame period plus a small (few scan
lines) random error. The delay and error can be much
larger due to compression or transmission over an external bus when
the frames are not properly stamped by the sender. This is frequently
the case with USB cameras. Here timestamps refer to the instant the
field or frame was received by the driver, not the capture time. These
devices identify by not enumerating any video standards, see <xref
linkend="standard" />.</para>
<para>Similar limitations apply to output timestamps. Typically
the video hardware locks to a clock controlling the video timing, the
horizontal and vertical synchronization pulses. At some point in the
line sequence, possibly the vertical blanking, an interrupt routine
samples the system clock, compares against the timestamp and programs
the hardware to repeat the previous field or frame, or to display the
buffer contents.</para>
<para>Apart of limitations of the video device and natural
inaccuracies of all clocks, it should be noted system time itself is
not perfectly stable. It can be affected by power saving cycles,
warped to insert leap seconds, or even turned back or forth by the
system administrator affecting long term measurements. <footnote>
<para>Since no other Linux multimedia
API supports unadjusted time it would be foolish to introduce here. We
must use a universally supported clock to synchronize different media,
hence time of day.</para>
</footnote></para>
<table frame="none" pgwide="1" id="v4l2-buffer"> <table frame="none" pgwide="1" id="v4l2-buffer">
<title>struct <structname>v4l2_buffer</structname></title> <title>struct <structname>v4l2_buffer</structname></title>
...@@ -745,13 +717,9 @@ applications when an output stream.</entry> ...@@ -745,13 +717,9 @@ applications when an output stream.</entry>
byte was captured, as returned by the byte was captured, as returned by the
<function>clock_gettime()</function> function for the relevant <function>clock_gettime()</function> function for the relevant
clock id; see <constant>V4L2_BUF_FLAG_TIMESTAMP_*</constant> in clock id; see <constant>V4L2_BUF_FLAG_TIMESTAMP_*</constant> in
<xref linkend="buffer-flags" />. For output streams the data <xref linkend="buffer-flags" />. For output streams the driver
will not be displayed before this time, secondary to the nominal stores the time at which the last data byte was actually sent out
frame rate determined by the current video standard in enqueued in the <structfield>timestamp</structfield> field. This permits
order. Applications can for example zero this field to display
frames as soon as possible. The driver stores the time at which
the first data byte was actually sent out in the
<structfield>timestamp</structfield> field. This permits
applications to monitor the drift between the video and system applications to monitor the drift between the video and system
clock.</para></entry> clock.</para></entry>
</row> </row>
......
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