[libcamera-devel] [PATCH 2/8] libcamera: pipeline: Set the Sensor sequence number for all pipelines
Umang Jain
umang.jain at ideasonboard.com
Tue Dec 7 14:13:16 CET 2021
Hi Kieran,
On 12/7/21 5:09 AM, Kieran Bingham wrote:
> The SensorSequence metadata provides the sequence number associated with
> the image capture directly.
>
> While we already report sequence numbers in the metadata of the buffers,
> this can lead to mis-leading parsing of those sequence numbers which may
> be purely monotonic sequences from an ISP, and not represent the true
> sequence counts from a capture device.
>
> Use the newly added SensorSequence metadata control and populate
> completed requests with the sequence number from the appropriate stream.
> For ISP based devices, such as the IPU3, RPi, and RkISP1, this comes
> from the CSI2 receiver capture device, while for the Simple pipeline and
> the UVC Video pipeline, this comes from the single video capture device.
>
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 4 +++-
> src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 3 +++
> src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 +++-
> src/libcamera/pipeline/simple/simple.cpp | 12 ++++++++----
> src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 2 ++
> 5 files changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 313220624aff..a7f35840afbb 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -1372,13 +1372,15 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
> }
>
> /*
> - * Record the sensor's timestamp in the request metadata.
> + * Record the sensor's timestamp and sequence in the request metadata.
> *
> * \todo The sensor timestamp should be better estimated by connecting
> * to the V4L2Device::frameStart signal.
> */
> request->metadata().set(controls::SensorTimestamp,
> buffer->metadata().timestamp);
> + request->metadata().set(controls::SensorSequence,
> + buffer->metadata().sequence);
I vaguely remember looking into consolidating SensorTimestamp with
frameStart signal(turned out to be non-trivial), as mentioned in the
\todo above.
Does sequence number also seems a good candidate to be emitted from the
signal, from that angle? If yes, I would add that in the \todo as well.
For the patch
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
>
> info->effectiveSensorControls = delayedCtrls_->get(buffer->metadata().sequence);
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 321b72adbbf7..f458587a8920 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1549,6 +1549,7 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
> * as it does not receive the FrameBuffer object.
> */
> ctrl.set(controls::SensorTimestamp, buffer->metadata().timestamp);
> + ctrl.set(controls::SensorSequence, buffer->metadata().sequence);
> bayerQueue_.push({ buffer, std::move(ctrl) });
> } else {
> embeddedQueue_.push(buffer);
> @@ -1786,6 +1787,8 @@ void RPiCameraData::fillRequestMetadata(const ControlList &bufferControls,
> {
> request->metadata().set(controls::SensorTimestamp,
> bufferControls.get(controls::SensorTimestamp));
> + request->metadata().set(controls::SensorSequence,
> + bufferControls.get(controls::SensorSequence));
>
> request->metadata().set(controls::ScalerCrop, scalerCrop_);
> }
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 36ef6a02ae90..27592e473c14 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -1077,13 +1077,15 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
> Request *request = buffer->request();
>
> /*
> - * Record the sensor's timestamp in the request metadata.
> + * Record the sensor's timestamp and sequence in the request metadata.
> *
> * \todo The sensor timestamp should be better estimated by connecting
> * to the V4L2Device::frameStart signal.
> */
> request->metadata().set(controls::SensorTimestamp,
> buffer->metadata().timestamp);
> + request->metadata().set(controls::SensorSequence,
> + buffer->metadata().sequence);
>
> completeBuffer(request, buffer);
> tryCompleteRequest(request);
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 701fb4be0b71..4c5d9c0b9919 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -667,9 +667,10 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
> }
>
> /*
> - * Record the sensor's timestamp in the request metadata. The request
> - * needs to be obtained from the user-facing buffer, as internal
> - * buffers are free-wheeling and have no request associated with them.
> + * Record the sensor's timestamp and sequence in the request metadata.
> + * The request needs to be obtained from the user-facing buffer, as
> + * internal buffers are free-wheeling and have no request associated
> + * with them.
> *
> * \todo The sensor timestamp should be better estimated by connecting
> * to the V4L2Device::frameStart signal if the platform provides it.
> @@ -686,9 +687,12 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
> }
> }
>
> - if (request)
> + if (request) {
> request->metadata().set(controls::SensorTimestamp,
> buffer->metadata().timestamp);
> + request->metadata().set(controls::SensorSequence,
> + buffer->metadata().sequence);
> + }
>
> /*
> * Queue the captured and the request buffer to the converter if format
> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> index 264f5370cf32..f5fab3b69e6d 100644
> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> @@ -666,6 +666,8 @@ void UVCCameraData::bufferReady(FrameBuffer *buffer)
> /* \todo Use the UVC metadata to calculate a more precise timestamp */
> request->metadata().set(controls::SensorTimestamp,
> buffer->metadata().timestamp);
> + request->metadata().set(controls::SensorSequence,
> + buffer->metadata().sequence);
>
> pipe()->completeBuffer(request, buffer);
> pipe()->completeRequest(request);
More information about the libcamera-devel
mailing list