From patchwork Fri Jun 5 14:10:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 3952 X-Patchwork-Delegate: jacopo@jmondi.org Return-Path: Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DC7CD60410 for ; Fri, 5 Jun 2020 16:07:13 +0200 (CEST) X-Originating-IP: 93.34.118.233 Received: from localhost.localdomain (93-34-118-233.ip49.fastwebnet.it [93.34.118.233]) (Authenticated sender: jacopo@jmondi.org) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 761E820006; Fri, 5 Jun 2020 14:07:13 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Fri, 5 Jun 2020 16:10:02 +0200 Message-Id: <20200605141002.49119-9-jacopo@jmondi.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200605141002.49119-1-jacopo@jmondi.org> References: <20200605141002.49119-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 8/8] android: camera_device: Report frame durations 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: , X-List-Received-Date: Fri, 05 Jun 2020 14:07:14 -0000 Report the minimum frame durations for each collected stream configuration by inspecting the camera reported FrameDurationLimits property. Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 33 +++++++++++++++++++++++++++++---- src/android/camera_device.h | 3 ++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index bbfc2464c908..fdcbada754f6 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -175,7 +175,7 @@ int CameraDevice::initialize() return ret; } - ret = initializeStreamConfigurations(); + ret = initializeStreamConfigurations(properties); camera_->release(); return ret; } @@ -186,8 +186,27 @@ int CameraDevice::initialize() * stream configurations to be reported to the Android camera framework through * the static stream configuration metadata. */ -int CameraDevice::initializeStreamConfigurations() +int CameraDevice::initializeStreamConfigurations(const ControlList &properties) { + /* + * Collect minimum frame durations from the camera. Default to it + * 33.3 msec if the camera does not report frame duration information. + * + * \todo The frame durations interval reported by the camera through the + * FrameDurationLimits property represents the camera minimum and + * maximum durations, regardless of the currently configured image + * format and resolution. As we are currently missing an API to report + * the frame durations for a specific configuration and Android requires + * the minimum frame duration to be reported per-configuration, as of + * now report the duration value for all supported stream + * configurations. + */ + int64_t minFrameDuration = 33333333; + if (properties.contains(properties::FrameDurationLimits)) { + Span durationLimits = properties.get(properties::FrameDurationLimits); + minFrameDuration = static_cast(durationLimits[0]); + } + /* * Get the maximum output resolutions * \todo Get this from the camera properties once defined @@ -316,7 +335,13 @@ int CameraDevice::initializeStreamConfigurations() status != CameraConfiguration::Valid) continue; - streamConfigurations_.push_back({ res, camera3Format.scalerFormat }); + /* + * Default the minimum frame duration and update it + * later. + */ + streamConfigurations_.push_back({ res, + camera3Format.scalerFormat, + minFrameDuration }); } } @@ -691,7 +716,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() minFrameDurations.push_back(entry.androidScalerCode); minFrameDurations.push_back(entry.resolution.width); minFrameDurations.push_back(entry.resolution.height); - minFrameDurations.push_back(33333333); + minFrameDurations.push_back(entry.minFrameDuration); } staticMetadata_->addEntry(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, minFrameDurations.data(), diff --git a/src/android/camera_device.h b/src/android/camera_device.h index ed11410a5577..b689d67263b0 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -66,9 +66,10 @@ private: struct Camera3StreamConfiguration { libcamera::Size resolution; int androidScalerCode; + int64_t minFrameDuration; }; - int initializeStreamConfigurations(); + int initializeStreamConfigurations(const libcamera::ControlList &properties); std::tuple calculateStaticMetadataSize(); void notifyShutter(uint32_t frameNumber, uint64_t timestamp); void notifyError(uint32_t frameNumber, camera3_stream_t *stream);