diff options
-rw-r--r-- | src/android/camera_device.h | 1 | ||||
-rw-r--r-- | src/android/camera_stream.cpp | 37 |
2 files changed, 21 insertions, 17 deletions
diff --git a/src/android/camera_device.h b/src/android/camera_device.h index a5576927..296c2f18 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -48,6 +48,7 @@ public: unsigned int id() const { return id_; } camera3_device_t *camera3Device() { return &camera3Device_; } + const CameraCapabilities *capabilities() const { return &capabilities_; } const std::shared_ptr<libcamera::Camera> &camera() const { return camera_; } const std::string &maker() const { return maker_; } diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index 0f5ae947..4a1658b8 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -10,6 +10,7 @@ #include <sys/mman.h> #include "camera_buffer.h" +#include "camera_capabilities.h" #include "camera_device.h" #include "camera_metadata.h" #include "jpeg/post_processor_jpeg.h" @@ -47,20 +48,6 @@ CameraStream::CameraStream(CameraDevice *const cameraDevice, : cameraDevice_(cameraDevice), config_(config), type_(type), camera3Stream_(camera3Stream), index_(index) { - if (type_ == Type::Internal || type_ == Type::Mapped) { - /* - * \todo There might be multiple post-processors. The logic - * which should be instantiated here, is deferred for the - * future. For now, we only have PostProcessorJpeg and that - * is what we instantiate here. - */ - postProcessor_ = std::make_unique<PostProcessorJpeg>(cameraDevice_); - } - - if (type == Type::Internal) { - allocator_ = std::make_unique<FrameBufferAllocator>(cameraDevice_->camera()); - mutex_ = std::make_unique<std::mutex>(); - } } const StreamConfiguration &CameraStream::configuration() const @@ -75,15 +62,31 @@ Stream *CameraStream::stream() const int CameraStream::configure() { - if (postProcessor_) { + if (type_ == Type::Internal || type_ == Type::Mapped) { + const PixelFormat outFormat = + cameraDevice_->capabilities()->toPixelFormat(camera3Stream_->format); StreamConfiguration output = configuration(); - output.pixelFormat = formats::MJPEG; + output.pixelFormat = outFormat; + + switch (outFormat) { + case formats::MJPEG: + postProcessor_ = std::make_unique<PostProcessorJpeg>(cameraDevice_); + break; + + default: + LOG(HAL, Error) << "Unsupported format: " << outFormat; + return -EINVAL; + } + int ret = postProcessor_->configure(configuration(), output); if (ret) return ret; } - if (allocator_) { + if (type_ == Type::Internal) { + allocator_ = std::make_unique<FrameBufferAllocator>(cameraDevice_->camera()); + mutex_ = std::make_unique<std::mutex>(); + int ret = allocator_->allocate(stream()); if (ret < 0) return ret; |