[libcamera-devel] [PATCH] android: camera_device: Update gralloc usage flags for streams
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sat Mar 6 23:38:33 CET 2021
Hi Laurent,
Thanks for your work.
On 2021-03-05 13:56:28 +0200, Laurent Pinchart wrote:
> When configuring streams, the camera HAL is supposed to update the
> gralloc usage flags to reflect the operations it will need to do on the
> stream buffers. Failure to do so leads to incorrect format selection by
> gralloc for the HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED format, as
> gralloc will not take into consideration the need of the camera to
> access the buffers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
This indeed fixes the OpenCamera issue.
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> src/android/camera_device.cpp | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index ae01c362559e..3ee683705d00 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1539,6 +1539,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> streamConfig.config.size = size;
> streamConfig.config.pixelFormat = format;
> streamConfigs.push_back(std::move(streamConfig));
> +
> + /* This stream will be produced by hardware. */
> + stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE;
> }
>
> /* Now handle the MJPEG streams, adding a new stream if required. */
> @@ -1548,7 +1551,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>
> /* Search for a compatible stream in the non-JPEG ones. */
> for (size_t i = 0; i < streamConfigs.size(); ++i) {
> - const auto &cfg = streamConfigs[i].config;
> + Camera3StreamConfig &streamConfig = streamConfigs[i];
> + const auto &cfg = streamConfig.config;
>
> /*
> * \todo The PixelFormat must also be compatible with
> @@ -1563,6 +1567,13 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>
> type = CameraStream::Type::Mapped;
> index = i;
> +
> + /*
> + * The source stream will be read by software to
> + * produce the JPEG stream.
> + */
> + camera3_stream_t *stream = streamConfig.streams[0].stream;
> + stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN;
> break;
> }
>
> @@ -1590,6 +1601,9 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
> index = streamConfigs.size() - 1;
> }
>
> + /* The JPEG stream will be produced by software. */
> + jpegStream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
> +
> streamConfigs[index].streams.push_back({ jpegStream, type });
> }
>
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> 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