{"id":25629,"url":"https://patchwork.libcamera.org/api/1.1/patches/25629/?format=json","web_url":"https://patchwork.libcamera.org/patch/25629/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260106093733.161460-1-naush@raspberrypi.com>","date":"2026-01-06T09:37:30","name":"[v3] v4l2: v4l2_camera_proxy: Fix for getting default FrameDurationLimits","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"cc0d04083333d95bf250bfa898527d6f95767c9f","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/1.1/people/34/?format=json","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/25629/mbox/","series":[{"id":5687,"url":"https://patchwork.libcamera.org/api/1.1/series/5687/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5687","date":"2026-01-06T09:37:30","name":"[v3] v4l2: v4l2_camera_proxy: Fix for getting default FrameDurationLimits","version":3,"mbox":"https://patchwork.libcamera.org/series/5687/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/25629/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/25629/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 5197BBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jan 2026 09:37:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 097E361FB9;\n\tTue,  6 Jan 2026 10:37:39 +0100 (CET)","from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com\n\t[IPv6:2a00:1450:4864:20::32d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A0FF4615B2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jan 2026 10:37:37 +0100 (CET)","by mail-wm1-x32d.google.com with SMTP id\n\t5b1f17b1804b1-47798089d30so724315e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 06 Jan 2026 01:37:37 -0800 (PST)","from naush-dell.pitowers.org\n\t([2a00:1098:3142:1f:fd0c:68a3:4cb5:ec32])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-432bd0e16f4sm3407899f8f.11.2026.01.06.01.37.35\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 06 Jan 2026 01:37:36 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"faED5HZI\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1767692257; x=1768297057;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:from:to:cc:subject:date:message-id:reply-to;\n\tbh=fS2yWk1y4TLClGY36yr3ereJK+cjH7d/ALIQwrBXlQw=;\n\tb=faED5HZIie1yMTZ6jVNj3LlTfNII4im0jM69Z8CK1ga4cums3Sh54j9xQcjucvKo0Z\n\t1LyU6sPJTfitzceTa5JrCahbqY/049rNiAsc5RWxX2fsIyd+Yffs76oX/0RysAjPvFll\n\tr0dvCHWxEeOiPNmWEPCa2seNYjXpBcWv7Mf9FppVVj9R76/f2G1l3a7KBMrO619cKVgJ\n\tGrINoWZRfIWYTUOl8RJlU0H37ub86qFzrYiZh/SdRxonywdevE7LrHT0aZ6pEcotrMXM\n\tc9pLzchOVwuBEBtRiuvm46fQwUktgUO0fwpk2eq66ER+EnoqRhZRV2iLd8gMtSKgEB9O\n\tcM3g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1767692257; x=1768297057;\n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=fS2yWk1y4TLClGY36yr3ereJK+cjH7d/ALIQwrBXlQw=;\n\tb=gs+6pf4bLEIRpnK2NTz93Y8IXNEoPLa9WVyYYAQfUvypYYc/36bR/J9j5KsMCtchY1\n\tG7AyYWmUW1JarzueiZ5/ZhDlzNQ1NQnwyDWgg3imblFSM2q31GhLKvVlUTK53JrYWUuz\n\tME2g98H2/LNa60YOlN0NU43hrSkjsFC8H98zZCmhnZiCSt09XqMGBYoXws82jwtOu2no\n\tVvD8Bn1m2AmSE2Ci5vAExiTY7HGygodfd9Gx0zFip+QUNSHkwRFDMspGe/aDTQFMjTwv\n\t31ubI6tjSk/EqkFGwycmQpn0VxelWwciQnARpjGQSs/n/K0yhPllYOloIvSbB0HQ2CCL\n\tzIGg==","X-Gm-Message-State":"AOJu0YzNetQjpk6EsiugKr4+eca6mhR8YK2/YJDG7jlx5B60Iuo6h+Fg\n\t2tgzbNYgiQewsuBfnGK9h1PsTR15OAzVPI/CVUGGMNs+HgNFmEnUIM+6Cs/pxMNBv4nuhVXnySz\n\tjJ5Xz","X-Gm-Gg":"AY/fxX5GwujQuS8/MqgeYo2aKd+XqXZbb0cWfBm5YuPkk8sWaZDbjkeKAG4V/XMruRJ\n\tXGJjiO+4uqZEAydSEa7ao6LQ0G58CtyKe4Emvqj4E9PgXST+rbRw8y6i/8Qtfjd3BIuA8Ns6fIo\n\tHbLIL/ts4ZpVxAzsMjhzsSILJZ4o5bkkoCApef1p0indPDOBe8dwUz6fKSkFhHlmGEb4MwbeXOk\n\tU/vwwf6N6uAeGWDdByC8b87ZG84QJxLsAaQYuxICBF/H3RhRZTQyd/hkTAiD3pKEIBpn57ttaqr\n\tabz82FqBEO2EOtqf8eo52J50UDaXSosNeAFMfpIDdPVNWQ2G61H4dYWMobQxP+XTWw3N+YBaxYB\n\tnKJSab+A/9tihZsmkKg7R/vEOCGQr9xBM7wn6GE03xEOZ8rOOJHAY2/adykJEGC1s3/EKcOwlaj\n\tEotPwCDHh0Z9Qo1v9A7M6g0w2dx6VYhUc=","X-Google-Smtp-Source":"AGHT+IEU4+f6+Mrvy0//kSCcPjexh86rJofWxDYkWBo4MPDvt4a5yIOSXXcd7nwClBPp972LGRrX/w==","X-Received":"by 2002:a05:6000:1842:b0:431:1d4:3a6b with SMTP id\n\tffacd0b85a97d-432bca43c7dmr1847823f8f.8.1767692256423; \n\tTue, 06 Jan 2026 01:37:36 -0800 (PST)","From":"Naushir Patuck <naush@raspberrypi.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Naushir Patuck <naush@raspberrypi.com>, =?utf-8?b?QmFybmFiw6FzIFDFkWN6?=\n\t=?utf-8?q?e?= <barnabas.pocze@ideasonboard.com>","Subject":"[PATCH v3] v4l2: v4l2_camera_proxy: Fix for getting default\n\tFrameDurationLimits","Date":"Tue,  6 Jan 2026 09:37:30 +0000","Message-ID":"<20260106093733.161460-1-naush@raspberrypi.com>","X-Mailer":"git-send-email 2.51.0","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"The default values for controls::FrameDurationLimits is now an array but\nthe v4l2 proxy is fetching it as a scalar value, causing a runtime\nerror. Fix this by templating the getter with the correct\nSpan<const int64_t, 2> type.\n\nThis fix also requires the RPi initial default value for FrameDurationLimits\nto be specified as a Span<const int64_t, 2>.\n\nAs a drive-by, remove the hard-coded 33ms min and 120ms max frame\nduration values in the initial defaults, and use the defaultMinFrameDuration\nand defaultMaxFrameDuration const values. This change is inconsequential\nto runtime operation as these always get overridden on the first camera\nconfigure call.\n\nFixes: 4e9be7d11b9df (\"ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting non-scalar controls\")\nCloses: https://github.com/raspberrypi/libcamera/issues/321\nSigned-off-by: Naushir Patuck <naush@raspberrypi.com>\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n---\n src/ipa/rpi/common/ipa_base.cpp | 6 ++++--\n src/v4l2/v4l2_camera_proxy.cpp  | 4 ++--\n 2 files changed, 6 insertions(+), 4 deletions(-)","diff":"diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\nindex 14aba4500ae4..322694985e72 100644\n--- a/src/ipa/rpi/common/ipa_base.cpp\n+++ b/src/ipa/rpi/common/ipa_base.cpp\n@@ -84,8 +84,10 @@ const ControlInfoMap::Map ipaControls{\n \t{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },\n \t{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n \t{ &controls::FrameDurationLimits,\n-\t  ControlInfo(INT64_C(33333), INT64_C(120000),\n-\t\t      static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>())) },\n+\t  ControlInfo(static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n+\t\t      static_cast<int64_t>(defaultMaxFrameDuration.get<std::micro>()),\n+\t\t      Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n+\t\t\t\t\t\tstatic_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } }) },\n \t{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },\n \t{ &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) },\n };\ndiff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\nindex 559ffc6170b1..03cd4810cc05 100644\n--- a/src/v4l2/v4l2_camera_proxy.cpp\n+++ b/src/v4l2/v4l2_camera_proxy.cpp\n@@ -200,9 +200,9 @@ void V4L2CameraProxy::setFmtFromConfig(const StreamConfiguration &streamConfig)\n \tconst auto &it = controls.find(&controls::FrameDurationLimits);\n \n \tif (it != controls.end()) {\n-\t\tconst int64_t duration = it->second.def().get<int64_t>();\n+\t\tSpan<const int64_t, 2> duration = it->second.def().get<Span<const int64_t, 2>>();\n \n-\t\tv4l2TimePerFrame_.numerator = duration;\n+\t\tv4l2TimePerFrame_.numerator = duration[0];\n \t\tv4l2TimePerFrame_.denominator = 1000000;\n \t} else {\n \t\t/*\n","prefixes":["v3"]}