From patchwork Mon Oct 5 10:46:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9950 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 97AD1C3B5D for ; Mon, 5 Oct 2020 10:47:38 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AD38E63C48; Mon, 5 Oct 2020 12:47:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="WLclBpEl"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C0C9F63B27 for ; Mon, 5 Oct 2020 12:47:34 +0200 (CEST) Received: from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 49AAB59E; Mon, 5 Oct 2020 12:47:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1601894854; bh=berp9T5tcX7IOm2p8Q9u0T8CRn9Ed9OI/Ti1r51BiII=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WLclBpElylXfgEUeFs8GLSEBmvE5oxmRjnEvuaNNGyUAus/Wx3b5cRpPcVcLZUvQN +si8dlnpBq59wMmb1cLWZthaTGn0IritnKi1djmtuJcGK8vqEQvUrsOsC6pbjxjH4y WuUNUPEC7X0K2lC0obbH78bpAPzF/Gu+yc8ifhI8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Mon, 5 Oct 2020 13:46:37 +0300 Message-Id: <20201005104649.10812-4-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201005104649.10812-1-laurent.pinchart@ideasonboard.com> References: <20201005104649.10812-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 03/15] android: camera_stream: Delegate Encoder construction X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: Jacopo Mondi Delegate the construction of the encoder to the CameraStream class for streams that need post-processing. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Umang Jain --- src/android/camera_device.cpp | 23 ++++++++++------------- src/android/camera_stream.cpp | 17 ++++++++++++++--- src/android/camera_stream.h | 4 +++- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 0600ebc81c64..9c9a5cfa3c2f 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(&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(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 585bf2b68f4f..5b2b625c563b 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -7,10 +7,21 @@ #include "camera_stream.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), encoder(nullptr) { + if (type_ == Type::Internal || type_ == Type::Mapped) + encoder_.reset(new 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 07c714e3a365..d0dc40d81151 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_;