summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-01 16:42:13 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-07-06 23:58:42 +0100
commit2f34f5ef064505e82c86932a48ddcaa92b9b95f1 (patch)
treecd8dff0179d11c3255cb5a3ed3be440f2b565cbc
parenteac0542c5e15137854e9ecf864da9953960dbcd8 (diff)
android: camera_device: Maintain a vector of CameraStream
Introduce a vector storing a CameraStream to track and maintain state between an Android stream (camera3_stream_t) and a libcamera Stream. Only the index of the libcamera stream is stored, to facilitate identifying the correct index for both the StreamConfiguration and Stream vectors. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--src/android/camera_device.cpp21
-rw-r--r--src/android/camera_device.h10
2 files changed, 29 insertions, 2 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 4e77a92d..6d060e0c 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -952,6 +952,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
return -EINVAL;
}
+ /*
+ * Clear and remove any existing configuration from previous calls, and
+ * ensure the required entries are available without further
+ * re-allcoation.
+ */
+ streams_.clear();
+ streams_.reserve(stream_list->num_streams);
+
+ /*
+ * Track actually created streams, as there may not be a 1:1 mapping of
+ * camera3 streams to libcamera streams.
+ */
+ unsigned int streamIndex = 0;
+
for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
camera3_stream_t *stream = stream_list->streams[i];
@@ -974,6 +988,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
streamConfiguration.pixelFormat = format;
config_->addConfiguration(streamConfiguration);
+
+ streams_[i].index = streamIndex++;
}
switch (config_->validate()) {
@@ -991,10 +1007,11 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
camera3_stream_t *stream = stream_list->streams[i];
- StreamConfiguration &streamConfiguration = config_->at(i);
+ CameraStream *cameraStream = &streams_[i];
+ StreamConfiguration &cfg = config_->at(cameraStream->index);
/* Use the bufferCount confirmed by the validation process. */
- stream->max_buffers = streamConfiguration.bufferCount;
+ stream->max_buffers = cfg.bufferCount;
}
/*
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index d7834d94..d00f617b 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -25,6 +25,15 @@
class CameraMetadata;
+struct CameraStream {
+ /*
+ * The index of the libcamera StreamConfiguration as added during
+ * configureStreams(). A single libcamera Stream may be used to deliver
+ * one or more streams to the Android framework.
+ */
+ unsigned int index;
+};
+
class CameraDevice : protected libcamera::Loggable
{
public:
@@ -90,6 +99,7 @@ private:
std::vector<Camera3StreamConfiguration> streamConfigurations_;
std::map<int, libcamera::PixelFormat> formatsMap_;
+ std::vector<CameraStream> streams_;
int facing_;
int orientation_;