[libcamera-devel] [PATCH v3 05/16] libcamera: ipu3: Report sensor timestamp
Niklas Söderlund
niklas.soderlund at ragnatech.se
Thu Apr 22 08:55:01 CEST 2021
Hi Jacopo,
On 2021-04-22 08:25:03 +0200, Jacopo Mondi wrote:
> Hi Niklas,
>
> On Wed, Apr 21, 2021 at 08:37:18PM +0200, Niklas Söderlund wrote:
> > Hi Jacopo,
> >
> > On 2021-04-21 18:03:08 +0200, Jacopo Mondi wrote:
> > > Report the sensor's timestamp in the Request metadata by using the
> > > CIO2 buffer timestamp as an initial approximation.
> > >
> > > The buffer's timestamp is recorded at DMA-transfer time, and it does not
> > > theoretically matches the 'start of exposure' definition, but when used
> > > to compare two consecutive frames it gives an acceptable estimation of
> > > the sensor frame period duration.
> > >
> > > Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> > > Reviewed-by: Hirokazu Honda <hiroh at chromium.org>
> > > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > > ---
> > > src/libcamera/pipeline/ipu3/ipu3.cpp | 9 +++++++++
> > > 1 file changed, 9 insertions(+)
> > >
> > > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > > index 51446fcf5bc1..28e849a43a3e 100644
> > > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > > @@ -1255,6 +1255,15 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
> > >
> > > Request *request = info->request;
> > >
> > > + /*
> > > + * Record the sensor's timestamp in the request metadata.
> > > + *
> > > + * \todo The sensor timestamp should be better estimated by connecting
> > > + * to the V4L2Device::frameStart signal.
> > > + */
> >
> > I'm OK with this patch as is, but just in case you missed it. The signal
> > is already wired to CIO2Device::frameStart() is and used to feed the
> > DelayedControls state machine. So all the building blocks for this todo
> > I think is already in place,
> >
> > void PipelineHandlerIPU3::stamp(uint32_t sequence)
> > {
> > IPU3Frames::Info *info = frameInfos_.find(buffer);
> >
> > ...
> >
> > info->request->metadata().set(controls::SensorTimestamp, ...);
> > }
> >
> > int PipelineHandlerIPU3::registerCameras()
> > {
> > ....
> >
> > data->cio2_.frameStart().connect(this, &PipelineHandlerIPU3::stamp);
> >
> > ....
> > }
>
> I've seen that, but plumbing in the infrastructure for timestamping in
> the library was considered not necessary at this time
>
> >
> > That being said I think we might get better values using the buffer
> > timestamp as done in this patch, if nothing else less jitter. Only draw
> > back I can think of is that we can't grantee the timestamp coming from
> > the kernel relates to BOOTTIME.
> >
>
> I keep hitting walls all over the places....
> Timestamping is performed in the cio2 receiver driver with:
>
> ns = ktime_get_ns()
>
> ktime_get() documentation reads as:
>
> /*
> * ktime_get() family: read the current time in a multitude of ways,
> *
> * The default time reference is CLOCK_MONOTONIC, starting at
> * boot time but not counting the time spent in suspend.
> * For other references, use the functions with "real", "clocktai",
> * "boottime" and "raw" suffixes.
> *
> * To get the time in a different format, use the ones wit
> * "ns", "ts64" and "seconds" suffix.
> *
> * See Documentation/core-api/timekeeping.rst for more details.
> */
>
> I recall I repeated multiple times the reference clock was BOOTTIME,
> not sure because I overlooked it or because at the time (last week...)
> I had no real understanding of the differences between MONOTONIC and
> BOOTTIME...
>
> Should we change the definition of the control again to support
> multiple time sources, and add one property to report which reference
> is used ?
I'm a bit slow and I still don't understand the need for users to know
what the reference clock is used :-) Is it not enough that it have a ts
it can diff between two exposers and get a usable delta in a known time
unit? And of course that it's not subjected to the "fun" of NTP clock
adjusting mechanisms.
I don't want to distract for the real work in this patch and as I said
I'm fine with the patch as is, only wanted to point out that the todo
was ready to be acted on. And that IMHO I think we would gain more from
the solution without the todo addressed, or of course change the SOE
signal API to include a ts from the kernel set at the IRQ. My fear being
that if we produce the ts in user-space it will be subjected to jitter
that will be worse then using the buffer ts as done here.
>
> > > + request->metadata().set(controls::SensorTimestamp,
> > > + buffer->metadata().timestamp);
> > > +
> > > /* If the buffer is cancelled force a complete of the whole request. */
> > > if (buffer->metadata().status == FrameMetadata::FrameCancelled) {
> > > for (auto it : request->buffers())
> > > --
> > > 2.31.1
> > >
> > > _______________________________________________
> > > libcamera-devel mailing list
> > > libcamera-devel at lists.libcamera.org
> > > https://lists.libcamera.org/listinfo/libcamera-devel
> >
> > --
> > Regards,
> > Niklas Söderlund
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list