[libcamera-devel] [PATCH 3/3] libcamera: v4l2: Detect frame drops on V4L2VideoDevice

Umang Jain umang.jain at ideasonboard.com
Mon May 9 14:45:19 CEST 2022


Hi Kieran,

Thank you for the patch

On 4/30/22 01:04, Kieran Bingham via libcamera-devel wrote:
> Pipelines with ISPs will report the output sequence number of the
> V4L2VideoDevice of the ISP as the sequence number of the request buffer
> completion. These have been seen to provide their own monotonic sequence
> number, which means that any frame drop from the CSI2 receiver is
> silently ignored and can easily go unnoticed. (except for frame rate
> changes).
>
> Add an internal tracking of the sequence number on V4L2VideoDevice
> instances to identify if there is ever a break in the stream.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>

> ---
>   include/libcamera/internal/v4l2_videodevice.h |  2 ++
>   src/libcamera/v4l2_videodevice.cpp            | 10 ++++++++++
>   2 files changed, 12 insertions(+)
>
> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
> index 9c9493cc16ed..ab4c4c56436d 100644
> --- a/include/libcamera/internal/v4l2_videodevice.h
> +++ b/include/libcamera/internal/v4l2_videodevice.h
> @@ -28,6 +28,7 @@
>   #include <libcamera/framebuffer.h>
>   #include <libcamera/geometry.h>
>   #include <libcamera/pixel_format.h>
> +#include <libcamera/sequence.h>
>   
>   #include "libcamera/internal/formats.h"
>   #include "libcamera/internal/v4l2_device.h"
> @@ -273,6 +274,7 @@ private:
>   	EventNotifier *fdBufferNotifier_;
>   
>   	State state_;
> +	Sequence monotonicObserver_;
>   
>   	Timer watchdog_;
>   	utils::Duration watchdogDuration_;
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index 05d3273ebb58..4cef5d40e0c6 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -1749,6 +1749,14 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()
>   	if (V4L2_TYPE_IS_OUTPUT(buf.type))
>   		return buffer;
>   
> +	/*
> +	 * Observe the buffer sequence number on capture devices to check for
> +	 * frame drops.
> +	 */
> +	int drops = monotonicObserver_.update(buf.sequence);
> +	if (drops)
> +		LOG(V4L2, Warning) << "Dropped " << drops << " frames";
> +
>   	unsigned int numV4l2Planes = multiPlanar ? buf.length : 1;
>   	FrameMetadata &metadata = buffer->metadata_;
>   
> @@ -1832,6 +1840,8 @@ int V4L2VideoDevice::streamOn()
>   		return ret;
>   	}
>   
> +	monotonicObserver_.reset();
> +
>   	state_ = State::Streaming;
>   	if (watchdogDuration_.count())
>   		watchdog_.start(std::chrono::duration_cast<std::chrono::milliseconds>(watchdogDuration_));


More information about the libcamera-devel mailing list