summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2020-10-02 19:40:42 +0200
committerJacopo Mondi <jacopo@jmondi.org>2020-10-07 16:07:44 +0200
commit3c84d88193c8807feb6cd426ce1bfc1d12e66ffa (patch)
tree23ed7aea3e27818690ed7eb3ae76fdfda174a24a /src
parent94c4d49ebe41a58657d402df5f57556da96b5023 (diff)
android: camera_stream: Delegate Encoder construction
Delegate the construction of the encoder to the CameraStream class for streams that need post-processing. Reviewed-by: Umang Jain <email@uajain.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/android/camera_device.cpp23
-rw-r--r--src/android/camera_stream.cpp16
-rw-r--r--src/android/camera_stream.h4
3 files changed, 26 insertions, 17 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 0600ebc8..9c9a5cfa 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
StreamConfiguration &cfg = config_->at(index);
- /*
- * Construct a software encoder for the MJPEG streams from the
- * chosen libcamera source stream.
- */
- Encoder *encoder = new EncoderLibJpeg();
- int ret = encoder->configure(cfg);
- if (ret) {
- LOG(HAL, Error) << "Failed to configure encoder";
- delete encoder;
- return ret;
- }
-
- streams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);
+ streams_.emplace_back(formats::MJPEG, cfg.size, type, index);
jpegStream->priv = static_cast<void *>(&streams_.back());
}
@@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
return -EINVAL;
}
+ /*
+ * Configure the HAL CameraStream instances using the associated
+ * StreamConfiguration and set the number of required buffers in
+ * the Android camera3_stream_t.
+ */
for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
camera3_stream_t *stream = stream_list->streams[i];
CameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);
StreamConfiguration &cfg = config_->at(cameraStream->index());
+ int ret = cameraStream->configure(cfg);
+ if (ret)
+ return ret;
+
/* Use the bufferCount confirmed by the validation process. */
stream->max_buffers = cfg.bufferCount;
}
diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp
index 7205721d..2d0c6ff9 100644
--- a/src/android/camera_stream.cpp
+++ b/src/android/camera_stream.cpp
@@ -8,11 +8,21 @@
#include "camera_stream.h"
#include "jpeg/encoder.h"
+#include "jpeg/encoder_libjpeg.h"
using namespace libcamera;
-CameraStream::CameraStream(PixelFormat format, Size size,
- Type type, unsigned int index, Encoder *encoder)
- : format_(format), size_(size), type_(type), index_(index), encoder_(encoder)
+CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)
+ : format_(format), size_(size), type_(type), index_(index)
{
+ if (type_ == Type::Internal || type_ == Type::Mapped)
+ encoder_ = std::make_unique<EncoderLibJpeg>();
+}
+
+int CameraStream::configure(const libcamera::StreamConfiguration &cfg)
+{
+ if (encoder_)
+ return encoder_->configure(cfg);
+
+ return 0;
}
diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
index e5427686..2f49d3d4 100644
--- a/src/android/camera_stream.h
+++ b/src/android/camera_stream.h
@@ -100,7 +100,7 @@ public:
Mapped,
};
CameraStream(libcamera::PixelFormat format, libcamera::Size size,
- Type type, unsigned int index, Encoder *encoder = nullptr);
+ Type type, unsigned int index);
const libcamera::PixelFormat &format() const { return format_; }
const libcamera::Size &size() const { return size_; }
@@ -108,6 +108,8 @@ public:
unsigned int index() const { return index_; }
Encoder *encoder() const { return encoder_.get(); }
+ int configure(const libcamera::StreamConfiguration &cfg);
+
private:
libcamera::PixelFormat format_;
libcamera::Size size_;