From patchwork Thu Jul 23 08:43:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 8936 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 CC1B0BD86F for ; Thu, 23 Jul 2020 08:43:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9B6016112A; Thu, 23 Jul 2020 10:43:46 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="QH68CWdb"; dkim-atps=neutral Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3373B60939 for ; Thu, 23 Jul 2020 10:43:44 +0200 (CEST) Received: by mail-wm1-x344.google.com with SMTP id o8so4197075wmh.4 for ; Thu, 23 Jul 2020 01:43:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=fucOP9zskuOzWC8DYYa7syEbPMpQ+PXRcZIhZYYEiFY=; b=QH68CWdb37u8QXTAW4pIh2VJA+nrPJToR/P3GtDPBmpssEZ6eVuUySYbsxHqkZAVSZ yg+So5vi79Mk4tTunxREyWq1MUvlUaPATR91ZG55k0lMgdR7xrkLLSYXm8cyOirPk56N Jr/12PkUR0BLMQTc7rdvsyU2OWRDymseEGoR/sXaH/vlro4/3GIs9PLHh6vRY4IppvC0 b7xVDAOSWPwOwyE7BRt1Ja7UmdbgDiSY/TbCPew4Vb8z0KQI/uiKbI/XOLlc9Y08BOxv 796frSh3LbgQh3BM/NOd3HXTWmQx5J14lF+e1DuXnHeGw9bTLuS1c9+IEkUIrcY91Z7o VraA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=fucOP9zskuOzWC8DYYa7syEbPMpQ+PXRcZIhZYYEiFY=; b=rYbhYujfzFgqxPj3St2OM2R+bH96hrd4kLl/fX/7FCRgFngPot0sEmJhfAECB4Q3po celF48rmGNiIQcPDIT6sY+eKfytdSpQu8/BHph+d0ZOWxyRCZlUAxVD9u5agS17jrLb2 6zz2GG/2HFRvGJmi5m7qPvn5fafZD3rOvnEp+xdNuU4EVfCcmjpKJJAoXNlP/lSn2qSS EjyocbjcP7K5sFALgtUnMjDjlIcgE1dbVmlSRv4VjVkkKUCCVhtIfOqe6hjHESNWbFrm PkjbBfYCDp7wPE60UuCD1WfdCAij1KcIxXdqsuMJABiBfcZZcVXmANzMk8cx+KGZijow /NPw== X-Gm-Message-State: AOAM530CYFoAhjNnz1M8uUdHxOWqro3IdipMHXgTUeMntPdfgZPlA+z/ DmiN+jxKTRT2lCqSHiRKYPS9Ou/o3ES27g== X-Google-Smtp-Source: ABdhPJzXMcT/2zSW/WfITTmf1YN3+kEGmfFlFpwwEFZK/1Ug1YoXFl9Xwj3O0zWEU4Q5HSrUJxFaow== X-Received: by 2002:a1c:ed01:: with SMTP id l1mr3240685wmh.33.1595493823543; Thu, 23 Jul 2020 01:43:43 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id t2sm2809450wmb.25.2020.07.23.01.43.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Jul 2020 01:43:43 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Thu, 23 Jul 2020 09:43:37 +0100 Message-Id: <20200723084338.13711-2-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200723084338.13711-1-david.plowman@raspberrypi.com> References: <20200723084338.13711-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 1/2] libcamera: Infrastructure for digital zoom 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" These changes add a Digital Zoom control, taking a rectangle as its argument, indicating the region of the sensor output that the pipeline will "zoom up" to the final output size. Additionally, we need to have a method returning the "pipelineCrop" which gives the dimensions of the sensor output, taken by the pipeline, and within which we can subsequently pan and zoom. Signed-off-by: David Plowman --- include/libcamera/camera.h | 2 ++ include/libcamera/internal/pipeline_handler.h | 4 +++ src/libcamera/camera.cpp | 27 +++++++++++++++++++ src/libcamera/control_ids.yaml | 10 +++++++ 4 files changed, 43 insertions(+) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 4d1a4a9..6819b8e 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -92,6 +92,8 @@ public: std::unique_ptr generateConfiguration(const StreamRoles &roles = {}); int configure(CameraConfiguration *config); + Size const &getPipelineCrop() const; + Request *createRequest(uint64_t cookie = 0); int queueRequest(Request *request); diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 22e629a..5bfe890 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -89,6 +89,8 @@ public: const char *name() const { return name_; } + Size const &getPipelineCrop() const { return pipelineCrop_; } + protected: void registerCamera(std::shared_ptr camera, std::unique_ptr data); @@ -100,6 +102,8 @@ protected: CameraManager *manager_; + Size pipelineCrop_; + private: void mediaDeviceDisconnected(MediaDevice *media); virtual void disconnect(); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 69a1b44..f8b8ec6 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -793,6 +793,33 @@ int Camera::configure(CameraConfiguration *config) return 0; } +/** + * \brief Return the size of the sensor image being used by the pipeline + * to create the output. + * + * This method returns the size, in pixels, of the raw image read from the + * sensor and which is used by the pipeline to form the output image(s) + * (rescaling if necessary). Note that these values take account of any + * cropping performed on the sensor output so as to produce the correct + * aspect ratio. It would normally be necessary to retrieve these values + * in order to calculate correct parameters for digital zoom. + * + * Example: a sensor mode may produce a 1920x1440 output image. But if an + * application has requested a 16:9 image, the values returned here might + * be 1920x1080 - the largest portion of the sensor output that provides + * the correct aspect ratio. + * + * \context This function is \threadsafe. It will only return valid + * (non-zero) values when the camera has been configured. + * + * \return The dimensions of the sensor image used by the pipeline. + */ + +Size const &Camera::getPipelineCrop() const +{ + return p_->pipe_->getPipelineCrop(); +} + /** * \brief Create a request object for the camera * \param[in] cookie Opaque cookie for application use diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml index 988b501..5a099d5 100644 --- a/src/libcamera/control_ids.yaml +++ b/src/libcamera/control_ids.yaml @@ -262,4 +262,14 @@ controls: In this respect, it is not necessarily aimed at providing a way to implement a focus algorithm by the application, rather an indication of how in-focus a frame is. + + - DigitalZoom: + type: Rectangle + description: | + Sets the portion of the full sensor image, in pixels, that will be + used for digital zoom. That is, this part of the sensor output will + be scaled up to make the full size output image (and everything else + discarded). To obtain the "full sensor image" that is available, the + method Camera::getOutputCrop() should be called once the camera is + configured. An application may pan and zoom within this rectangle. ...