[{"id":37494,"web_url":"https://patchwork.libcamera.org/comment/37494/","msgid":"<176769570662.3882822.16561057757094193474@neptunite.rasen.tech>","date":"2026-01-06T10:35:06","subject":"Re: [PATCH v3] v4l2: v4l2_camera_proxy: Fix for getting default\n\tFrameDurationLimits","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Naushir Patuck (2026-01-06 18:37:30)\n> The default values for controls::FrameDurationLimits is now an array but\n> the v4l2 proxy is fetching it as a scalar value, causing a runtime\n> error. Fix this by templating the getter with the correct\n> Span<const int64_t, 2> type.\n> \n> This fix also requires the RPi initial default value for FrameDurationLimits\n> to be specified as a Span<const int64_t, 2>.\n> \n> As a drive-by, remove the hard-coded 33ms min and 120ms max frame\n> duration values in the initial defaults, and use the defaultMinFrameDuration\n> and defaultMaxFrameDuration const values. This change is inconsequential\n> to runtime operation as these always get overridden on the first camera\n> configure call.\n> \n> Fixes: 4e9be7d11b9df (\"ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting non-scalar controls\")\n> Closes: https://github.com/raspberrypi/libcamera/issues/321\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-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\nI too would've split this in two but I've seen your rationale in v2 so ok.\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n>  2 files changed, 6 insertions(+), 4 deletions(-)\n> \n> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\n> index 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>         { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },\n>         { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n>         { &controls::FrameDurationLimits,\n> -         ControlInfo(INT64_C(33333), INT64_C(120000),\n> -                     static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>())) },\n> +         ControlInfo(static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +                     static_cast<int64_t>(defaultMaxFrameDuration.get<std::micro>()),\n> +                     Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +                                               static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } }) },\n>         { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },\n>         { &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) },\n>  };\n> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\n> index 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>         const auto &it = controls.find(&controls::FrameDurationLimits);\n>  \n>         if (it != controls.end()) {\n> -               const int64_t duration = it->second.def().get<int64_t>();\n> +               Span<const int64_t, 2> duration = it->second.def().get<Span<const int64_t, 2>>();\n>  \n> -               v4l2TimePerFrame_.numerator = duration;\n> +               v4l2TimePerFrame_.numerator = duration[0];\n>                 v4l2TimePerFrame_.denominator = 1000000;\n>         } else {\n>                 /*\n> -- \n> 2.51.0\n>","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 9016FBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jan 2026 10:35:18 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CD8D361F9F;\n\tTue,  6 Jan 2026 11:35:17 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 672CB615B2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jan 2026 11:35:15 +0100 (CET)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:2700:4fa5:c459:a9a7])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 0372B591;\n\tTue,  6 Jan 2026 11:34:53 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NkoTqh8L\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1767695694;\n\tbh=kaT0GqV8VYR62BgAT66apZsvug0LbNICg4cJlP7lXDQ=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=NkoTqh8LDaiKV2e+eRqhJN7wKnZuYE2TGVuMTjTwZETIBLJ4QZ9WzeXq1WB6/SWOy\n\tkchpeDagxejYlnqRyjwqwrZu8WDe/udo/hg+9l6sY0W4dDsAlHdAcTh4X9MPxhzAKT\n\tmx2qb127Ac+3oXWEYpz2BIC9BumF69nDXKHRBj5I=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260106093733.161460-1-naush@raspberrypi.com>","References":"<20260106093733.161460-1-naush@raspberrypi.com>","Subject":"Re: [PATCH v3] v4l2: v4l2_camera_proxy: Fix for getting default\n\tFrameDurationLimits","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Naushir Patuck <naush@raspberrypi.com>, =?utf-8?b?QmFybmFiw6FzIFDFkWN6?=\n\t=?utf-8?q?e?= <barnabas.pocze@ideasonboard.com>","To":"Naushir Patuck <naush@raspberrypi.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 06 Jan 2026 19:35:06 +0900","Message-ID":"<176769570662.3882822.16561057757094193474@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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>"}},{"id":37495,"web_url":"https://patchwork.libcamera.org/comment/37495/","msgid":"<CAHW6GYKVhKG1G0PwWXQOgFHKJSEPwJX5GFhoXY3ex6DF7L1xuQ@mail.gmail.com>","date":"2026-01-06T10:35:23","subject":"Re: [PATCH v3] v4l2: v4l2_camera_proxy: Fix for getting default\n\tFrameDurationLimits","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Naush\n\nThanks for the patch!\n\nOn Tue, 6 Jan 2026 at 09:37, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> The default values for controls::FrameDurationLimits is now an array but\n> the v4l2 proxy is fetching it as a scalar value, causing a runtime\n> error. Fix this by templating the getter with the correct\n> Span<const int64_t, 2> type.\n>\n> This fix also requires the RPi initial default value for FrameDurationLimits\n> to be specified as a Span<const int64_t, 2>.\n>\n> As a drive-by, remove the hard-coded 33ms min and 120ms max frame\n> duration values in the initial defaults, and use the defaultMinFrameDuration\n> and defaultMaxFrameDuration const values. This change is inconsequential\n> to runtime operation as these always get overridden on the first camera\n> configure call.\n>\n> Fixes: 4e9be7d11b9df (\"ipa: ipu3, mali-c55, rkisp1, rpi: Fix reporting non-scalar controls\")\n> Closes: https://github.com/raspberrypi/libcamera/issues/321\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nReviewed-by: David Plowman <david.plowman@raspberrypi.com>\n\nThanks\nDavid\n\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(-)\n>\n> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\n> index 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>         { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },\n>         { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },\n>         { &controls::FrameDurationLimits,\n> -         ControlInfo(INT64_C(33333), INT64_C(120000),\n> -                     static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>())) },\n> +         ControlInfo(static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +                     static_cast<int64_t>(defaultMaxFrameDuration.get<std::micro>()),\n> +                     Span<const int64_t, 2>{ { static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()),\n> +                                               static_cast<int64_t>(defaultMinFrameDuration.get<std::micro>()) } }) },\n>         { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },\n>         { &controls::rpi::StatsOutputEnable, ControlInfo(false, true, false) },\n>  };\n> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\n> index 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>         const auto &it = controls.find(&controls::FrameDurationLimits);\n>\n>         if (it != controls.end()) {\n> -               const int64_t duration = it->second.def().get<int64_t>();\n> +               Span<const int64_t, 2> duration = it->second.def().get<Span<const int64_t, 2>>();\n>\n> -               v4l2TimePerFrame_.numerator = duration;\n> +               v4l2TimePerFrame_.numerator = duration[0];\n>                 v4l2TimePerFrame_.denominator = 1000000;\n>         } else {\n>                 /*\n> --\n> 2.51.0\n>","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 AAFA6BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jan 2026 10:35:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6BA68615B2;\n\tTue,  6 Jan 2026 11:35:37 +0100 (CET)","from mail-qv1-xf36.google.com (mail-qv1-xf36.google.com\n\t[IPv6:2607:f8b0:4864:20::f36])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AB890615B2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jan 2026 11:35:35 +0100 (CET)","by mail-qv1-xf36.google.com with SMTP id\n\t6a1803df08f44-8907fb0188fso835406d6.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 06 Jan 2026 02:35:35 -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=\"U8X8j1U9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1767695734; x=1768300534;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=Igd54yoz8bpvZUNJoGYirjeWXYS3blL2HSa5EDTok3I=;\n\tb=U8X8j1U99Ut6QqfE60U37JjppZM5Db+zWbPGkgBQwzkqBhmSe4Gk8cltu9mLqdPVR8\n\tUKZlyXd/WCGvi6OMd2iQsbGQC5GQnMki8uz+ofOPcsrY1XdQYcHdMraruirbGkuyFSec\n\tv5oKSGgaTV5sCf3r/Y99D6kuOLrFVAQU8DiCgZIYeMmxQqd6ju4AAc/N+KKxUnvrkR33\n\tNhmGh+TqMfAfXzohM5h63lbHHwExAQmGKLMTxpdRrzhqODq3HNu3iFNmwI6fT7YJq1yW\n\tun52j1VXpPBt3E/Q5CpWUijMixGdHELp0EPbEYx5m7FRkk1Bdc87Y6y2wgFkBmCQ1wXr\n\t//Cg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1767695734; x=1768300534;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=Igd54yoz8bpvZUNJoGYirjeWXYS3blL2HSa5EDTok3I=;\n\tb=DuxpkuMCzeCpklUmJhePwtQMxSiQZUMOsIoh5HpmJqAdKxPpT3564YNUkCPu0qnpcX\n\tOJFlWDPIZimB1QjsW2mMs0mcKerypsZQ/LhTkpi8h7l0LHYCFJYqts1pZ07C52l7O3A1\n\taaa/k0Z0gzLNsM0OlySn9lO+Vn/HSXtYAy13tWb+oMBrVmeq9kmyIjPWYPiRecQoEtnk\n\to0wa3O/yZNZNV/+iZszamjrcvyi/zX55PFxJpbsxF8fRVZSu0aCvRKvSWwSw/A/Psr6+\n\tulyYKk6rEb3w6F5lWFljNxGzF02Rf3v6qcrGd3RbpaYdRcPJANIglpfNAt2xMv9AUfY2\n\tzjQg==","X-Gm-Message-State":"AOJu0YwNKrUEDusUHTo1Cc/fZ7VZUIUbbEqa/RoNKUmUeeOMZpcLpQ21\n\tJiPqftkkJidVkdqLYk1J1UJYTm6PdNO4kC3dtyIxnSuVy0DvE8yGRennUa2W2/Gl6yvPxqeCocf\n\tEYxgbfxPfvuL3LD7lZolZD5RB69zIbsJd5szzFKJ+Xg==","X-Gm-Gg":"AY/fxX5KGTNspBbBHg47ZR9JsnFKCuHGtj39PZGTv//2mXETZMoKeiG5K2J765dzIW2\n\tRPK2VkyRgN2jE8IiFmJ/gN9V68HUsZYHR59yKMDl8dR6aj0WQWjv/+tikq5pXcPuZ52d7nvnWw0\n\t3w7saxtT6bXJ4MK/E0Bn0roeWe1DPaTwd63BQtw1yBVBsdh3MhnlWS0MFVQl59vI55kRglgOaf5\n\t2B6nTQeRq/pnNutpBC6pbFdqHJOAKhhC+RRqFH7LyAeYE5c+rE1sJ0GQUrTJLBevT9HaqG4Jhw4\n\t2bxMefUVkrDtJ+g6PUBWXjAIB47pxfEZ+3B6Fglnkb63LqLzb895hHE9Jg3g/Vh6hijdqxmCX7q\n\tS2KCbiW9a8CLm","X-Google-Smtp-Source":"AGHT+IHHQPZcll6hN2308t3V6T17UtcK4bEB7joVvzwGFQnn7uYwLUQFxxULFcAR6QF4jhfmw7BjqYuehbo78KHSgeU=","X-Received":"by 2002:a05:6214:418f:b0:880:5a05:925f with SMTP id\n\t6a1803df08f44-89075e18a53mr34803966d6.13.1767695734430;\n\tTue, 06 Jan 2026 02:35:34 -0800 (PST)","MIME-Version":"1.0","References":"<20260106093733.161460-1-naush@raspberrypi.com>","In-Reply-To":"<20260106093733.161460-1-naush@raspberrypi.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Tue, 6 Jan 2026 10:35:23 +0000","X-Gm-Features":"AQt7F2rRisWSIOSUIauiZ_j8ZGJ5fj7QxBkMVKl4V4x9uK8v4X40D-_O-BQKKvQ","Message-ID":"<CAHW6GYKVhKG1G0PwWXQOgFHKJSEPwJX5GFhoXY3ex6DF7L1xuQ@mail.gmail.com>","Subject":"Re: [PATCH v3] v4l2: v4l2_camera_proxy: Fix for getting default\n\tFrameDurationLimits","To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org, =?utf-8?b?QmFybmFiw6FzIFDFkWN6?=\n\t=?utf-8?q?e?= <barnabas.pocze@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","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>"}}]