summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2022-05-27 18:34:39 +0900
committerJacopo Mondi <jacopo@jmondi.org>2022-06-10 11:48:09 +0200
commit246d3f631bf6bb51fd5c022cc78068cbd829ce3a (patch)
tree12e319d65d3d45842f787670f5e05d2cddfc150b /src
parent7ea83eba0df612f5771ebd9ae06bf22ca6f4b915 (diff)
android: camera_device: Use YUV post-processor
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: Hirokazu Honda <hiroh@chromium.org> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/android/camera_device.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 25fae9c8..11acfd6b 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 as 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. */