[libcamera-devel,4/5] android: camera_device: Use YUV post-processor
diff mbox series

Message ID 20220110165524.72978-5-jacopo@jmondi.org
State Accepted
Delegated to: Jacopo Mondi
Headers show
Series
  • android: Plumb the YUV processor in
Related show

Commit Message

Jacopo Mondi Jan. 10, 2022, 4:55 p.m. UTC
From: Hirokazu Honda <hiroh@chromium.org>

When creating the list of StreamConfiguration to be requested to the camera,
map NV12 streams of equal size and format together, so that they will be
generated by using the YUV post-processor.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/android/camera_device.cpp | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

Comments

Hirokazu Honda Jan. 12, 2022, 7:32 a.m. UTC | #1
Hi Jacopo,

On Tue, Jan 11, 2022 at 1:54 AM Jacopo Mondi <jacopo@jmondi.org> wrote:
>
> From: Hirokazu Honda <hiroh@chromium.org>
>
> When creating the list of StreamConfiguration to be requested to the camera,
> map NV12 streams of equal size and format together, so that they will be
> generated by using the YUV post-processor.
>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

Would you mind adding Signed-off-by: Hirokazu Honda <hiroh@chromium.org>?

Best Regards,
-Hiro

> ---
>  src/android/camera_device.cpp | 32 +++++++++++++++++++++++++++++---
>  1 file changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index a44f199d25d8..4e44bcfa0852 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -605,14 +605,40 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>                         continue;
>                 }
>
> +               /*
> +                * While gralloc usage flags are supposed to report usage
> +                * patterns to select a suitable buffer allocation strategy, in
> +                * practice they're also used to make other decisions, such as
> +                * selecting the actual format for the IMPLEMENTATION_DEFINED
> +                * HAL pixel format. To avoid issues, we thus have to set the
> +                * GRALLOC_USAGE_HW_CAMERA_WRITE flag unconditionally, even for
> +                * streams that will be produced in software.
> +                */
> +               stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE;
> +
> +               /*
> +                * If a CameraStream with the same size and format of the
> +                * current stream has already been requested, associate the two.
> +                */
> +               auto iter = std::find_if(
> +                       streamConfigs.begin(), streamConfigs.end(),
> +                       [&size, &format](const Camera3StreamConfig &streamConfig) {
> +                               return streamConfig.config.size == size &&
> +                                      streamConfig.config.pixelFormat == format;
> +                       });
> +               if (iter != streamConfigs.end()) {
> +                       /* Add usage to copy the buffer in streams[0] to stream. */
> +                       iter->streams[0].stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN;
> +                       stream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
> +                       iter->streams.push_back({ stream, CameraStream::Type::Mapped });
> +                       continue;
> +               }
> +
>                 Camera3StreamConfig streamConfig;
>                 streamConfig.streams = { { stream, CameraStream::Type::Direct } };
>                 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. */
> --
> 2.34.1
>

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index a44f199d25d8..4e44bcfa0852 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -605,14 +605,40 @@  int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
 			continue;
 		}
 
+		/*
+		 * While gralloc usage flags are supposed to report usage
+		 * patterns to select a suitable buffer allocation strategy, in
+		 * practice they're also used to make other decisions, such as
+		 * selecting the actual format for the IMPLEMENTATION_DEFINED
+		 * HAL pixel format. To avoid issues, we thus have to set the
+		 * GRALLOC_USAGE_HW_CAMERA_WRITE flag unconditionally, even for
+		 * streams that will be produced in software.
+		 */
+		stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE;
+
+		/*
+		 * If a CameraStream with the same size and format of the
+		 * current stream has already been requested, associate the two.
+		 */
+		auto iter = std::find_if(
+			streamConfigs.begin(), streamConfigs.end(),
+			[&size, &format](const Camera3StreamConfig &streamConfig) {
+				return streamConfig.config.size == size &&
+				       streamConfig.config.pixelFormat == format;
+			});
+		if (iter != streamConfigs.end()) {
+			/* Add usage to copy the buffer in streams[0] to stream. */
+			iter->streams[0].stream->usage |= GRALLOC_USAGE_SW_READ_OFTEN;
+			stream->usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
+			iter->streams.push_back({ stream, CameraStream::Type::Mapped });
+			continue;
+		}
+
 		Camera3StreamConfig streamConfig;
 		streamConfig.streams = { { stream, CameraStream::Type::Direct } };
 		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. */