From patchwork Mon Oct 5 10:46:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 9951 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 12B71C3B5D for ; Mon, 5 Oct 2020 10:47:39 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0684F63C4C; Mon, 5 Oct 2020 12:47:38 +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="aWnHfiqp"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 275A363B27 for ; Mon, 5 Oct 2020 12:47:35 +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 AC44D3B; 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=osi4Z+RtghKoXEuYdb+n5QvnBwR7M1NC0SwQftHsfZs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aWnHfiqp4Py+iYiZF8eSr+Z3kg1VX8ybSzprouftu7qqcxpJ1W6H7pBYhefixPTVn w1mv5yJMXytxcKhyfV4uUbL37RQ8Kn4BTezoNhFq4AA3pWAiJxgMA2+djBbHN/EbRG XWl9kktD1K/e8jCqKLX9DCakgp+xsx6Fj3tqtydU= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Mon, 5 Oct 2020 13:46:38 +0300 Message-Id: <20201005104649.10812-5-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 04/15] android: camera_stream: Construct with Android stream 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 A CameraStream maps a stream requested by Android to a libcamera::StreamConfiguration. It shall then be constructed with those information clearly specified. Change the CameraStream constructor to accept an Android camera3_stream_t and a libcamera::StreamConfiguration to copy the format and size information in the class members as no reference can be taken to the StreamConfiguration instances as they're subject to relocations. Pass to the CameraStream constructor a pointer to the CameraDevice class and make the CameraConfiguration accessible. It will be used to retrieve the StreamConfiguration associated with the CameraStream. Also change the format on which the CameraDevice performs checks to decide if post-processing is required, as the libcamera facing format is not meaningful anymore, but the Android required format should be used instead. Signed-off-by: Jacopo Mondi Reviewed-by: Kieran Bingham --- src/android/camera_device.cpp | 11 +++++------ src/android/camera_device.h | 4 ++++ src/android/camera_stream.cpp | 14 ++++++++++++-- src/android/camera_stream.h | 18 ++++++++++++++++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 9c9a5cfa3c2f..2c4dd4dee28c 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -1216,8 +1216,8 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) config_->addConfiguration(streamConfiguration); unsigned int index = config_->size() - 1; - streams_.emplace_back(format, size, CameraStream::Type::Direct, - index); + streams_.emplace_back(this, stream, streamConfiguration, + CameraStream::Type::Direct, index); stream->priv = static_cast(&streams_.back()); } @@ -1272,8 +1272,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) } StreamConfiguration &cfg = config_->at(index); - - streams_.emplace_back(formats::MJPEG, cfg.size, type, index); + streams_.emplace_back(this, jpegStream, cfg, type, index); jpegStream->priv = static_cast(&streams_.back()); } @@ -1405,7 +1404,7 @@ int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Reques descriptor->buffers[i].buffer = camera3Buffers[i].buffer; /* Software streams are handled after hardware streams complete. */ - if (cameraStream->format() == formats::MJPEG) + if (cameraStream->outputFormat() == HAL_PIXEL_FORMAT_BLOB) continue; /* @@ -1469,7 +1468,7 @@ void CameraDevice::requestComplete(Request *request) CameraStream *cameraStream = static_cast(descriptor->buffers[i].stream->priv); - if (cameraStream->format() != formats::MJPEG) + if (cameraStream->outputFormat() != HAL_PIXEL_FORMAT_BLOB) continue; Encoder *encoder = cameraStream->encoder(); diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 52923ec979a7..4e326fa3e1fb 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -43,6 +43,10 @@ public: unsigned int id() const { return id_; } camera3_device_t *camera3Device() { return &camera3Device_; } const libcamera::Camera *camera() const { return camera_.get(); } + libcamera::CameraConfiguration *cameraConfiguration() const + { + return config_.get(); + } int facing() const { return facing_; } int orientation() const { return orientation_; } diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp index 5b2b625c563b..5c1f1d7da416 100644 --- a/src/android/camera_stream.cpp +++ b/src/android/camera_stream.cpp @@ -7,13 +7,23 @@ #include "camera_stream.h" +#include "camera_device.h" #include "jpeg/encoder_libjpeg.h" using namespace libcamera; -CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index) - : format_(format), size_(size), type_(type), index_(index), encoder(nullptr) +CameraStream::CameraStream(CameraDevice *cameraDev, + camera3_stream_t *androidStream, + const libcamera::StreamConfiguration &cfg, + Type type, unsigned int index) + : cameraDevice_(cameraDev), androidStream_(androidStream), type_(type), + index_(index), encoder_(nullptr) { + config_ = cameraDevice_->cameraConfiguration(); + + format_ = cfg.pixelFormat; + size_ = cfg.size; + if (type_ == Type::Internal || type_ == Type::Mapped) encoder_.reset(new EncoderLibJpeg); } diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h index d0dc40d81151..2d71a50c78a4 100644 --- a/src/android/camera_stream.h +++ b/src/android/camera_stream.h @@ -9,11 +9,16 @@ #include +#include + +#include #include #include #include "jpeg/encoder.h" +class CameraDevice; + class CameraStream { public: @@ -99,9 +104,12 @@ public: Internal, Mapped, }; - CameraStream(libcamera::PixelFormat format, libcamera::Size size, + CameraStream(CameraDevice *cameraDev, + camera3_stream_t *androidStream, + const libcamera::StreamConfiguration &cfg, Type type, unsigned int index); + int outputFormat() const { return androidStream_->format; } const libcamera::PixelFormat &format() const { return format_; } const libcamera::Size &size() const { return size_; } Type type() const { return type_; } @@ -111,9 +119,15 @@ public: int configure(const libcamera::StreamConfiguration &cfg); private: + CameraDevice *cameraDevice_; + libcamera::CameraConfiguration *config_; + camera3_stream_t *androidStream_; + Type type_; + + /* Libcamera facing format and sizes. */ libcamera::PixelFormat format_; libcamera::Size size_; - Type type_; + /* * The index of the libcamera StreamConfiguration as added during * configureStreams(). A single libcamera Stream may be used to deliver