[libcamera-devel] [PATCH v2 05/10] pipeline: raspberrypi: Disable StreamOn for ISP Output0/1 when dropping frames
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Dec 2 14:44:06 CET 2022
Hi Naush,
Thank you for the patch.
On Tue, Nov 29, 2022 at 01:45:29PM +0000, Naushir Patuck via libcamera-devel wrote:
> If the pipeline handler is required to drop startup frames by the IPA, do not
> call StreamOn on the ISP Output0 and Output1 device nodes from
> PipelineHandlerRPi::start. This stops the ISP from generating output on those
> channels giving improving latency, and more crucially does not require internal
> buffers to be allocated to deal with this condition.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> ---
> .../pipeline/raspberrypi/data/default.json | 2 +-
> .../pipeline/raspberrypi/raspberrypi.cpp | 34 ++++++++++++++++---
> 2 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/data/default.json b/src/libcamera/pipeline/raspberrypi/data/default.json
> index d709e31850af..a7ea735c87f4 100644
> --- a/src/libcamera/pipeline/raspberrypi/data/default.json
> +++ b/src/libcamera/pipeline/raspberrypi/data/default.json
> @@ -14,7 +14,7 @@
> # min_total_unicam_buffers - external buffer count)
> "min_total_unicam_buffers": 4,
>
> - # The number of internal buffers used for ISP Output0. This must be set to 1.
> + # The number of internal buffers used for ISP Output0.
Can you explain this change in the commit message ?
> "num_output0_buffers": 1
> }
> }
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index ce411453db0a..86eb43a3a3c5 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1094,8 +1094,18 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>
> data->state_ = RPiCameraData::State::Idle;
>
> - /* Start all streams. */
> + /*
> + * Start all streams with the exception of ISP Output0 and Output1 if
> + * we are dropping some start-up frames. This saves a tiny bit of latency
> + * and avoids the need for allocating an Output0 buffer only to handle
> + * startup drop frame conditions.
> + */
I'm not sure to follow you here. Wouldn't it be sufficient to drop the
buffers at unicam's output without pushing them to the ISP ? Why does
delaying streamOn() help ?
> for (auto const stream : data->streams_) {
> + if (data->dropFrameCount_ &&
> + (stream == &data->isp_[Isp::Output0] ||
> + stream == &data->isp_[Isp::Output1]))
> + continue;
> +
> ret = stream->dev()->streamOn();
> if (ret) {
> stop(camera);
> @@ -1500,6 +1510,13 @@ int PipelineHandlerRPi::queueAllBuffers(Camera *camera)
> if (ret < 0)
> return ret;
> } else {
> + /*
> + * We don't enable streaming for Output0 and Output1 for
> + * startup frame drops, so don't queue any buffers.
> + */
> + if (stream == &data->isp_[Isp::Output0] ||
> + stream == &data->isp_[Isp::Output1])
> + continue;
> /*
> * For external streams, we must queue up a set of internal
> * buffers to handle the number of drop frames requested by
> @@ -2169,16 +2186,25 @@ void RPiCameraData::checkRequestCompleted()
> }
>
> /*
> - * Make sure we have three outputs completed in the case of a dropped
> - * frame.
> + * Only the ISP statistics output is generated when we are dropping
> + * frames on startup.
> */
> if (state_ == State::IpaComplete &&
> - ((ispOutputCount_ == 3 && dropFrameCount_) || requestCompleted)) {
> + ((ispOutputCount_ == 1 && dropFrameCount_) || requestCompleted)) {
> state_ = State::Idle;
> if (dropFrameCount_) {
> dropFrameCount_--;
> LOG(RPI, Debug) << "Dropping frame at the request of the IPA ("
> << dropFrameCount_ << " left)";
> + /*
> + * If we have finished dropping startup frames, start
> + * streaming on the ISP Output0 and Output1 nodes for
> + * normal operation.
> + */
> + if (!dropFrameCount_) {
> + isp_[Isp::Output0].dev()->streamOn();
> + isp_[Isp::Output1].dev()->streamOn();
> + }
> }
> }
> }
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list