[libcamera-devel] [PATCH v3 05/16] libcamera: ipu3: Report sensor timestamp

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Apr 21 20:37:18 CEST 2021


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);

        ....
    }

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.

> +	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


More information about the libcamera-devel mailing list