[libcamera-devel] [PATCH 4/5] android: camera_device: Use YUV post-processor

Hirokazu Honda hiroh at chromium.org
Wed Jan 12 08:32:44 CET 2022


Hi Jacopo,

On Tue, Jan 11, 2022 at 1:54 AM Jacopo Mondi <jacopo at jmondi.org> wrote:
>
> From: Hirokazu Honda <hiroh at 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 at jmondi.org>

Would you mind adding Signed-off-by: Hirokazu Honda <hiroh at 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
>


More information about the libcamera-devel mailing list