From patchwork Fri Jan 29 11:16:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 11052 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 CEE39BD808 for ; Fri, 29 Jan 2021 11:16:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9AD31683AD; Fri, 29 Jan 2021 12:16:29 +0100 (CET) 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="t4xD5WZw"; dkim-atps=neutral Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C28FA683A2 for ; Fri, 29 Jan 2021 12:16:27 +0100 (CET) Received: by mail-wr1-x42d.google.com with SMTP id s7so5447320wru.5 for ; Fri, 29 Jan 2021 03:16:27 -0800 (PST) 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=lB1gEBJZ04IbOiJJDY++VCv0eADH9q7VDwMF3UMW9ZE=; b=t4xD5WZwzNgzr08U7mXeyzSFdEtEu0JWdOMyWkEH4cfCushPHvdnFBp8yUD+IgjQgD Xt6YNHjljrkQ09LUV6WAOkdGn5Dt4d1NqP3XgFZvItSWi4yFPAePW76K+CXE5qlJ3am2 WmePCBVrjjLsZn0Nj4ec06ng1rLcQGkuSjMmToMfeL21loOdnEHOPts0O0n5QWmmxXpg GkiypFM+DVtzEP6SCBE7MrfJT9yRyyL+EgaYdipnnG6MLBzf+2vDupwXwhRAtMd8z9lm /SPqwma5xLbzfhV/UpyLdYY1eHVgJlH/mbvs2sk/3wUzuUNW44/Z4xjs5mx7ezhvgK7N NRMw== 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=lB1gEBJZ04IbOiJJDY++VCv0eADH9q7VDwMF3UMW9ZE=; b=RTYPGZsHXPHto/dNnUOGhN/RDTjEh3BCb5FEVeTQKKVa2OWV54vci3dsuS6iGRo9A5 2e+vG9phTP7sM0Sb1fiFd2dYnL1DGaiqYEkxD4gXq5/6Smnh0+mZbKSNdQI4hHimG7VW f6CirUKUKPmsTmyxT3DKBIgVW6zAkB79/S1pza6nVCgZ7poJvJwBI3vi1KuUXwOXt4Rs 87iDGEDzXvTQepfg+DMhJKQPNlfITd7TA8U3Ws7PEPhHph9SDsmH4eYhpbTFwsLzqZSf ZZDp3jHRZsZtmxW6onQR+BgN+xc7rwDSQU4IQbk2N485vYROMJ0L+HxyLZ21I3jYxmCn Ey3Q== X-Gm-Message-State: AOAM530IwMlJalkiDeXZpmP40cf2tHjAfRUY8qNuEe+dBqqoy2cqi9ta zVlKHyP7ojxfUeVoyuF0sKwR9uFI0max3SX6 X-Google-Smtp-Source: ABdhPJw1O1IrHI7ijkdUgWmbG6b8b+0a8G/SaMfEVAzZSNEULQz+KKBFz49AhqiASlkxCixfsLqEVA== X-Received: by 2002:adf:ee43:: with SMTP id w3mr4201606wro.200.1611918987251; Fri, 29 Jan 2021 03:16:27 -0800 (PST) Received: from naushir-VirtualBox.patuck.local ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id f14sm11324007wre.69.2021.01.29.03.16.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Jan 2021 03:16:26 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Fri, 29 Jan 2021 11:16:13 +0000 Message-Id: <20210129111616.1047483-3-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210129111616.1047483-1-naush@raspberrypi.com> References: <20210129111616.1047483-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v4 2/5] libcamera: camera_sensor: Add frame length limits to CameraSensorInfo 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" Sensor frame length is made up of active and inactive (blanking) lines. The minimum and maximum frame length values may be used by pipeline handlers to limit frame durations based on the sensor mode capabilities. Store the minimum and maximum allowable frame length values (in lines) in the CameraSensorInfo structure. These values are computed in CameraSensor::sensorInfo() by querying the sensor subdevice V4L2_CID_VBLANK control limits. This in turn means that V4L2_CID_VBLANK is now a mandatory subdevice control. Signed-off-by: Naushir Patuck Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- include/libcamera/internal/camera_sensor.h | 3 ++ src/libcamera/camera_sensor.cpp | 43 ++++++++++++++++++++-- test/ipa/ipa_wrappers_test.cpp | 2 + 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index fed36bf26e47..5d8c9b1a3121 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -33,6 +33,9 @@ struct CameraSensorInfo { uint64_t pixelRate; uint32_t lineLength; + + uint32_t minFrameLength; + uint32_t maxFrameLength; }; class CameraSensor : protected Loggable diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index ab315bdc468c..f60d0cc9c6fa 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -113,6 +113,36 @@ LOG_DEFINE_CATEGORY(CameraSensor) * The total line length in pixel clock periods, including blanking. */ +/** + * \var CameraSensorInfo::minFrameLength + * \brief The minimum allowable frame length in units of lines + * + * The sensor frame length comprises of active output lines and blanking lines + * in a frame. The minimum frame length value dictates the minimum allowable + * frame duration of the sensor mode. + * + * To obtain the minimum frame duration: + * + * \verbatim + frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second) + \endverbatim + */ + +/** + * \var CameraSensorInfo::maxFrameLength + * \brief The maximum allowable frame length in units of lines + * + * The sensor frame length comprises of active output lines and blanking lines + * in a frame. The maximum frame length value dictates the maximum allowable + * frame duration of the sensor mode. + * + * To obtain the maximum frame duration: + * + * \verbatim + frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second) + \endverbatim + */ + /** * \class CameraSensor * \brief A camera sensor based on V4L2 subdevices @@ -699,12 +729,13 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const info->outputSize = format.size; /* - * Retrieve the pixel rate and the line length through V4L2 controls. - * Support for the V4L2_CID_PIXEL_RATE and V4L2_CID_HBLANK controls is - * mandatory. + * Retrieve the pixel rate, line length and minimum/maximum frame + * duration through V4L2 controls. Support for the V4L2_CID_PIXEL_RATE, + * V4L2_CID_HBLANK and V4L2_CID_VBLANK controls is mandatory. */ ControlList ctrls = subdev_->getControls({ V4L2_CID_PIXEL_RATE, - V4L2_CID_HBLANK }); + V4L2_CID_HBLANK, + V4L2_CID_VBLANK }); if (ctrls.empty()) { LOG(CameraSensor, Error) << "Failed to retrieve camera info controls"; @@ -715,6 +746,10 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const info->lineLength = info->outputSize.width + hblank; info->pixelRate = ctrls.get(V4L2_CID_PIXEL_RATE).get(); + const ControlInfo vblank = ctrls.infoMap()->at(V4L2_CID_VBLANK); + info->minFrameLength = info->outputSize.height + vblank.min().get(); + info->maxFrameLength = info->outputSize.height + vblank.max().get(); + return 0; } diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp index 47533d105d03..eb6d783e8489 100644 --- a/test/ipa/ipa_wrappers_test.cpp +++ b/test/ipa/ipa_wrappers_test.cpp @@ -313,6 +313,8 @@ protected: .outputSize = { 2560, 1940 }, .pixelRate = 96000000, .lineLength = 2918, + .minFrameLength = 1940, + .maxFrameLength = 2880 }; std::map config{ { 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },