[libcamera-devel] [PATCH v2 3/3] android: camera_device: Configure one stream for identical stream requests
Hirokazu Honda
hiroh at chromium.org
Thu Aug 19 22:12:14 CEST 2021
An Android HAL client may request identical stream requests. It is
redundant that a native camera device produces a separate stream for
each of the identical requests.
Configure camera one stream configuration for the identical stream
requests.
Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
---
src/android/camera_device.cpp | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index a69b687a..88cfd117 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -617,14 +617,32 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
continue;
}
+ /* This stream will be produced by hardware. */
+ 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. */
@@ -1077,6 +1095,7 @@ void CameraDevice::requestComplete(Request *request)
camera3_capture_result_t captureResult = {};
captureResult.frame_number = descriptor.frameNumber_;
captureResult.num_output_buffers = descriptor.buffers_.size();
+ /* Handle post-processing. */
for (camera3_stream_buffer_t &buffer : descriptor.buffers_) {
buffer.acquire_fence = -1;
buffer.release_fence = -1;
@@ -1132,12 +1151,11 @@ void CameraDevice::requestComplete(Request *request)
resultMetadata = std::make_unique<CameraMetadata>(0, 0);
}
- /* Handle any JPEG compression. */
for (camera3_stream_buffer_t &buffer : descriptor.buffers_) {
CameraStream *cameraStream =
static_cast<CameraStream *>(buffer.stream->priv);
- if (cameraStream->camera3Stream().format != HAL_PIXEL_FORMAT_BLOB)
+ if (cameraStream->type() == CameraStream::Type::Direct)
continue;
FrameBuffer *src = request->findBuffer(cameraStream->stream());
--
2.33.0.rc2.250.ged5fa647cd-goog
More information about the libcamera-devel
mailing list