[{"id":38456,"web_url":"https://patchwork.libcamera.org/comment/38456/","msgid":"<6af505f4cdf9628dd62d09f60d0173c810727122.camel@collabora.com>","date":"2026-03-30T15:40:45","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Hi,\n\nLe lundi 30 mars 2026 à 11:14 +0100, David Plowman a écrit :\n> +\t\t\t/* Optional skipping (defaults to 1 for all increments). */\n> +\t\t\tgint xOddInc, xEvenInc, yOddInc, yEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-odd-inc\", &xOddInc) && xOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xOddInc = xOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-even-inc\", &xEvenInc) && xEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xEvenInc = xEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-odd-inc\", &yOddInc) && yOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yOddInc = yOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-even-inc\", &yEvenInc) && yEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yEvenInc = yEvenInc;\n> +\n\nJust wanted to let other reviewers know that I'm not very familiar this specific\nfeature. So I accepted that naming in the sense that \"it matches mostly\" the\nlibcamera API. But as a users, x-odd-inc and so on is not specially intuitive.\nWould be nice with someone that knows this un-implemented design better can\nreview the names here.\n\nNicolas","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 27E0CBDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Mar 2026 15:40:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3B74B62CC7;\n\tMon, 30 Mar 2026 17:40:50 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[IPv6:2a01:4f8:201:9162::2])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 06F3562CC7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Mar 2026 17:40:48 +0200 (CEST)","from [IPv6:2606:6d00:15:e06b::c41] (unknown\n\t[IPv6:2606:6d00:15:e06b::c41])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\t(Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id 1F13E17E483A;\n\tMon, 30 Mar 2026 17:40:48 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=collabora.com header.i=@collabora.com\n\theader.b=\"FJIUfCos\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1774885248;\n\tbh=KPOHO4xAGi4SNQpHWuYy1wn25Vji3ZNt+9/QQNunaQY=;\n\th=Subject:From:To:Date:In-Reply-To:References:From;\n\tb=FJIUfCosRB3TtsWsTRGPa/TZRv/AAZeSDQcW/9d6i8PQyngizLh/KKO+HxQuRcXN8\n\tw17XuNRUyESiSqtVasfJr62apHDRQL8hvfVt1KXOz8ovrcHsbqF94VFNGfwhdsmCzo\n\tdDbndx0uT9Wq7FIWzW+GguTYBqWfkmt/9cnGRcltboVTfRXJGayVxZhJq2zWL6FC01\n\tE8WAnYnfcPWIpUyULd6QAL8RkU2SUEpJAhBE4dpxPYRW24/ILz4gFL2/SmqySm4Uh9\n\tfkUKWcyvWc/GEb+Zba0nwRUWmV5vZcIjuz6UozE8YzKbaCMb4qVAXLWbkUZHo5sAjG\n\twR3rws2Bv+L7A==","Message-ID":"<6af505f4cdf9628dd62d09f60d0173c810727122.camel@collabora.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"David Plowman <david.plowman@raspberrypi.com>, \n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 30 Mar 2026 11:40:45 -0400","In-Reply-To":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","Autocrypt":"addr=nicolas.dufresne@collabora.com; prefer-encrypt=mutual;\n\tkeydata=mDMEaCN2ixYJKwYBBAHaRw8BAQdAM0EHepTful3JOIzcPv6ekHOenE1u0vDG1gdHFrChD\n\t/e0J05pY29sYXMgRHVmcmVzbmUgPG5pY29sYXNAbmR1ZnJlc25lLmNhPoicBBMWCgBEAhsDBQsJCA\n\tcCAiICBhUKCQgLAgQWAgMBAh4HAheABQkJZfd1FiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrjo\n\tCGQEACgkQ2UGUUSlgcvQlQwD/RjpU1SZYcKG6pnfnQ8ivgtTkGDRUJ8gP3fK7+XUjRNIA/iXfhXMN\n\tabIWxO2oCXKf3TdD7aQ4070KO6zSxIcxgNQFtDFOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1Z\n\tnJlc25lQGNvbGxhYm9yYS5jb20+iJkEExYKAEECGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4\n\tAWIQTvDVKBFcTDwhoEbxLZQZRRKWBy9AUCaCyyxgUJCWX3dQAKCRDZQZRRKWBy9ARJAP96pFmLffZ\n\tsmBUpkyVBfFAf+zq6BJt769R0al3kHvUKdgD9G7KAHuioxD2v6SX7idpIazjzx8b8rfzwTWyOQWHC\n\tAAS0LU5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAZ21haWwuY29tPoiZBBMWCgBBF\n\tiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrGYCGwMFCQll93UFCwkIBwICIgIGFQoJCAsCBBYCAw\n\tECHgcCF4AACgkQ2UGUUSlgcvRObgD/YnQjfi4+L8f4fI7p1pPMTwRTcaRdy6aqkKEmKsCArzQBAK8\n\tbRLv9QjuqsE6oQZra/RB4widZPvphs78H0P6NmpIJ","Organization":"Collabora Canada","Content-Type":"multipart/signed; micalg=\"pgp-sha512\";\n\tprotocol=\"application/pgp-signature\";\n\tboundary=\"=-FXdLrczCwJXn5R4hNMpg\"","User-Agent":"Evolution 3.58.3 (3.58.3-1.fc43) ","MIME-Version":"1.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":38457,"web_url":"https://patchwork.libcamera.org/comment/38457/","msgid":"<9bfe9c474b116dbda5674311af09d4eef45fd0ba.camel@collabora.com>","date":"2026-03-30T15:41:08","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Le lundi 30 mars 2026 à 11:14 +0100, David Plowman a écrit :\n> The sensor-config property may optionally be specified to give the\n> outputSize and bitDepth of the SensorConfiguration that is applied to\n> the camera configuration. For example, use\n> \n> libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> \n> to request the 10-bit 2304x1296 mode of a sensor.\n> \n> All three parameters, width, height and bit depth, must be present, or\n> it will issue a warning and revert to automatic mode selection (as if\n> there were no sensor-config at all).\n> \n> If a mode is requested that doesn't exist then camera configuration\n> will fail and the pipeline won't start.\n> \n> As future-proofing, the SensorConfiguration's binning, increment and\n> analog-crop parameters may be specified, though libcamera currently\n> ignores them.\n> \n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> Closes: https://gitlab.freedesktop.org/camera/libcamera/-/issues/300\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 73 +++++++++++++++++++++++++++++++\n>  1 file changed, 73 insertions(+)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index a7241e9b..5d3ee3a2 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -141,6 +141,7 @@ struct _GstLibcameraSrc {\n>  \tGstTask *task;\n>  \n>  \tgchar *camera_name;\n> +\tGstStructure *sensor_config;\n>  \n>  \tstd::atomic<GstEvent *> pending_eos;\n>  \n> @@ -152,6 +153,7 @@ struct _GstLibcameraSrc {\n>  enum {\n>  \tPROP_0,\n>  \tPROP_CAMERA_NAME,\n> +\tPROP_SENSOR_CONFIG,\n>  \tPROP_LAST\n>  };\n>  \n> @@ -846,6 +848,55 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n>  \t}\n>  \tg_assert(state->config_->size() == state->srcpads_.size());\n>  \n> +\t/* Apply optional sensor configuration. */\n> +\tif (self->sensor_config) {\n> +\t\tgint w = 0, h = 0, depth = 0;\n> +\t\tif (!gst_structure_get_int(self->sensor_config, \"width\", &w) ||\n> +\t\t    !gst_structure_get_int(self->sensor_config, \"height\", &h) ||\n> +\t\t    !gst_structure_get_int(self->sensor_config, \"depth\", &depth) ||\n> +\t\t    w <= 0 || h <= 0 || depth <= 0) {\n> +\t\t\tGST_ELEMENT_WARNING(self, RESOURCE, SETTINGS,\n> +\t\t\t\t\t    (\"sensor-config requires non-zero width, height and depth\"\n> +\t\t\t\t\t     \" fields, ignoring\"),\n> +\t\t\t\t\t    (nullptr));\n> +\t\t} else {\n> +\t\t\tSensorConfiguration sensorCfg;\n> +\t\t\tsensorCfg.outputSize = Size(w, h);\n> +\t\t\tsensorCfg.bitDepth = depth;\n> +\n> +\t\t\t/* Optional binning (defaults to 1x1). */\n> +\t\t\tgint binX, binY;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"bin-x\", &binX) && binX > 0)\n> +\t\t\t\tsensorCfg.binning.binX = binX;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"bin-y\", &binY) && binY > 0)\n> +\t\t\t\tsensorCfg.binning.binY = binY;\n> +\n> +\t\t\t/* Optional skipping (defaults to 1 for all increments). */\n> +\t\t\tgint xOddInc, xEvenInc, yOddInc, yEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-odd-inc\", &xOddInc) && xOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xOddInc = xOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-even-inc\", &xEvenInc) && xEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xEvenInc = xEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-odd-inc\", &yOddInc) && yOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yOddInc = yOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-even-inc\", &yEvenInc) && yEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yEvenInc = yEvenInc;\n> +\n> +\t\t\t/* Optional analog crop (defaults to \"unset\"). */\n> +\t\t\tgint cropX, cropY, cropW, cropH;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"analog-crop-x\", &cropX) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-y\", &cropY) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-width\", &cropW) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-height\", &cropH) &&\n> +\t\t\t    cropX >= 0 && cropY >= 0 && cropW > 0 && cropH > 0)\n> +\t\t\t\tsensorCfg.analogCrop = Rectangle(cropX, cropY,\n> +\t\t\t\t\t\t\t\t static_cast<unsigned int>(cropW),\n> +\t\t\t\t\t\t\t\t static_cast<unsigned int>(cropH));\n\nAck.\n\n> +\n> +\t\t\tstate->config_->sensorConfig = sensorCfg;\n> +\t\t}\n> +\t}\n> +\n>  \tif (!gst_libcamera_src_negotiate(self)) {\n>  \t\tstate->initControls_.clear();\n>  \t\tGST_ELEMENT_FLOW_ERROR(self, GST_FLOW_NOT_NEGOTIATED);\n> @@ -934,6 +985,10 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id,\n>  \t\tg_free(self->camera_name);\n>  \t\tself->camera_name = g_value_dup_string(value);\n>  \t\tbreak;\n> +\tcase PROP_SENSOR_CONFIG:\n> +\t\tg_clear_pointer(&self->sensor_config, gst_structure_free);\n> +\t\tself->sensor_config = (GstStructure *)g_value_dup_boxed(value);\n> +\t\tbreak;\n>  \tdefault:\n>  \t\tif (!state->controls_.setProperty(prop_id - PROP_LAST, value, pspec))\n>  \t\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> @@ -953,6 +1008,9 @@ gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value,\n>  \tcase PROP_CAMERA_NAME:\n>  \t\tg_value_set_string(value, self->camera_name);\n>  \t\tbreak;\n> +\tcase PROP_SENSOR_CONFIG:\n> +\t\tg_value_set_boxed(value, self->sensor_config);\n> +\t\tbreak;\n>  \tdefault:\n>  \t\tif (!state->controls_.getProperty(prop_id - PROP_LAST, value, pspec))\n>  \t\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> @@ -1040,6 +1098,7 @@ gst_libcamera_src_finalize(GObject *object)\n>  \tg_clear_object(&self->task);\n>  \tg_mutex_clear(&self->state->lock_);\n>  \tg_free(self->camera_name);\n> +\tg_clear_pointer(&self->sensor_config, gst_structure_free);\n>  \tdelete self->state;\n>  \n>  \treturn klass->finalize(object);\n> @@ -1162,6 +1221,20 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)\n>  \t\t\t\t\t\t\t     | G_PARAM_STATIC_STRINGS));\n>  \tg_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);\n>  \n> +\tspec = g_param_spec_boxed(\"sensor-config\", \"Sensor Config\",\n> +\t\t\t\t  \"Desired sensor configuration as a GstStructure with mandatory \"\n> +\t\t\t\t  \"fields width, height and depth, and optional fields bin-x, bin-y, \"\n> +\t\t\t\t  \"x-odd-inc, x-even-inc, y-odd-inc, y-even-inc, \"\n> +\t\t\t\t  \"analog-crop-x, analog-crop-y, analog-crop-width, analog-crop-height \"\n> +\t\t\t\t  \"(e.g. \\\"sensor/config,width=2304,height=1296,depth=10\\\"). \"\n> +\t\t\t\t  \"Leave unset to let the pipeline negotiate the sensor mode automatically.\",\n> +\t\t\t\t  GST_TYPE_STRUCTURE,\n> +\t\t\t\t  (GParamFlags)(GST_PARAM_MUTABLE_READY\n> +\t\t\t\t\t\t| G_PARAM_CONSTRUCT\n> +\t\t\t\t\t\t| G_PARAM_READWRITE\n> +\t\t\t\t\t\t| G_PARAM_STATIC_STRINGS));\n> +\tg_object_class_install_property(object_class, PROP_SENSOR_CONFIG, spec);\n> +\n>  \tGstCameraControls::installProperties(object_class, PROP_LAST);\n>  }\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 254A1BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Mar 2026 15:41:12 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C86B362D05;\n\tMon, 30 Mar 2026 17:41:11 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 706C462CC7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Mar 2026 17:41:10 +0200 (CEST)","from [IPv6:2606:6d00:15:e06b::c41] (unknown\n\t[IPv6:2606:6d00:15:e06b::c41])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits))\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id 878A217E483F;\n\tMon, 30 Mar 2026 17:41:09 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=collabora.com header.i=@collabora.com\n\theader.b=\"HET+BzoI\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1774885270;\n\tbh=Fy0m2y91CaN63CP2zOxDOHZbUe43+rG7XF6CqaugEwE=;\n\th=Subject:From:To:Date:In-Reply-To:References:From;\n\tb=HET+BzoIFABsBo+pPf29bYzdzVBUdgaK7Fk0GcHEMNNC/r3JtRxrHyIJoFQzYortK\n\tKv1SajMCOzKdFE2mrCSkvmYab5ac8D4bBze+b1XDc3J+ry/ajTpMYjNHt7yBw0jEi0\n\tyWeN8+UmuDLs+/XbPvvFsiZfe8mjTd+JPKmSeZtVlpViGFgqJfhLvSGJ/HlQtpH2i9\n\tmwwhIOr7iHxRJ+xUhigodH+FiBEJf/Hs5ichu2aszAqBrF+0RQnGZPFoPDwMUhGT2j\n\tzfOQIBgxaPnTCzwmcdmnqtYrC3CLUmzki6QCcr40O8Nt/CR22kGaD2PqC7Xytikgyj\n\tcZgHjGP2qrBog==","Message-ID":"<9bfe9c474b116dbda5674311af09d4eef45fd0ba.camel@collabora.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"David Plowman <david.plowman@raspberrypi.com>, \n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 30 Mar 2026 11:41:08 -0400","In-Reply-To":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","Autocrypt":"addr=nicolas.dufresne@collabora.com; prefer-encrypt=mutual;\n\tkeydata=mDMEaCN2ixYJKwYBBAHaRw8BAQdAM0EHepTful3JOIzcPv6ekHOenE1u0vDG1gdHFrChD\n\t/e0J05pY29sYXMgRHVmcmVzbmUgPG5pY29sYXNAbmR1ZnJlc25lLmNhPoicBBMWCgBEAhsDBQsJCA\n\tcCAiICBhUKCQgLAgQWAgMBAh4HAheABQkJZfd1FiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrjo\n\tCGQEACgkQ2UGUUSlgcvQlQwD/RjpU1SZYcKG6pnfnQ8ivgtTkGDRUJ8gP3fK7+XUjRNIA/iXfhXMN\n\tabIWxO2oCXKf3TdD7aQ4070KO6zSxIcxgNQFtDFOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1Z\n\tnJlc25lQGNvbGxhYm9yYS5jb20+iJkEExYKAEECGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4\n\tAWIQTvDVKBFcTDwhoEbxLZQZRRKWBy9AUCaCyyxgUJCWX3dQAKCRDZQZRRKWBy9ARJAP96pFmLffZ\n\tsmBUpkyVBfFAf+zq6BJt769R0al3kHvUKdgD9G7KAHuioxD2v6SX7idpIazjzx8b8rfzwTWyOQWHC\n\tAAS0LU5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAZ21haWwuY29tPoiZBBMWCgBBF\n\tiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrGYCGwMFCQll93UFCwkIBwICIgIGFQoJCAsCBBYCAw\n\tECHgcCF4AACgkQ2UGUUSlgcvRObgD/YnQjfi4+L8f4fI7p1pPMTwRTcaRdy6aqkKEmKsCArzQBAK8\n\tbRLv9QjuqsE6oQZra/RB4widZPvphs78H0P6NmpIJ","Organization":"Collabora Canada","Content-Type":"multipart/signed; micalg=\"pgp-sha512\";\n\tprotocol=\"application/pgp-signature\";\n\tboundary=\"=-vvtvJ74S8+jq+d8TjS5W\"","User-Agent":"Evolution 3.58.3 (3.58.3-1.fc43) ","MIME-Version":"1.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":38468,"web_url":"https://patchwork.libcamera.org/comment/38468/","msgid":"<acvszJJ8JEWckYfl@zed>","date":"2026-03-31T15:54:27","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Nicolas,\n\nOn Mon, Mar 30, 2026 at 11:40:45AM -0400, Nicolas Dufresne wrote:\n> Hi,\n>\n> Le lundi 30 mars 2026 à 11:14 +0100, David Plowman a écrit :\n> > +\t\t\t/* Optional skipping (defaults to 1 for all increments). */\n> > +\t\t\tgint xOddInc, xEvenInc, yOddInc, yEvenInc;\n> > +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-odd-inc\", &xOddInc) && xOddInc > 0)\n> > +\t\t\t\tsensorCfg.skipping.xOddInc = xOddInc;\n> > +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-even-inc\", &xEvenInc) && xEvenInc > 0)\n> > +\t\t\t\tsensorCfg.skipping.xEvenInc = xEvenInc;\n> > +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-odd-inc\", &yOddInc) && yOddInc > 0)\n> > +\t\t\t\tsensorCfg.skipping.yOddInc = yOddInc;\n> > +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-even-inc\", &yEvenInc) && yEvenInc > 0)\n> > +\t\t\t\tsensorCfg.skipping.yEvenInc = yEvenInc;\n> > +\n>\n> Just wanted to let other reviewers know that I'm not very familiar this specific\n> feature. So I accepted that naming in the sense that \"it matches mostly\" the\n> libcamera API. But as a users, x-odd-inc and so on is not specially intuitive.\n> Would be nice with someone that knows this un-implemented design better can\n> review the names here.\n\nUnfortunately the concept itself (\"pixel increment counter for odd rows\")\nis not easy to summarize with a nice name, if that's what concerns\nyou.\n\nAnyone who's playing with sensor configurations and tries to configure\nthe skipping/binning modes should find those terms ... familiar (?) as\nthey're also used by the MIPI CCS specs as well (see 8.2.3\n\"Sub-Sampled Readout\")\n\nOf course, if there are better proposals I welcome them.\n\n\n\n>\n> Nicolas","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 6FBECBDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 31 Mar 2026 15:54:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B276C6274D;\n\tTue, 31 Mar 2026 17:54:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BDFB86274D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 Mar 2026 17:54:30 +0200 (CEST)","from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2DA08244D;\n\tTue, 31 Mar 2026 17:53:08 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"WsP0szjZ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1774972388;\n\tbh=tQyHFFhqx9id8Cv23eg0vCHeodUyAjFFJBPD9/rTSZ0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=WsP0szjZ7f8CVnacZJSyjHyvwu9PwyglTJRVfssYkBTkReE5LcXSrd4ZUpV0e0vGH\n\t6AqFYml+ZlmYwFDSeC2amY4WyEtB9HFWO1LM6j9CjJEN3GcExTEYxGrEarl9mDTr4j\n\tRKU9fFb8KiB1qw5L/PHHfWs2eFqoPTztfKRplSTc=","Date":"Tue, 31 Mar 2026 17:54:27 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"David Plowman <david.plowman@raspberrypi.com>, \n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","Message-ID":"<acvszJJ8JEWckYfl@zed>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<6af505f4cdf9628dd62d09f60d0173c810727122.camel@collabora.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha512;\n\tprotocol=\"application/pgp-signature\"; boundary=\"bfintam7emkbfq6t\"","Content-Disposition":"inline","In-Reply-To":"<6af505f4cdf9628dd62d09f60d0173c810727122.camel@collabora.com>","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":38563,"web_url":"https://patchwork.libcamera.org/comment/38563/","msgid":"<add6MuahrbzNICYJ@zed>","date":"2026-04-09T10:22:58","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hello\n   sorry, I only replied to Nicolas' question but didn't fully review\nthe patch\n\nOn Mon, Mar 30, 2026 at 11:14:43AM +0100, David Plowman wrote:\n> The sensor-config property may optionally be specified to give the\n> outputSize and bitDepth of the SensorConfiguration that is applied to\n> the camera configuration. For example, use\n>\n> libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n>\n> to request the 10-bit 2304x1296 mode of a sensor.\n>\n> All three parameters, width, height and bit depth, must be present, or\n> it will issue a warning and revert to automatic mode selection (as if\n> there were no sensor-config at all).\n>\n> If a mode is requested that doesn't exist then camera configuration\n> will fail and the pipeline won't start.\n>\n> As future-proofing, the SensorConfiguration's binning, increment and\n> analog-crop parameters may be specified, though libcamera currently\n> ignores them.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> Closes: https://gitlab.freedesktop.org/camera/libcamera/-/issues/300\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 73 +++++++++++++++++++++++++++++++\n>  1 file changed, 73 insertions(+)\n>\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index a7241e9b..5d3ee3a2 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -141,6 +141,7 @@ struct _GstLibcameraSrc {\n>  \tGstTask *task;\n>\n>  \tgchar *camera_name;\n> +\tGstStructure *sensor_config;\n>\n>  \tstd::atomic<GstEvent *> pending_eos;\n>\n> @@ -152,6 +153,7 @@ struct _GstLibcameraSrc {\n>  enum {\n>  \tPROP_0,\n>  \tPROP_CAMERA_NAME,\n> +\tPROP_SENSOR_CONFIG,\n>  \tPROP_LAST\n>  };\n>\n> @@ -846,6 +848,55 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n>  \t}\n>  \tg_assert(state->config_->size() == state->srcpads_.size());\n>\n> +\t/* Apply optional sensor configuration. */\n> +\tif (self->sensor_config) {\n> +\t\tgint w = 0, h = 0, depth = 0;\n> +\t\tif (!gst_structure_get_int(self->sensor_config, \"width\", &w) ||\n> +\t\t    !gst_structure_get_int(self->sensor_config, \"height\", &h) ||\n> +\t\t    !gst_structure_get_int(self->sensor_config, \"depth\", &depth) ||\n> +\t\t    w <= 0 || h <= 0 || depth <= 0) {\n\nWe mandate all fields to be populated in the documentation of\nSensorConfig, but all other fields (skipping and binning) are\ncurrently defaulted to 1 as long as we don't actually fix the\nsensor mode selection on the Linux side.\n\nI think it's fine to have the same constraint here.\n\n> +\t\t\tGST_ELEMENT_WARNING(self, RESOURCE, SETTINGS,\n> +\t\t\t\t\t    (\"sensor-config requires non-zero width, height and depth\"\n> +\t\t\t\t\t     \" fields, ignoring\"),\n> +\t\t\t\t\t    (nullptr));\n> +\t\t} else {\n> +\t\t\tSensorConfiguration sensorCfg;\n> +\t\t\tsensorCfg.outputSize = Size(w, h);\n> +\t\t\tsensorCfg.bitDepth = depth;\n> +\n> +\t\t\t/* Optional binning (defaults to 1x1). */\n> +\t\t\tgint binX, binY;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"bin-x\", &binX) && binX > 0)\n> +\t\t\t\tsensorCfg.binning.binX = binX;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"bin-y\", &binY) && binY > 0)\n> +\t\t\t\tsensorCfg.binning.binY = binY;\n\nJust wondering if we should enforce that if one of the two binning\ndirections is specified the other one should be specified as well, or\nit's fine to rely on the fact we currently default both values to 1.\n\nThe above validation of self->sensor_config works on the assumption\nthat binning and skipping are default initialized to 1, hence I think\nit's fine to make the same assumption here ?\n\n> +\n> +\t\t\t/* Optional skipping (defaults to 1 for all increments). */\n> +\t\t\tgint xOddInc, xEvenInc, yOddInc, yEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-odd-inc\", &xOddInc) && xOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xOddInc = xOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"x-even-inc\", &xEvenInc) && xEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.xEvenInc = xEvenInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-odd-inc\", &yOddInc) && yOddInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yOddInc = yOddInc;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"y-even-inc\", &yEvenInc) && yEvenInc > 0)\n> +\t\t\t\tsensorCfg.skipping.yEvenInc = yEvenInc;\n\nThe same reasoning made for binning applies to skipping\n\n> +\n> +\t\t\t/* Optional analog crop (defaults to \"unset\"). */\n> +\t\t\tgint cropX, cropY, cropW, cropH;\n> +\t\t\tif (gst_structure_get_int(self->sensor_config, \"analog-crop-x\", &cropX) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-y\", &cropY) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-width\", &cropW) &&\n> +\t\t\t    gst_structure_get_int(self->sensor_config, \"analog-crop-height\", &cropH) &&\n> +\t\t\t    cropX >= 0 && cropY >= 0 && cropW > 0 && cropH > 0)\n> +\t\t\t\tsensorCfg.analogCrop = Rectangle(cropX, cropY,\n> +\t\t\t\t\t\t\t\t static_cast<unsigned int>(cropW),\n> +\t\t\t\t\t\t\t\t static_cast<unsigned int>(cropH));\n> +\n> +\t\t\tstate->config_->sensorConfig = sensorCfg;\n\na little detail but it could be possible to avoid a copy by populating\nthe fileds of state->config_->sensorConfig. A detail though.\n\n> +\t\t}\n> +\t}\n> +\n>  \tif (!gst_libcamera_src_negotiate(self)) {\n>  \t\tstate->initControls_.clear();\n>  \t\tGST_ELEMENT_FLOW_ERROR(self, GST_FLOW_NOT_NEGOTIATED);\n> @@ -934,6 +985,10 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id,\n>  \t\tg_free(self->camera_name);\n>  \t\tself->camera_name = g_value_dup_string(value);\n>  \t\tbreak;\n> +\tcase PROP_SENSOR_CONFIG:\n> +\t\tg_clear_pointer(&self->sensor_config, gst_structure_free);\n> +\t\tself->sensor_config = (GstStructure *)g_value_dup_boxed(value);\n> +\t\tbreak;\n>  \tdefault:\n>  \t\tif (!state->controls_.setProperty(prop_id - PROP_LAST, value, pspec))\n>  \t\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> @@ -953,6 +1008,9 @@ gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value,\n>  \tcase PROP_CAMERA_NAME:\n>  \t\tg_value_set_string(value, self->camera_name);\n>  \t\tbreak;\n> +\tcase PROP_SENSOR_CONFIG:\n> +\t\tg_value_set_boxed(value, self->sensor_config);\n> +\t\tbreak;\n>  \tdefault:\n>  \t\tif (!state->controls_.getProperty(prop_id - PROP_LAST, value, pspec))\n>  \t\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> @@ -1040,6 +1098,7 @@ gst_libcamera_src_finalize(GObject *object)\n>  \tg_clear_object(&self->task);\n>  \tg_mutex_clear(&self->state->lock_);\n>  \tg_free(self->camera_name);\n> +\tg_clear_pointer(&self->sensor_config, gst_structure_free);\n>  \tdelete self->state;\n>\n>  \treturn klass->finalize(object);\n> @@ -1162,6 +1221,20 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)\n>  \t\t\t\t\t\t\t     | G_PARAM_STATIC_STRINGS));\n>  \tg_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);\n>\n> +\tspec = g_param_spec_boxed(\"sensor-config\", \"Sensor Config\",\n> +\t\t\t\t  \"Desired sensor configuration as a GstStructure with mandatory \"\n> +\t\t\t\t  \"fields width, height and depth, and optional fields bin-x, bin-y, \"\n> +\t\t\t\t  \"x-odd-inc, x-even-inc, y-odd-inc, y-even-inc, \"\n> +\t\t\t\t  \"analog-crop-x, analog-crop-y, analog-crop-width, analog-crop-height \"\n> +\t\t\t\t  \"(e.g. \\\"sensor/config,width=2304,height=1296,depth=10\\\"). \"\n> +\t\t\t\t  \"Leave unset to let the pipeline negotiate the sensor mode automatically.\",\n> +\t\t\t\t  GST_TYPE_STRUCTURE,\n> +\t\t\t\t  (GParamFlags)(GST_PARAM_MUTABLE_READY\n> +\t\t\t\t\t\t| G_PARAM_CONSTRUCT\n> +\t\t\t\t\t\t| G_PARAM_READWRITE\n> +\t\t\t\t\t\t| G_PARAM_STATIC_STRINGS));\n> +\tg_object_class_install_property(object_class, PROP_SENSOR_CONFIG, spec);\n> +\n\nI'll let other comment on the gstreamer specific parts :)\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n>  \tGstCameraControls::installProperties(object_class, PROP_LAST);\n>  }\n>\n> --\n> 2.47.3\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 24D81BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Apr 2026 10:23:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 02D3262E48;\n\tThu,  9 Apr 2026 12:23:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EC8C562010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Apr 2026 12:23:01 +0200 (CEST)","from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E5D51E2C;\n\tThu,  9 Apr 2026 12:21:32 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"GP4SajmY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775730093;\n\tbh=GNmZSCO9RIVYmUN0atzdV6RAg8wspUUeQcf9EGZEQc4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GP4SajmYWvWwkvwk9vbBUOavCXvQ6sPG1vriHDUl8tu+VyAE8LQHmWnC/IEhm8MHc\n\tfrbfO4ndB+eswOh4WpJrl0S2LwuW5jVOhhbYDcaBOxdyU054g4D30H8GEQc+GoglHs\n\tHDimMIoIH1qHHAJ6CLlOhhrJk76VxuOs6RHXsOds=","Date":"Thu, 9 Apr 2026 12:22:58 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tNicolas Dufresne <nicolas.dufresne@collabora.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","Message-ID":"<add6MuahrbzNICYJ@zed>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","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":38569,"web_url":"https://patchwork.libcamera.org/comment/38569/","msgid":"<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>","date":"2026-04-09T15:37:25","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":265,"url":"https://patchwork.libcamera.org/api/people/265/","name":"Fabien Danieau","email":"fabien.danieau@pollen-robotics.com"},"content":"Tested on a Raspberry Pi 4 with Camera Module 3.\n\nWithout the patch, requesting a 1280x720 output results in a cropped\nfield of view, as the pipeline handler selects a cropped sensor mode.\nWith the patch, specifying\nsensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\ncorrectly forces the full sensor mode and preserves the full field of\nview at 1280x720 output.\n\nTest pipeline:\n\ngst-launch-1.0 -e libcamerasrc \\\n  sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! \\\n  capsfilter caps=video/x-raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n  queue ! jpegenc ! avimux ! filesink location=output.avi\n\nTested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>","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 4D09BBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Apr 2026 15:37:41 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6567262E4E;\n\tThu,  9 Apr 2026 17:37:40 +0200 (CEST)","from mail-wm1-x333.google.com (mail-wm1-x333.google.com\n\t[IPv6:2a00:1450:4864:20::333])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 29B0062010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Apr 2026 17:37:38 +0200 (CEST)","by mail-wm1-x333.google.com with SMTP id\n\t5b1f17b1804b1-4887f49ec5aso13448565e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 09 Apr 2026 08:37:38 -0700 (PDT)","from lotus.home\n\t(dynamic-2a00-1028-8388-1986-846d-8679-d49f-e84f.ipv6.o2.cz.\n\t[2a00:1028:8388:1986:846d:8679:d49f:e84f])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-488d533e596sm5169455e9.6.2026.04.09.08.37.36\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 09 Apr 2026 08:37:37 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=pollen-robotics-com.20251104.gappssmtp.com\n\theader.i=@pollen-robotics-com.20251104.gappssmtp.com\n\theader.b=\"xDLR2L38\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=pollen-robotics-com.20251104.gappssmtp.com; s=20251104; t=1775749057;\n\tx=1776353857; darn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=dmsaEWWGHfjaD5nd2S8Zm3A4NaTQRDcnr2P3mfDVJRk=;\n\tb=xDLR2L38oe06SCROMIl9xsJz98BGrI4jkg+8aik5RSZ+1Vp0AlM+a+yb5SzOZ1N19d\n\tHh4ai6oyky5YrEq8A4dzZANqATh8Fa7brGR+/APdPAlEaYodsLskafFOe1VfWVnz4tis\n\twN3v3LbzkGk8KuHTvcao3YC5HzlEbxenScYLmUwhsf0RaD0SBLLc5V9t3PRuAMeFE2g1\n\tAluuK+6vi3+FPxQ6Pyk5XSMaPFkFr+nGHp68lHyJTxBxV3BBJOt1Q44vzGmORbfdpkky\n\t/2Xd9e9gPz+ENn4Pp1df2fFkFbXN9muzKGdsyhrdZzZI+eUz4JvyTs2sc/G7P/M58j8x\n\tu4qg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1775749057; x=1776353857;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=dmsaEWWGHfjaD5nd2S8Zm3A4NaTQRDcnr2P3mfDVJRk=;\n\tb=FOVgdUkf6srKyysitNxt6I+woTNhoJbLdvbayi7R7dIa64k8HDbyq80vW98ZSog49w\n\t0QO2Omj5TmJymXPe26SWUbDUOYUNO3Lyyi9SYwxNeos0RbPJomIB4vS78hC9xLejWUlu\n\tbzktZbxkUHZ9Wu3Q9SE+5gtamkuCCug0CpRhDbpySwLWQ/5DVQbjpMk05j8UsfP1vTF+\n\tuyaXGPV9d6wZugybVeo4EoXOoL9qYLawEFw3ej2kmjmIgSWWLsrTIuvzf4JrVQp7uEKO\n\tTFuGaJyaJzHlSVYVNf2q9eG+CzuQpvyoaQuRWmmXLEMAH96BlYN+Rcghgr/IXNQl3i8X\n\tDU0Q==","X-Gm-Message-State":"AOJu0YzTMcq1O4FNvGeuBurKqKyr446Roea8sUSGA7nikrz0RfRpb2vt\n\tSojbq9SbCpRk/g4Q3anNKCeDSTR2SfuNSkvlNYX4k1sAph6oCbnVHEJaBc/iMdwOFeq5GGtL2vR\n\tM0l4nl5w=","X-Gm-Gg":"AeBDietMVpSNQ9fakQIpKtdlABtjl3MYYVZ5TzsqDHudDzUFF4SeHehj/75K53KVmhT\n\tVp8H+m3mi75oYC9dVbFV4GbxBXZRLLpIxGM07kwoaPg+24iVbOqwQhLBFRPTz87xuZ+JYe0iFzx\n\tO9P0xM0IECWIyJyteCDflRuPyaYfwEorz4AoLWmQrj+wlzi6NiMIQH+1/6ZF0i5Gyj7wYb3XAv4\n\tP98DrSqQ0rJuI7x+TYSr12CxfD7BH5Y6Ucll/+BDg79hYHwIHb1aDC16f9BvSQ0GHbPnZnDhCEB\n\tghnOd+8aMon4LAZhRQTBNahriw6MhgynsPJrOBLk6OAghvWzzryK20B4nfo+nGCPjWRmTj+Mf2u\n\tR0Xy95/zr+X3P4ET7nB5LdEXoUYSYtEhAoC+v0HcvFLHDe7aTvCneBsbEyKYjIYbw5Jwp6E92YK\n\t4DyJ12A8ByL2H4Imz6VPfxKrmqLxzUWFzWaxcnn7EXF05iXBiz8xVelYcWqU9ZgsP2npDPUQPRW\n\tnnHXXzf23YuTN7fgeDv5lCCHtwd6c5wJ0x4CJ2k","X-Received":"by 2002:a05:600c:621a:b0:488:b675:360f with SMTP id\n\t5b1f17b1804b1-488b6753785mr185401115e9.27.1775749057584; \n\tThu, 09 Apr 2026 08:37:37 -0700 (PDT)","From":"Fabien Danieau <fabien.danieau@pollen-robotics.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Fabien Danieau <fabien.danieau@pollen-robotics.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","Date":"Thu,  9 Apr 2026 17:37:25 +0200","Message-ID":"<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>","X-Mailer":"git-send-email 2.47.3","In-Reply-To":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>","MIME-Version":"1.0","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>"}},{"id":38571,"web_url":"https://patchwork.libcamera.org/comment/38571/","msgid":"<CAHW6GYLvQvpk_OHgquNX3Z9Na_t+suKk3zsNp0Wj22HH0OU_TA@mail.gmail.com>","date":"2026-04-09T15:55:09","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Jacopo\n\nThanks very much for the review!\n\nOn Thu, 9 Apr 2026 at 11:23, Jacopo Mondi <jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hello\n>    sorry, I only replied to Nicolas' question but didn't fully review\n> the patch\n>\n> On Mon, Mar 30, 2026 at 11:14:43AM +0100, David Plowman wrote:\n> > The sensor-config property may optionally be specified to give the\n> > outputSize and bitDepth of the SensorConfiguration that is applied to\n> > the camera configuration. For example, use\n> >\n> > libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> >\n> > to request the 10-bit 2304x1296 mode of a sensor.\n> >\n> > All three parameters, width, height and bit depth, must be present, or\n> > it will issue a warning and revert to automatic mode selection (as if\n> > there were no sensor-config at all).\n> >\n> > If a mode is requested that doesn't exist then camera configuration\n> > will fail and the pipeline won't start.\n> >\n> > As future-proofing, the SensorConfiguration's binning, increment and\n> > analog-crop parameters may be specified, though libcamera currently\n> > ignores them.\n> >\n> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> > Closes: https://gitlab.freedesktop.org/camera/libcamera/-/issues/300\n> > ---\n> >  src/gstreamer/gstlibcamerasrc.cpp | 73 +++++++++++++++++++++++++++++++\n> >  1 file changed, 73 insertions(+)\n> >\n> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > index a7241e9b..5d3ee3a2 100644\n> > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > @@ -141,6 +141,7 @@ struct _GstLibcameraSrc {\n> >       GstTask *task;\n> >\n> >       gchar *camera_name;\n> > +     GstStructure *sensor_config;\n> >\n> >       std::atomic<GstEvent *> pending_eos;\n> >\n> > @@ -152,6 +153,7 @@ struct _GstLibcameraSrc {\n> >  enum {\n> >       PROP_0,\n> >       PROP_CAMERA_NAME,\n> > +     PROP_SENSOR_CONFIG,\n> >       PROP_LAST\n> >  };\n> >\n> > @@ -846,6 +848,55 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n> >       }\n> >       g_assert(state->config_->size() == state->srcpads_.size());\n> >\n> > +     /* Apply optional sensor configuration. */\n> > +     if (self->sensor_config) {\n> > +             gint w = 0, h = 0, depth = 0;\n> > +             if (!gst_structure_get_int(self->sensor_config, \"width\", &w) ||\n> > +                 !gst_structure_get_int(self->sensor_config, \"height\", &h) ||\n> > +                 !gst_structure_get_int(self->sensor_config, \"depth\", &depth) ||\n> > +                 w <= 0 || h <= 0 || depth <= 0) {\n>\n> We mandate all fields to be populated in the documentation of\n> SensorConfig, but all other fields (skipping and binning) are\n> currently defaulted to 1 as long as we don't actually fix the\n> sensor mode selection on the Linux side.\n>\n> I think it's fine to have the same constraint here.\n\nAgree!\n\n>\n> > +                     GST_ELEMENT_WARNING(self, RESOURCE, SETTINGS,\n> > +                                         (\"sensor-config requires non-zero width, height and depth\"\n> > +                                          \" fields, ignoring\"),\n> > +                                         (nullptr));\n> > +             } else {\n> > +                     SensorConfiguration sensorCfg;\n> > +                     sensorCfg.outputSize = Size(w, h);\n> > +                     sensorCfg.bitDepth = depth;\n> > +\n> > +                     /* Optional binning (defaults to 1x1). */\n> > +                     gint binX, binY;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"bin-x\", &binX) && binX > 0)\n> > +                             sensorCfg.binning.binX = binX;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"bin-y\", &binY) && binY > 0)\n> > +                             sensorCfg.binning.binY = binY;\n>\n> Just wondering if we should enforce that if one of the two binning\n> directions is specified the other one should be specified as well, or\n> it's fine to rely on the fact we currently default both values to 1.\n>\n> The above validation of self->sensor_config works on the assumption\n> that binning and skipping are default initialized to 1, hence I think\n> it's fine to make the same assumption here ?\n\nYes, it all works because everything gets initialised to 1, so it\nbehaves just like the C++ API really.\n\nThere are certainly questions as to what further constraints might\nmake sense here - but as there aren't any defined in C++ yet, is it\nworth doing something a bit speculative? I don't know. Actually I'd be\nhappy to drop all the bin/inc fields entirely, though having them does\nmean that if they did start being used, then they're already\navailable, which could be a plus. Overall I feel I'm slightly inclined\nto do nothing, mostly because I wouldn't know what to do instead, but\nam certainly open to further persuasion...\n\n>\n> > +\n> > +                     /* Optional skipping (defaults to 1 for all increments). */\n> > +                     gint xOddInc, xEvenInc, yOddInc, yEvenInc;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"x-odd-inc\", &xOddInc) && xOddInc > 0)\n> > +                             sensorCfg.skipping.xOddInc = xOddInc;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"x-even-inc\", &xEvenInc) && xEvenInc > 0)\n> > +                             sensorCfg.skipping.xEvenInc = xEvenInc;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"y-odd-inc\", &yOddInc) && yOddInc > 0)\n> > +                             sensorCfg.skipping.yOddInc = yOddInc;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"y-even-inc\", &yEvenInc) && yEvenInc > 0)\n> > +                             sensorCfg.skipping.yEvenInc = yEvenInc;\n>\n> The same reasoning made for binning applies to skipping\n\nYes, same here! Not really sure what else would make sense instead...\n\n>\n> > +\n> > +                     /* Optional analog crop (defaults to \"unset\"). */\n> > +                     gint cropX, cropY, cropW, cropH;\n> > +                     if (gst_structure_get_int(self->sensor_config, \"analog-crop-x\", &cropX) &&\n> > +                         gst_structure_get_int(self->sensor_config, \"analog-crop-y\", &cropY) &&\n> > +                         gst_structure_get_int(self->sensor_config, \"analog-crop-width\", &cropW) &&\n> > +                         gst_structure_get_int(self->sensor_config, \"analog-crop-height\", &cropH) &&\n> > +                         cropX >= 0 && cropY >= 0 && cropW > 0 && cropH > 0)\n> > +                             sensorCfg.analogCrop = Rectangle(cropX, cropY,\n> > +                                                              static_cast<unsigned int>(cropW),\n> > +                                                              static_cast<unsigned int>(cropH));\n> > +\n> > +                     state->config_->sensorConfig = sensorCfg;\n>\n> a little detail but it could be possible to avoid a copy by populating\n> the fileds of state->config_->sensorConfig. A detail though.\n\nYes, fair point. We could default-construct the\nstate->config_->sensorConfig and then populate the fields, though\n(referring a bit to my hand-wringing above) I'm a bit nervous about a\nfuture where we might change our minds and have code paths where\nneeded to remove it again! So I'm slightly inclined to stick with what\n(arguably, of course) feels like the most obvious implementation,\ngiven that the initialisation-time copy doesn't really seem of any\ngreat consequence.\n\n>\n> > +             }\n> > +     }\n> > +\n> >       if (!gst_libcamera_src_negotiate(self)) {\n> >               state->initControls_.clear();\n> >               GST_ELEMENT_FLOW_ERROR(self, GST_FLOW_NOT_NEGOTIATED);\n> > @@ -934,6 +985,10 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id,\n> >               g_free(self->camera_name);\n> >               self->camera_name = g_value_dup_string(value);\n> >               break;\n> > +     case PROP_SENSOR_CONFIG:\n> > +             g_clear_pointer(&self->sensor_config, gst_structure_free);\n> > +             self->sensor_config = (GstStructure *)g_value_dup_boxed(value);\n> > +             break;\n> >       default:\n> >               if (!state->controls_.setProperty(prop_id - PROP_LAST, value, pspec))\n> >                       G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> > @@ -953,6 +1008,9 @@ gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value,\n> >       case PROP_CAMERA_NAME:\n> >               g_value_set_string(value, self->camera_name);\n> >               break;\n> > +     case PROP_SENSOR_CONFIG:\n> > +             g_value_set_boxed(value, self->sensor_config);\n> > +             break;\n> >       default:\n> >               if (!state->controls_.getProperty(prop_id - PROP_LAST, value, pspec))\n> >                       G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n> > @@ -1040,6 +1098,7 @@ gst_libcamera_src_finalize(GObject *object)\n> >       g_clear_object(&self->task);\n> >       g_mutex_clear(&self->state->lock_);\n> >       g_free(self->camera_name);\n> > +     g_clear_pointer(&self->sensor_config, gst_structure_free);\n> >       delete self->state;\n> >\n> >       return klass->finalize(object);\n> > @@ -1162,6 +1221,20 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)\n> >                                                            | G_PARAM_STATIC_STRINGS));\n> >       g_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);\n> >\n> > +     spec = g_param_spec_boxed(\"sensor-config\", \"Sensor Config\",\n> > +                               \"Desired sensor configuration as a GstStructure with mandatory \"\n> > +                               \"fields width, height and depth, and optional fields bin-x, bin-y, \"\n> > +                               \"x-odd-inc, x-even-inc, y-odd-inc, y-even-inc, \"\n> > +                               \"analog-crop-x, analog-crop-y, analog-crop-width, analog-crop-height \"\n> > +                               \"(e.g. \\\"sensor/config,width=2304,height=1296,depth=10\\\"). \"\n> > +                               \"Leave unset to let the pipeline negotiate the sensor mode automatically.\",\n> > +                               GST_TYPE_STRUCTURE,\n> > +                               (GParamFlags)(GST_PARAM_MUTABLE_READY\n> > +                                             | G_PARAM_CONSTRUCT\n> > +                                             | G_PARAM_READWRITE\n> > +                                             | G_PARAM_STATIC_STRINGS));\n> > +     g_object_class_install_property(object_class, PROP_SENSOR_CONFIG, spec);\n> > +\n>\n> I'll let other comment on the gstreamer specific parts :)\n>\n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks again!\n\nDavid\n\n\nDavid\n\n>\n> Thanks\n>   j\n> >       GstCameraControls::installProperties(object_class, PROP_LAST);\n> >  }\n> >\n> > --\n> > 2.47.3\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 F0FC0BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Apr 2026 15:55:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5066862010;\n\tThu,  9 Apr 2026 17:55:23 +0200 (CEST)","from mail-ej1-x633.google.com (mail-ej1-x633.google.com\n\t[IPv6:2a00:1450:4864:20::633])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F3DDF62010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Apr 2026 17:55:21 +0200 (CEST)","by mail-ej1-x633.google.com with SMTP id\n\ta640c23a62f3a-b9bfcbaa81eso171414266b.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 09 Apr 2026 08:55:21 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"qU9w47T8\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1775750121; cv=none;\n\td=google.com; s=arc-20240605;\n\tb=gkzf0J0X7PRxydZ6uQxzkFBWN4rTm1CAvOE/0EdAg9TcfUABaHzctI20crWNxlplNb\n\tPpYFUE6pZiURowjxVOA/5OajzrkXjmgb/LEujCq3z6Lh0GfDAlPnr/zaNsmW62fp22dc\n\t/8kqH951YSin3/t8mJ5O591MFVhw+bVC5xfPwh/ySjFshq6wjMq+ZdHejMRSC0bDaW2m\n\tO/YroWj/LS41I8ORx+STFPqy/QeZWQwQ7cW5K/jrRmB583rCVeSzXAmBW6msSqud/sWU\n\tH+3tt1yqCZvOPhF/CJmCGt+SL+3TBzRvJhijFPucjQafHUHuk2wp5rT2K7xtJZk8+OqY\n\tOKwA==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n\ts=arc-20240605; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:dkim-signature;\n\tbh=jm4YgOoSxPLRyuYCRw7fZsQpWSq9OOq3AucSanOvJEw=;\n\tfh=uz3PQ5Di6P49VQhH6/Js7iNKQpuELFfThKg6QEw2A7E=;\n\tb=Os8q0G+pF124jp7HeccpMlg86sUu0sGYuBtJAfcTpjYxndBlC3Kkxn8aGMAwsX0vUg\n\tMVFzGGpfIBPlqPgVG70JJn32La4dKr+dgCpXVYzqZKia3LP67JVUNc6+AfTfF4rg7KR8\n\tEJ4u0xSqgQp33uvisL3P/jko2QDKKhOQjQB1CBzkV+BybFb670GaDsO0LSboGgaiAYGK\n\tbHKdxaw71j6Er6wR4XaELyGyoGA4EuA3wwjxuKJ9y2lG9pueg8IKzbv+95xbyRkm9Z/+\n\tskpNZ+EsIpBWgcaGRF+vq7iFBdBc2WL/UZ68LGWyNEcVyE0FFJGG/RY1AwN8e4yytlBN\n\tJHuA==; darn=lists.libcamera.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1775750121; x=1776354921;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=jm4YgOoSxPLRyuYCRw7fZsQpWSq9OOq3AucSanOvJEw=;\n\tb=qU9w47T8m+2Q4PMmCrRhONmwdQcPETgOJ2z3/NAOFWkTZoIaBWkkf1FBtwLdbgX2Hz\n\twTbQ+tpRcjNuuxE/Mo11+tCl5xkhsg2l3x9NL1oCkNUJoA1gL/oLPbifp8uq2SrE+JHZ\n\tjn6ztkegoKoC6m3zwD96kfTUizqOe/oiIYm/rGzri1i1XMofdDhxhh9+sP2eqZl3niOB\n\t3o+iDz5p32YPSKV8a1qp7HXFAK8XCKikjYOySkqIb/sQwoUhKsqpZ3zt5KKdsf2rUAOG\n\tJfMH/DzjCwy4rIXjeGbxaet05Wxw9RPRQQV0Qj8j2TorLSc7HwARhAxZr1nNRKr/Gwwa\n\tLeaw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1775750121; x=1776354921;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=jm4YgOoSxPLRyuYCRw7fZsQpWSq9OOq3AucSanOvJEw=;\n\tb=sUQ0eKkpn9vtq9Co31vspFGvLfmJiC8yPYMp0e4eIdruTNX2lDqdIddH9eSzP9JGhI\n\tzo1bNevC+XlmqYsy+1IF9+FMTeaRHQ6LRLZh+zOP9k3zrYK/sWA0xUNZYQu13iNvniJp\n\tkF5EJ2ynaX+1GhLjTT1wVU+7XSuX5tg9UG80tH9Jeqf2zK+aZLTYi/JwWRMudJtPCWkP\n\tjdvBi1Va5zXMV8G7EUln8aobdNerCDYSrVB98MDp3zrc/bQIn21/UIVJeA/7L/2y4LXM\n\tsD0EG5b6Xd4r0CnogjNKoPQ97sfUCYf/3C/0SwlphVwzuJ/qBw3TlP0dJmEVLpj+OwzR\n\tSiiQ==","X-Gm-Message-State":"AOJu0YwroKAyIEv+gEOuTtPaFs1K+ydL6SybwZvkEkvORtZTve0xXMfq\n\tEo5ruDok39sAW22FpgAuD6UvDWzga0GLtdxLC8vZgyDB8vthnyrXmt8CK7j12faVcHqyYPGqE2v\n\tbHCIzTwDIdRDigiX8F8cEp5RdS5rT7x9CI8UME44mkA==","X-Gm-Gg":"AeBDieszf6NewThQRKXDG+kFKzUb6184lrYZEKyqaOmbhto17mIxw0hcfPlcKrPlRgA\n\t8Z2i9EPjZ8TLOfA2w7sm4OMbgy5K25flXwUngveZtyXxvY9LlF4btbmN9FwZa4TbKoV845I3R97\n\t+TQYUsa2wh+p3zmdB0Bxx9C6YyxujNuzDeW2GD41fi4gqz3JlCDJIdIvDs+574RYKsCrLfwPiAg\n\tY5+CSXt8yCTn7WmnTacVNWlt5juRBy9IXjWxC8yVali9MfvyMiodVTvqDsJ6k1bCN0fr0jQe5fe\n\tGu1KnoUhc6qmpXfpyMstxElXpKTJXowoi8368hwXb0tCNP6i7ynlzyE+eYSYi3fH5o1qbjq2zOy\n\tN8Fh+mvJnzZ0u4rilCodXZEgU","X-Received":"by 2002:a17:907:97ce:b0:b9d:4658:7ffa with SMTP id\n\ta640c23a62f3a-b9d465889fbmr246593666b.49.1775750121141;\n\tThu, 09 Apr 2026 08:55:21 -0700 (PDT)","MIME-Version":"1.0","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<add6MuahrbzNICYJ@zed>","In-Reply-To":"<add6MuahrbzNICYJ@zed>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Thu, 9 Apr 2026 16:55:09 +0100","X-Gm-Features":"AQROBzBgftnK_GGfp6Itg8wLHIyj2FcCPvQPJLQovQk3WWyDpuroC4_IEq5U0kI","Message-ID":"<CAHW6GYLvQvpk_OHgquNX3Z9Na_t+suKk3zsNp0Wj22HH0OU_TA@mail.gmail.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tNicolas Dufresne <nicolas.dufresne@collabora.com>","Content-Type":"text/plain; charset=\"UTF-8\"","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":38572,"web_url":"https://patchwork.libcamera.org/comment/38572/","msgid":"<20260409163620.GA2712636@killaraus.ideasonboard.com>","date":"2026-04-09T16:36:20","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hello Fabien,\n\nOn Thu, Apr 09, 2026 at 05:37:25PM +0200, Fabien Danieau wrote:\n> Tested on a Raspberry Pi 4 with Camera Module 3.\n> \n> Without the patch, requesting a 1280x720 output results in a cropped\n> field of view, as the pipeline handler selects a cropped sensor mode.\n> With the patch, specifying\n> sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> correctly forces the full sensor mode and preserves the full field of\n> view at 1280x720 output.\n\nThank you for testing.\n\nWhile configuring the sensor from GStreamer is a needed feature, it\nsounds like there's also another issue somewhere. By default, libcamera\nshould not select a sensor configuration that will restrict the field of\nview (at least not in both directions, if the requested aspect ratio\ndiffers from the native aspect ratio, cropping in one direction is\nexpected), if not requested explicitly by the application.\n\nDavid, any comment on this ?\n\n> Test pipeline:\n> \n> gst-launch-1.0 -e libcamerasrc \\\n>   sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! \\\n>   capsfilter caps=video/x-raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n>   queue ! jpegenc ! avimux ! filesink location=output.avi\n> \n> Tested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>","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 F408BBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Apr 2026 16:36:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F295062E53;\n\tThu,  9 Apr 2026 18:36:22 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3421962010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Apr 2026 18:36:22 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id EB42AC75;\n\tThu,  9 Apr 2026 18:34:52 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"GEaqOym7\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775752493;\n\tbh=BwtgIuTm+sK5nLcNSFkPg3tjRET2Pv6omW9eo31n1KE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GEaqOym7vOjxbTJv9Hf1FckAJuFNhtmw5r5R9ba0RCeWw+AyyjMDhGCdemvbKR9Pb\n\tlWivqbqfPzNhkVD7Qie+Pg0TdBN4WcAraVua0HEg0gWC4UL0tIzID4U42OZQ1TShFZ\n\tVXjofHmrQFXeQYDhc8rZbfUR1tJm3HjUpB5nag4A=","Date":"Thu, 9 Apr 2026 19:36:20 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Fabien Danieau <fabien.danieau@pollen-robotics.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tDavid Plowman <david.plowman@raspberrypi.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","Message-ID":"<20260409163620.GA2712636@killaraus.ideasonboard.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>","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":38573,"web_url":"https://patchwork.libcamera.org/comment/38573/","msgid":"<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>","date":"2026-04-10T09:23:21","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Laurent\n\nOn Thu, 9 Apr 2026 at 17:36, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hello Fabien,\n>\n> On Thu, Apr 09, 2026 at 05:37:25PM +0200, Fabien Danieau wrote:\n> > Tested on a Raspberry Pi 4 with Camera Module 3.\n> >\n> > Without the patch, requesting a 1280x720 output results in a cropped\n> > field of view, as the pipeline handler selects a cropped sensor mode.\n> > With the patch, specifying\n> > sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> > correctly forces the full sensor mode and preserves the full field of\n> > view at 1280x720 output.\n>\n> Thank you for testing.\n\nYes, thanks for doing that, Fabien!\n\n>\n> While configuring the sensor from GStreamer is a needed feature, it\n> sounds like there's also another issue somewhere. By default, libcamera\n> should not select a sensor configuration that will restrict the field of\n> view (at least not in both directions, if the requested aspect ratio\n> differs from the native aspect ratio, cropping in one direction is\n> expected), if not requested explicitly by the application.\n>\n> David, any comment on this ?\n\nYes, fair question!\n\nSo the short answer (for those without the stamina to wade through the\nrest of the discussion!!) is that, on the Pi at least, you have no\nguarantees what the auto selection will choose. The only way to be\nsure of the outcome is to specify the SensorConfiguration correctly.\n\nThe slightly longer answer is that our auto selection predates the\nexistence of the SensorConfiguration, so we made it possible for users\nto get cropped modes with fast framerates (even where the aspect ratio\nmatches the full sensor resolution). The mechanism for that was by\nchoosing modes \"closer\" in resolution to the requested output\nresolution; there wasn't really any other way. The case in point is\nthe 1536x864 120fps mode of the imx708 (full resolution 4608x2592). so\nasking for an output \"close\" to 1536x864 would give you this mode.\n\nOf course, you immediately get into questions of \"how close\" should\nthe resolutions be? \"How similar\" should aspect ratios be, how to\ntrade one against the other, and so on, leading us to (I won't deny\nit!) a slightly unholy mixture of heuristics and fudge factors.\n\nThis all just reiterates why the SensorConfiguration is necessary, but\nalso leaves us in a position where it's hard to know what to do with\nthe auto selection. To be honest, I didn't even know about any rules\nfor the default behaviour but I think some of our users would be quite\nirate if we changed anything that they've (for good or ill) come to\nrely on, so we're probably stuck where we are.\n\nI guess that's all largely orthogonal to the actual patch at hand, but\nhopefully it does explain the situation at least a little bit...\n\nThanks (and congrats if you made it to the bottom!)\n\nDavid\n\n>\n> > Test pipeline:\n> >\n> > gst-launch-1.0 -e libcamerasrc \\\n> >   sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! \\\n> >   capsfilter caps=video/x-raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n> >   queue ! jpegenc ! avimux ! filesink location=output.avi\n> >\n> > Tested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","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 33A33BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 10 Apr 2026 09:23:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 21D3E62E57;\n\tFri, 10 Apr 2026 11:23:35 +0200 (CEST)","from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com\n\t[IPv6:2a00:1450:4864:20::62e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4384262CCC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 10 Apr 2026 11:23:33 +0200 (CEST)","by mail-ej1-x62e.google.com with SMTP id\n\ta640c23a62f3a-b97f9587e6eso246923566b.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 10 Apr 2026 02:23:33 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"Z7oDIRyI\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1775813012; cv=none;\n\td=google.com; s=arc-20240605;\n\tb=kHbD4VzhZ1TstX4/aPAg5bUZ8JtxzBwLCbvC9KpDoNmeNPyG9Xj3rJKcL8OzC1mOdG\n\twY2mknkiyAM4JXgDjHl9q4fXPkZ6yrgxz8mTvOHrNKfS9H2qWYlVkDbP4xb8v5JFe+Ns\n\tthboMRq4oMAlFOmjDIRSHTABLVCD4CWB36DNR5wQj3TQKaOaYCciku0J7sS7Ank1NJFg\n\tL7M7jwc2rOeot9/6xUvpZ1BQr8zTP7K9dgnLXP2Flg3tcR0+CCf+HBI4ukde3d+AkRKk\n\tOdhLCpxAt8eNhv7d6N/IQu4pVYBPLqEf9yZAch7VF1qTOa2J4C+tAVmSGZYpttHeofyA\n\tWorQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n\ts=arc-20240605; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:dkim-signature;\n\tbh=PU2PbUUgyknfwcpyHTn/3Rsut1Ibk7hET89lo8NlKWE=;\n\tfh=WDHtIjvXOAnWpcl4F2o1vELN8xArRS1pUBwY4FAED24=;\n\tb=G4uysjOR9FnEJZdTsrzPtCe+aaUN11++sjUHbvibDZlWt+gDn5+WapdfsGj515EEs/\n\tjTR3VMuAuAMkw0QzLHWK3V6OpBDK3GD8mvEuIHX8eD4PwaJ+hCunWHbuIsPFYuD15o9K\n\tC97oW4OZkI4DY6MCPuZkNz7Rw5yHCtlDJ/etH4YNu/hE3gwaj9cmhedXBVrNDaKRJuQr\n\t8SsWXPVBr/RJueI99kvj8ykdxWjUGAPqxnPNmtLs+suwr0lMESRalX5FsiP7RVetof0E\n\tamWgYy7Y7FWqqkqUDUcrWxI/NdnocSG8mKAxjB9Tzx+JiBQhUnVNIb8z8gDh3KvCjP33\n\tZh1A==; darn=lists.libcamera.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1775813012; x=1776417812;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=PU2PbUUgyknfwcpyHTn/3Rsut1Ibk7hET89lo8NlKWE=;\n\tb=Z7oDIRyIg80vZBC69uADCc0fmbhLcudHoj8zKYLyoSrWEBa5WhtOK0s8O4oMXJh+Ul\n\tbVhGJgzjbGQwu4UTng92uc1A2LWsEJXAfIkUoBC5+EUt/vlmGfAwI0qU4M7XdLrFKq3c\n\tHTZB7qZYUEzoJlpgwp5PSkhqQVQUSf+3qmI5fAbPP3L4T+T+qfd12sIVdKePMVD3JITI\n\t8XRuxl5FM0EdTM3XI7maqR+QfR2fxIeVY3qU3r/9QtFbDVhkmQN709vcpCfiGve9Mf/g\n\tDcEbr1ryHsT77nNZs/XI3Fc+/qYRacj70hQnjUmGUFd4a782Qv222jb5IaQWtZ8HR+Wg\n\ta5Ow==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1775813012; x=1776417812;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=PU2PbUUgyknfwcpyHTn/3Rsut1Ibk7hET89lo8NlKWE=;\n\tb=pTgztjEoPuYO/tT/JP1X6GdbcJbdXIH72xylHAh0n7zLg6to9zpweM6ZGop8QxNv1+\n\tRHJlz+vdp9I+CVfyzTLKO5aaRScm/kCv2zA802WlQ/3T2pNRp10JAJMSDQ8brDArxc0R\n\t6ff3zDk/Aj3oVNnZWSsObEgiGDqUaMiARzbSOtmWd3PnDj8oUX+PRrqlmFrMzNZIO5c0\n\tQX6JNcFfcvCFRL+ZQAfmJjOAfeYWGfDEQW3F40BekPVeqJQwmNVOnsF7sk290jlsb6Ym\n\tFJlAtc1PaiRhmgCh9/bUY3Kw/PMyNjuhO1TofyDywBBcSAv5i6ErwbSkkF8fA0rTtlwf\n\tUbiQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCXGUV1Wuc7aZNik/51h6HPd6Lh+CzFHhhpkQjN7OJoBI3Nseept+CUpFEfjIyBd++ts0/6Ec5t6YB+hsEEWQFU=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YyPzyoFQhmzj/I9mtQesrdFH2jcnLIoFf0EMQ/LTiMJDgrfcma4\n\t3cqXvL3VC2HH+1S8l+5iIOWis6drGhfZ/aeEdRVDb1kvXPdZTlyWOHDfX27vsAf5bu2PQAg5Ih0\n\tC2zeLD87LIm/7aJZestpo1bbnTWPzzBnQrSVOxTs+uw==","X-Gm-Gg":"AeBDieuEv7ubxb1K3eUZknEXPkWRVT9FldWyJ5n36lTmeCCkpyNhkHbde8ujBHK9FMo\n\txPD+lBXn8yx4xE5CGAubKIreAFvjoYGmbu9FR8hQRGQCPdyoPF1O2QgvwBD0BuuEDbKp3zNz8IL\n\tX2eZ3b7fy7P1SkOdXkpR90AdVbJ7N4+ObaxIbERkQ+G0PxR3rDiOzrSVtgz5UmLaW78goYX5MUX\n\tz2cY27Mf5C/EYqNkCVkj0GA4wSpGtxK78gbPaBSDaKhO08zcbeDEUoT2TnbMTzbkLqnYZzWhEOb\n\tU08aXTWFnBKrVgpYzMbXilZ3E3G+Jn0GkUtHko3C7lfyhpRvDdcFMNWqKozSz9Mf2/kicxDJEOV\n\tbQ2bvtrPfnd+AVc8QxVNYCflw","X-Received":"by 2002:a17:907:26c4:b0:b97:cc05:61b9 with SMTP id\n\ta640c23a62f3a-b9d7260df98mr145044966b.15.1775813012336;\n\tFri, 10 Apr 2026 02:23:32 -0700 (PDT)","MIME-Version":"1.0","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>","In-Reply-To":"<20260409163620.GA2712636@killaraus.ideasonboard.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Fri, 10 Apr 2026 10:23:21 +0100","X-Gm-Features":"AQROBzBq3vVe2IatCV1MdjYTzt2egIGpaJbatwlEnCWmHlvFW_YDdnKk7blxnE8","Message-ID":"<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Fabien Danieau <fabien.danieau@pollen-robotics.com>,\n\tlibcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","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":38611,"web_url":"https://patchwork.libcamera.org/comment/38611/","msgid":"<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>","date":"2026-04-14T14:26:36","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":265,"url":"https://patchwork.libcamera.org/api/people/265/","name":"Fabien Danieau","email":"fabien.danieau@pollen-robotics.com"},"content":"Hi all,\n\nJust a quick note on the tests with new high fps.\n\nThis doesn't work:\ngst-launch-1.0 -e libcamerasrc sensor-\nconfig=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter\ncaps=video/x-raw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc\n! avimux ! filesink location=output.avi\n\nwhile this does:\ngst-launch-1.0 -e libcamerasrc ! capsfilter caps=video/x-\nraw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc ! avimux !\nfilesink location=output.avi\n\nand going up to 56fps also works:\ngst-launch-1.0 -e libcamerasrc sensor-\nconfig=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter\ncaps=video/x-raw,width=1280,height=720,framerate=56/1 ! queue ! jpegenc\n! avimux ! filesink location=output.avi\n\nBest,\n\nFabien\n\nOn Fri, 2026-04-10 at 10:23 +0100, David Plowman wrote:\n> Hi Laurent\n> \n> On Thu, 9 Apr 2026 at 17:36, Laurent Pinchart\n> <laurent.pinchart@ideasonboard.com> wrote:\n> > \n> > Hello Fabien,\n> > \n> > On Thu, Apr 09, 2026 at 05:37:25PM +0200, Fabien Danieau wrote:\n> > > Tested on a Raspberry Pi 4 with Camera Module 3.\n> > > \n> > > Without the patch, requesting a 1280x720 output results in a\n> > > cropped\n> > > field of view, as the pipeline handler selects a cropped sensor\n> > > mode.\n> > > With the patch, specifying\n> > > sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> > > correctly forces the full sensor mode and preserves the full\n> > > field of\n> > > view at 1280x720 output.\n> > \n> > Thank you for testing.\n> \n> Yes, thanks for doing that, Fabien!\n> \n> > \n> > While configuring the sensor from GStreamer is a needed feature, it\n> > sounds like there's also another issue somewhere. By default,\n> > libcamera\n> > should not select a sensor configuration that will restrict the\n> > field of\n> > view (at least not in both directions, if the requested aspect\n> > ratio\n> > differs from the native aspect ratio, cropping in one direction is\n> > expected), if not requested explicitly by the application.\n> > \n> > David, any comment on this ?\n> \n> Yes, fair question!\n> \n> So the short answer (for those without the stamina to wade through\n> the\n> rest of the discussion!!) is that, on the Pi at least, you have no\n> guarantees what the auto selection will choose. The only way to be\n> sure of the outcome is to specify the SensorConfiguration correctly.\n> \n> The slightly longer answer is that our auto selection predates the\n> existence of the SensorConfiguration, so we made it possible for\n> users\n> to get cropped modes with fast framerates (even where the aspect\n> ratio\n> matches the full sensor resolution). The mechanism for that was by\n> choosing modes \"closer\" in resolution to the requested output\n> resolution; there wasn't really any other way. The case in point is\n> the 1536x864 120fps mode of the imx708 (full resolution 4608x2592).\n> so\n> asking for an output \"close\" to 1536x864 would give you this mode.\n> \n> Of course, you immediately get into questions of \"how close\" should\n> the resolutions be? \"How similar\" should aspect ratios be, how to\n> trade one against the other, and so on, leading us to (I won't deny\n> it!) a slightly unholy mixture of heuristics and fudge factors.\n> \n> This all just reiterates why the SensorConfiguration is necessary,\n> but\n> also leaves us in a position where it's hard to know what to do with\n> the auto selection. To be honest, I didn't even know about any rules\n> for the default behaviour but I think some of our users would be\n> quite\n> irate if we changed anything that they've (for good or ill) come to\n> rely on, so we're probably stuck where we are.\n> \n> I guess that's all largely orthogonal to the actual patch at hand,\n> but\n> hopefully it does explain the situation at least a little bit...\n> \n> Thanks (and congrats if you made it to the bottom!)\n> \n> David\n> \n> > \n> > > Test pipeline:\n> > > \n> > > gst-launch-1.0 -e libcamerasrc \\\n> > >   sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" !\n> > > \\\n> > >   capsfilter caps=video/x-\n> > > raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n> > >   queue ! jpegenc ! avimux ! filesink location=output.avi\n> > > \n> > > Tested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>\n> > \n> > --\n> > Regards,\n> > \n> > Laurent Pinchart","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 1FE24BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Apr 2026 14:26:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B8EA062E9F;\n\tTue, 14 Apr 2026 16:26:40 +0200 (CEST)","from mail-wm1-x331.google.com (mail-wm1-x331.google.com\n\t[IPv6:2a00:1450:4864:20::331])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 91FEE62010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 16:26:38 +0200 (CEST)","by mail-wm1-x331.google.com with SMTP id\n\t5b1f17b1804b1-488ba840146so55533415e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 07:26:38 -0700 (PDT)","from lotus.home\n\t(dynamic-2a00-1028-8388-1986-846d-8679-d49f-e84f.ipv6.o2.cz.\n\t[2a00:1028:8388:1986:846d:8679:d49f:e84f])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-488eddb9751sm91450435e9.0.2026.04.14.07.26.37\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 14 Apr 2026 07:26:37 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=pollen-robotics-com.20251104.gappssmtp.com\n\theader.i=@pollen-robotics-com.20251104.gappssmtp.com\n\theader.b=\"T7za2bS5\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=pollen-robotics-com.20251104.gappssmtp.com; s=20251104; t=1776176798;\n\tx=1776781598; darn=lists.libcamera.org; \n\th=mime-version:user-agent:references:in-reply-to:date:cc:to:from\n\t:subject:message-id:from:to:cc:subject:date:message-id:reply-to;\n\tbh=Mvvj8i5dQhoeYD4m2cRlDDltfGstkViPfTFeZUXCo50=;\n\tb=T7za2bS5FGQgq2NjSyMvvqiaLt3WTa2YBB+2StzDsQKTYiGodykc+1auuXzo315qEV\n\tm8wde2wMXUKWPlqwCA2C/8THUS7d/4rFi57QSnYT7Ic7MSd/Tpz0o7iPt/wlA0naKoNo\n\tGTJT9gd7eN5cuNJV50oqLM7X3eVa78fb9FdGn5yX9fDDiWzjiZOCGtLzQent0uOIRVkJ\n\t14F7GMg+m3GIYveVt3JmTw0P1lgXDZWtLmo1nzmgrsaEgNcKZBKwtCa7O4XWViL0pyIX\n\troGfrDPLsApEhZnUZLKXTG5/NUHs/62Dv4JAmOEtcLQRT5z70wpJQIWOQgtv0xyuoY3I\n\tN4vA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1776176798; x=1776781598;\n\th=mime-version:user-agent:references:in-reply-to:date:cc:to:from\n\t:subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=Mvvj8i5dQhoeYD4m2cRlDDltfGstkViPfTFeZUXCo50=;\n\tb=g6Cb/A+gF6JsdieesolyY1jVxhjMKDakRb9XMJruEJGCDJs2Xt8JVIpDuhuEDPD2pJ\n\tGqSP+0wDhFjZezQZVy2zK5/LmzwuRGkHa7u1lq+9Rgv7bXwGJxA5Vyt3fYIp3A61EUPB\n\tWnL57GL1fNyDtMityBanG8Tjufe6HHww6JXlxKxhqDs2rsFw+tgpfcUsJ6u7TphVGq23\n\tMxgi4G6Y8QRfi3mFdawemINqgmGct4kXmpOGk/LoIZR1P3aiQ7rXVEa2t74L/2i5pXJP\n\twu12M2Ms/jIQXt5zAlqs/nMcb1FxtxTyV1dSRT6myzPgPb3xwPxogU6g49Na22118Nis\n\tleUQ==","X-Gm-Message-State":"AOJu0Yxj2Pqr6ay3lZAvIjTlxpJ7nZqk0VlfbgkpUu/Wl/zOfx4XKCHL\n\tNmYhrKils0zTnuwlCUengNUFQMP5iOuS2OfLcFFLm9mjU36wDh6rb/L2tUvGhpOHHlI=","X-Gm-Gg":"AeBDies6w77IfGGjIkFpKQwLxiyM91O3YHS/bwuPT89ddw/FYQa3ifWW/EZLJQC8JeR\n\tW9i70aeUNYUmAwvekjEEPv9jsYS3SN1M+h2taCkVxJGp09yswZAUXz43Yjpz9KV7qzbgD5lTJZA\n\tQ8WA+YCXs4r8h9+CZLUpRTwN8PuP28wGcNWMGVC0Q8+bmXLTuu2Lo5e15m9+ML4O5DP5QKkC6Rn\n\tm8OT2MUsHqhyXiLI6PGhp1dQ8Tyo8t4vwYNNW60GX9d8d9ZQSTTjJHLrkRdUKXE3g3ORO+/Lv9b\n\tFjWr6Qq8KnfooqOkyYx7bu3DjYSUaXmvy1tOYar9IyCRIleARRRFixU6WljyqHDHLbfIMkl7NUm\n\tcMbxLSiC8W1eboQviNQDnf3AD0zBg8LL/0I2Gmeg8k2sP71wfny5ZtaOxjoFVFijQWdp9mdm+Kd\n\tYlF5IDCyMCxO/B8Z19Ak024PTE3qHmRDAyjENAVUimf9hdhTmg1+p2tDiMzdHkng5WWWC/BVJGm\n\tc5BRf4KLnF0YKvvsJuNNoJBxaYNGX4TRROSmnpcRJULbk+lAUU=","X-Received":"by 2002:a05:600c:19d1:b0:488:c282:e77e with SMTP id\n\t5b1f17b1804b1-488d688608emr224454965e9.28.1776176797841; \n\tTue, 14 Apr 2026 07:26:37 -0700 (PDT)","Message-ID":"<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","From":"Fabien Danieau <fabien.danieau@pollen-robotics.com>","To":"David Plowman <david.plowman@raspberrypi.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Date":"Tue, 14 Apr 2026 16:26:36 +0200","In-Reply-To":"<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>\n\t<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>","Content-Type":"multipart/alternative; boundary=\"=-lYMYSNz339KkisJcuh5Q\"","User-Agent":"Evolution 3.56.2-0+deb13u1 ","MIME-Version":"1.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":38612,"web_url":"https://patchwork.libcamera.org/comment/38612/","msgid":"<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>","date":"2026-04-14T15:20:47","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Fabien\n\nThanks for the information. Yes, I think is the expected - intended,\neven - behaviour:\n\nCase 1: If you explicitly ask for the 2304x1296 mode, then you can't\nhave 60fps - it just won't go that fast!\n\nCase 2: If you don't use the sensor-config you're at the mercy of the\nauto mode selection, but which continues to do what it did before,\ngiving you the cropped mode with the fast framerate.\n\nCase 3: Exactly so, the 2304x1296 mode goes up to 56fps but no more!\n\nI think the moral of the story has always been that anyone who cares\nstrongly about the sensor mode should really consider saying exactly\nwhat sensor-config they want (just as with the C++ API).\n\nThanks\nDavid\n\nOn Tue, 14 Apr 2026 at 15:26, Fabien Danieau\n<fabien.danieau@pollen-robotics.com> wrote:\n>\n> Hi all,\n>\n> Just a quick note on the tests with new high fps.\n>\n> This doesn't work:\n> gst-launch-1.0 -e libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n>\n> while this does:\n> gst-launch-1.0 -e libcamerasrc ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n>\n> and going up to 56fps also works:\n> gst-launch-1.0 -e libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=56/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n>\n> Best,\n>\n> Fabien\n>\n> On Fri, 2026-04-10 at 10:23 +0100, David Plowman wrote:\n>\n> Hi Laurent\n>\n> On Thu, 9 Apr 2026 at 17:36, Laurent Pinchart\n> <laurent.pinchart@ideasonboard.com> wrote:\n>\n>\n> Hello Fabien,\n>\n> On Thu, Apr 09, 2026 at 05:37:25PM +0200, Fabien Danieau wrote:\n>\n> Tested on a Raspberry Pi 4 with Camera Module 3.\n>\n> Without the patch, requesting a 1280x720 output results in a cropped\n> field of view, as the pipeline handler selects a cropped sensor mode.\n> With the patch, specifying\n> sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> correctly forces the full sensor mode and preserves the full field of\n> view at 1280x720 output.\n>\n>\n> Thank you for testing.\n>\n>\n> Yes, thanks for doing that, Fabien!\n>\n>\n> While configuring the sensor from GStreamer is a needed feature, it\n> sounds like there's also another issue somewhere. By default, libcamera\n> should not select a sensor configuration that will restrict the field of\n> view (at least not in both directions, if the requested aspect ratio\n> differs from the native aspect ratio, cropping in one direction is\n> expected), if not requested explicitly by the application.\n>\n> David, any comment on this ?\n>\n>\n> Yes, fair question!\n>\n> So the short answer (for those without the stamina to wade through the\n> rest of the discussion!!) is that, on the Pi at least, you have no\n> guarantees what the auto selection will choose. The only way to be\n> sure of the outcome is to specify the SensorConfiguration correctly.\n>\n> The slightly longer answer is that our auto selection predates the\n> existence of the SensorConfiguration, so we made it possible for users\n> to get cropped modes with fast framerates (even where the aspect ratio\n> matches the full sensor resolution). The mechanism for that was by\n> choosing modes \"closer\" in resolution to the requested output\n> resolution; there wasn't really any other way. The case in point is\n> the 1536x864 120fps mode of the imx708 (full resolution 4608x2592). so\n> asking for an output \"close\" to 1536x864 would give you this mode.\n>\n> Of course, you immediately get into questions of \"how close\" should\n> the resolutions be? \"How similar\" should aspect ratios be, how to\n> trade one against the other, and so on, leading us to (I won't deny\n> it!) a slightly unholy mixture of heuristics and fudge factors.\n>\n> This all just reiterates why the SensorConfiguration is necessary, but\n> also leaves us in a position where it's hard to know what to do with\n> the auto selection. To be honest, I didn't even know about any rules\n> for the default behaviour but I think some of our users would be quite\n> irate if we changed anything that they've (for good or ill) come to\n> rely on, so we're probably stuck where we are.\n>\n> I guess that's all largely orthogonal to the actual patch at hand, but\n> hopefully it does explain the situation at least a little bit...\n>\n> Thanks (and congrats if you made it to the bottom!)\n>\n> David\n>\n>\n> Test pipeline:\n>\n> gst-launch-1.0 -e libcamerasrc \\\n>   sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! \\\n>   capsfilter caps=video/x-raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n>   queue ! jpegenc ! avimux ! filesink location=output.avi\n>\n> Tested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>\n>\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","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 B8812C32BB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Apr 2026 15:21:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CE63562E98;\n\tTue, 14 Apr 2026 17:21:01 +0200 (CEST)","from mail-ej1-x62e.google.com (mail-ej1-x62e.google.com\n\t[IPv6:2a00:1450:4864:20::62e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8927C62010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 17:21:00 +0200 (CEST)","by mail-ej1-x62e.google.com with SMTP id\n\ta640c23a62f3a-b97f9587e6eso794612966b.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 08:21:00 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"gHC2obaJ\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1776180060; cv=none;\n\td=google.com; s=arc-20240605;\n\tb=bbXwwCkT1HrjAScC+UWEv24vZ8oxhr7oeYNUE0nKRUTDrmr7/j+13Yz9S8fQhrNTr2\n\thrnZaM4V1+YgX71sJEx68+gCfMwDYUTguW4b0Zzx5dc2wNFevdFfum4Q/228TRF01CpW\n\tm6P2VngyQf1wLxQZUSyMefSKGn9zDre+322yEInPgEnlCwAhOjqPtzREBLRa/bv2O9+D\n\tKq7W+ZHmrvFqH9hCz4/ef45sUhSK23Z1qEzLsh/T5hDt0gavdjkX6mQCsdRqa4LMiqTw\n\toFxNJREdM9BnhzeS27KPqvQwUL9ZUue7+v5F5fHNehWzTwDhTgc5xgFwUFN7VMClyaOi\n\tmgkg==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n\ts=arc-20240605; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:dkim-signature;\n\tbh=a99eKPHv2pLaRRdO1RPf+f7SBRqgwpYb9vJtrptpXCA=;\n\tfh=pFwSo7t24EYO9alev8CAh2HETNuPaWgzGKgEjdRYJ38=;\n\tb=Gp/DMLM/5rwCwmRESgWVu0lg8Xk7bjh1AgBATU5GSTBUwbGMgrdxKzsEjpXe3RMM41\n\thw1vY+KJUxgVJbZc2ijkLM0Mbp5tWPqiUWAsQcUyG7khnU1vtv/+e5UwHDFXQ3ebCu/9\n\tqQvN82E2P09rGKlvE08sbAnIvw+dVyH8ZUnFKpbC7KtakMYQcXjw5hECeJLwrYNSH11V\n\tCId++F1XAPu7SjbdGkAVnG+imYCPEjvnnM7ljTb0SdR5sj9E65sDrxkJmf4FLz1SAJeX\n\t8JjRjV8xfhMkhKuIRdmMsGeqnqSTwCCWn9aRJSklSqeZx7zVioNKQGKjthzVmiIejg5A\n\tzf1w==; darn=lists.libcamera.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1776180060; x=1776784860;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=a99eKPHv2pLaRRdO1RPf+f7SBRqgwpYb9vJtrptpXCA=;\n\tb=gHC2obaJkc9LxIStOuuZnac7GKRP9KsFp/JEwhu7DI3d2oY/8puPbhEzx6nNTDlRtl\n\t9iou0OVcL9+rxik8PEs51t0ejW2Rf9guTIUELdL4C+lKAZZOo065wLIQYks3M/QKQUCr\n\t+05f1C9+0z7kIgg2rA4SIa1WAWU8HXhF6WPGIeYyAfokvm8j419tPTfjNKL3paAB3UV5\n\tWX6MjDLR7ToHP0mCUAuLjNwgKTszFAIfO7N3GsrJjZDEr3vidRMFRWznOGK+I+7ZsMRQ\n\tqzaEeK7HSUMaDHwh/It2T6tp9AfymhfHQq8pLaDBURhF/JVzWc1xTmzbpWVLQIn9QZrY\n\t1g/A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1776180060; x=1776784860;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=a99eKPHv2pLaRRdO1RPf+f7SBRqgwpYb9vJtrptpXCA=;\n\tb=EW7o0Uggxj5CePWFbhU0WSO7J3RfqzGXEV4p6AfqTeqt0ENXUUwWD1og4YZWG3XeCI\n\tS715CQjW73Q8KEA+ktdQSW02MqllPASwl+7+p7h4bDjMQN2FLeRTohG3ZprDhxKcJoim\n\tKsIHg7O1MNGkpIVH2C+UZ4QVoyEzII0ITZi5odsfAAotQGelpqMI3r9zusUjBCUqOJqC\n\tqpMEkb+UY5Xn8f5Bqg9LCLfSdDZcJ/4RHOQPo+lvhmoMMbgP0VXsxBVyItATlhmEazzd\n\thWN9FvZI9IwX4CJmU1FRzKN4GnGdeE1dHFqNbXQP1xIflwdPWXpUJwzAXhwjThKNT4PL\n\tBI1g==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ9g3t20Gqd8mMf53Ks58vHLGM/26xZnGpUH/2aIS6z0Iim+jxBTrD/4IF2erh4jZe7ig2NPvlQYoPkieQfgCPU=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YxPOYn6h31LfxNcYo352A4ysZJO4f5ElRj0H39HILYm8/hlap+N\n\tHm9keI2gcQUX6S4uT5Z14BgrN4AKkdoQSA9BJ//9b7yxWcK3HMPdvVCfjVtG7uF6BkfS6M0v6UK\n\th2OqHUlK/rCUMJHlS44GD0fkSeGmGXE3XmUktpB6JSp7XysGIgTf/","X-Gm-Gg":"AeBDiesHNLo0ddlqhgWj3jEoy9pMKKCXqu3fC0KuWa4kwdgmBjxDhgorGmnxUO2whPM\n\t1/pEaqd9V+xATDMiDwrmedsmr5HJuFIsXPBVLkTQjo6HzYQ0QiqTVHqLsBff2zU+XjpJLzdVylN\n\t92b2o5A8xOPKD3MBGwaM0S+3A/OvwqN9IsrTqzGUu1VbpZoJGLGnhQgugHqRotxm5KPlqYuTLwB\n\tuqXOHkn2pFPN1NSDH/fi1GqeDGLiJGcp/FR4pDi7LmVS4i4FSB0nRnc+CLIyGm31R43XI3Mcd8D\n\t8lbEg27XqZRZkArSBXxCkY3lFbF639FXjJmvbjfp13lwMlCmkdnORRdSMjkbTdMotoqxTBHy9AX\n\t50jNpNhulyErHSUOvhmekvCoybR01YqGFsA==","X-Received":"by 2002:a17:907:e110:b0:b97:8503:8313 with SMTP id\n\ta640c23a62f3a-b9d727aa2a5mr702258666b.27.1776180059839;\n\tTue, 14 Apr 2026 08:20:59 -0700 (PDT)","MIME-Version":"1.0","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>\n\t<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>\n\t<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>","In-Reply-To":"<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Tue, 14 Apr 2026 16:20:47 +0100","X-Gm-Features":"AQROBzARXasx0yNQRmFJ2uRiTOlmFiCChg8RA-LCoL86JA0f2kF-CA3HYXm-cFQ","Message-ID":"<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","To":"Fabien Danieau <fabien.danieau@pollen-robotics.com>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","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":38613,"web_url":"https://patchwork.libcamera.org/comment/38613/","msgid":"<177618727758.102801.7357081723310699508@ping.linuxembedded.co.uk>","date":"2026-04-14T17:21:17","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting David Plowman (2026-04-14 16:20:47)\n> Hi Fabien\n> \n> Thanks for the information. Yes, I think is the expected - intended,\n> even - behaviour:\n> \n> Case 1: If you explicitly ask for the 2304x1296 mode, then you can't\n> have 60fps - it just won't go that fast!\n> \n> Case 2: If you don't use the sensor-config you're at the mercy of the\n> auto mode selection, but which continues to do what it did before,\n> giving you the cropped mode with the fast framerate.\n> \n> Case 3: Exactly so, the 2304x1296 mode goes up to 56fps but no more!\n> \n> I think the moral of the story has always been that anyone who cares\n> strongly about the sensor mode should really consider saying exactly\n> what sensor-config they want (just as with the C++ API).\n\nI know it's a long running/desired action, but still some how I think we\nshould really find a good way to convey the capabilities to the users.\n\nI really like what the raspi-cam --list gives:\n\n│ 0 : imx258 [4208x3120 10-bit RGGB]\n│ (/base/axi/pcie@120000/rp1/i2c@88000/imx258@10)\n│     Modes: 'SRGGB10_CSI2P' : 1048x780 [56.85 fps - (0, 0)/4208x3120 crop]\n│                              2104x1560 [30.14 fps - (0, 0)/4208x3120 crop]\n│                              4208x3120 [15.08 fps - (0, 0)/4208x3120 crop]\n\nBut we have to do a configuration dance to 'test' the camera driver\ncapabilities. Would be great to be able to avoid that.\n\nAnd of course when a camera driver can be freely configured for cropping\nand binning, the combinations just increase here...\n\n\nUltimately ... is this patch good to merge? It seems like it could be\ngood to go?\n\nI see two RB tags anyway....\n\n\n--\nKieran\n\n\n> \n> Thanks\n> David\n> \n> On Tue, 14 Apr 2026 at 15:26, Fabien Danieau\n> <fabien.danieau@pollen-robotics.com> wrote:\n> >\n> > Hi all,\n> >\n> > Just a quick note on the tests with new high fps.\n> >\n> > This doesn't work:\n> > gst-launch-1.0 -e libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n> >\n> > while this does:\n> > gst-launch-1.0 -e libcamerasrc ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=60/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n> >\n> > and going up to 56fps also works:\n> > gst-launch-1.0 -e libcamerasrc sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! capsfilter caps=video/x-raw,width=1280,height=720,framerate=56/1 ! queue ! jpegenc ! avimux ! filesink location=output.avi\n> >\n> > Best,\n> >\n> > Fabien\n> >\n> > On Fri, 2026-04-10 at 10:23 +0100, David Plowman wrote:\n> >\n> > Hi Laurent\n> >\n> > On Thu, 9 Apr 2026 at 17:36, Laurent Pinchart\n> > <laurent.pinchart@ideasonboard.com> wrote:\n> >\n> >\n> > Hello Fabien,\n> >\n> > On Thu, Apr 09, 2026 at 05:37:25PM +0200, Fabien Danieau wrote:\n> >\n> > Tested on a Raspberry Pi 4 with Camera Module 3.\n> >\n> > Without the patch, requesting a 1280x720 output results in a cropped\n> > field of view, as the pipeline handler selects a cropped sensor mode.\n> > With the patch, specifying\n> > sensor-config=\"sensor/config,width=2304,height=1296,depth=10\"\n> > correctly forces the full sensor mode and preserves the full field of\n> > view at 1280x720 output.\n> >\n> >\n> > Thank you for testing.\n> >\n> >\n> > Yes, thanks for doing that, Fabien!\n> >\n> >\n> > While configuring the sensor from GStreamer is a needed feature, it\n> > sounds like there's also another issue somewhere. By default, libcamera\n> > should not select a sensor configuration that will restrict the field of\n> > view (at least not in both directions, if the requested aspect ratio\n> > differs from the native aspect ratio, cropping in one direction is\n> > expected), if not requested explicitly by the application.\n> >\n> > David, any comment on this ?\n> >\n> >\n> > Yes, fair question!\n> >\n> > So the short answer (for those without the stamina to wade through the\n> > rest of the discussion!!) is that, on the Pi at least, you have no\n> > guarantees what the auto selection will choose. The only way to be\n> > sure of the outcome is to specify the SensorConfiguration correctly.\n> >\n> > The slightly longer answer is that our auto selection predates the\n> > existence of the SensorConfiguration, so we made it possible for users\n> > to get cropped modes with fast framerates (even where the aspect ratio\n> > matches the full sensor resolution). The mechanism for that was by\n> > choosing modes \"closer\" in resolution to the requested output\n> > resolution; there wasn't really any other way. The case in point is\n> > the 1536x864 120fps mode of the imx708 (full resolution 4608x2592). so\n> > asking for an output \"close\" to 1536x864 would give you this mode.\n> >\n> > Of course, you immediately get into questions of \"how close\" should\n> > the resolutions be? \"How similar\" should aspect ratios be, how to\n> > trade one against the other, and so on, leading us to (I won't deny\n> > it!) a slightly unholy mixture of heuristics and fudge factors.\n> >\n> > This all just reiterates why the SensorConfiguration is necessary, but\n> > also leaves us in a position where it's hard to know what to do with\n> > the auto selection. To be honest, I didn't even know about any rules\n> > for the default behaviour but I think some of our users would be quite\n> > irate if we changed anything that they've (for good or ill) come to\n> > rely on, so we're probably stuck where we are.\n> >\n> > I guess that's all largely orthogonal to the actual patch at hand, but\n> > hopefully it does explain the situation at least a little bit...\n> >\n> > Thanks (and congrats if you made it to the bottom!)\n> >\n> > David\n> >\n> >\n> > Test pipeline:\n> >\n> > gst-launch-1.0 -e libcamerasrc \\\n> >   sensor-config=\"sensor/config,width=2304,height=1296,depth=10\" ! \\\n> >   capsfilter caps=video/x-raw,width=1280,height=720,framerate=30/1,format=I420 ! \\\n> >   queue ! jpegenc ! avimux ! filesink location=output.avi\n> >\n> > Tested-by: Fabien Danieau <fabien.danieau@pollen-robotics.com>\n> >\n> >\n> > --\n> > Regards,\n> >\n> > Laurent Pinchart","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 03B5FBDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Apr 2026 17:21:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0C0BE62E9A;\n\tTue, 14 Apr 2026 19:21:22 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8E29A62010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 19:21:20 +0200 (CEST)","from monstersaurus.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A9D25149B;\n\tTue, 14 Apr 2026 19:19:47 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"TxBwq98U\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1776187187;\n\tbh=tC9MeQ1Va63UOftimjrfFgm1CPiT1aUU3hJJO/Om7Ek=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=TxBwq98UotT3rltm1iNw2SzDr2RW5GzUlKciPjgXI6l7r54yngLjKUgLcByrscaZA\n\tOjK2DlklkYgMDrYQFGnpX4pRXTF7oWF9THAK6HVXhrOgS2rTiktlSyc4OIbMJD1vGR\n\t/5bveXckE2R6t8WK/zCzZO7CKP2SQQbL6EZ5AWCc=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>\n\t<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>\n\t<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>\n\t<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","To":"David Plowman <david.plowman@raspberrypi.com>,\n\tFabien Danieau <fabien.danieau@pollen-robotics.com>","Date":"Tue, 14 Apr 2026 18:21:17 +0100","Message-ID":"<177618727758.102801.7357081723310699508@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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":38614,"web_url":"https://patchwork.libcamera.org/comment/38614/","msgid":"<18136481a7507856901a158fb2b2725cf78f805e.camel@ndufresne.ca>","date":"2026-04-14T23:30:27","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Hi Kieran,\n\nLe mardi 14 avril 2026 à 18:21 +0100, Kieran Bingham a écrit :\n> Quoting David Plowman (2026-04-14 16:20:47)\n> > Hi Fabien\n> > \n> > Thanks for the information. Yes, I think is the expected - intended,\n> > even - behaviour:\n> > \n> > Case 1: If you explicitly ask for the 2304x1296 mode, then you can't\n> > have 60fps - it just won't go that fast!\n> > \n> > Case 2: If you don't use the sensor-config you're at the mercy of the\n> > auto mode selection, but which continues to do what it did before,\n> > giving you the cropped mode with the fast framerate.\n> > \n> > Case 3: Exactly so, the 2304x1296 mode goes up to 56fps but no more!\n> > \n> > I think the moral of the story has always been that anyone who cares\n> > strongly about the sensor mode should really consider saying exactly\n> > what sensor-config they want (just as with the C++ API).\n> \n> I know it's a long running/desired action, but still some how I think we\n> should really find a good way to convey the capabilities to the users.\n> \n> I really like what the raspi-cam --list gives:\n> \n> │ 0 : imx258 [4208x3120 10-bit RGGB]\n> │ (/base/axi/pcie@120000/rp1/i2c@88000/imx258@10)\n> │     Modes: 'SRGGB10_CSI2P' : 1048x780 [56.85 fps - (0, 0)/4208x3120 crop]\n> │                              2104x1560 [30.14 fps - (0, 0)/4208x3120 crop]\n> │                              4208x3120 [15.08 fps - (0, 0)/4208x3120 crop]\n> \n> But we have to do a configuration dance to 'test' the camera driver\n> capabilities. Would be great to be able to avoid that.\n> \n> And of course when a camera driver can be freely configured for cropping\n> and binning, the combinations just increase here...\n\nI really like it to, but the dance was also very expensive and slow, and the\nsubset was artificial. The only way I can think of, would be to provide a list\nof \"well known modes\" with the matching sensor configuration to achieve that.\nBut then, where do you maintain that list is something to think of, and how big\nthat list will be, what kind of rules we'd have. Seems like a project in itself.\nUVC camera do pretty much that in their descriptor, but also offers nothing else\nusually. This on libcamera would defeat the point of giving wider access to the\ncameras.\n\n> Ultimately ... is this patch good to merge? It seems like it could be\n> good to go?\n> \n> I see two RB tags anyway....\n\nFor me it is, there was discussion around the optional parameters, and while\nvalid question, no bug or violation of the API was found.\n\ncheers,\nNicolas","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 61E03C32BB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Apr 2026 23:30:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 14C7862EA9;\n\tWed, 15 Apr 2026 01:30:35 +0200 (CEST)","from mail-qk1-x72a.google.com (mail-qk1-x72a.google.com\n\t[IPv6:2607:f8b0:4864:20::72a])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 855FC6271A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 15 Apr 2026 01:30:32 +0200 (CEST)","by mail-qk1-x72a.google.com with SMTP id\n\taf79cd13be357-8cfc2d1fdbfso468970085a.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Apr 2026 16:30:32 -0700 (PDT)","from ?IPv6:2606:6d00:15:e06b::5ac? ([2606:6d00:15:e06b::5ac])\n\tby smtp.gmail.com with ESMTPSA id\n\t6a1803df08f44-8ac8449e664sm129981336d6.0.2026.04.14.16.30.29\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 14 Apr 2026 16:30:29 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=ndufresne-ca.20251104.gappssmtp.com\n\theader.i=@ndufresne-ca.20251104.gappssmtp.com\n\theader.b=\"Ww6dFaa6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20251104.gappssmtp.com; s=20251104; t=1776209431;\n\tx=1776814231; darn=lists.libcamera.org; \n\th=mime-version:user-agent:autocrypt:references:in-reply-to:date:cc:to\n\t:from:subject:message-id:from:to:cc:subject:date:message-id:reply-to; \n\tbh=yG9O5Az6RS6TkHqjFCmPoxqRj77auZC7vZP7MPMGXTU=;\n\tb=Ww6dFaa6oIpFOPcxQWRHhXzsOFii1/iSSuIR2qkeH20czm4bCS6DK8ASXcZ3qDUlEE\n\t3peazMtHOwDQ62TpxU8M8ymkdWA2eIWam65rtSYBR4VwoQ9DgRWUD/J7C8aGh2mD6Lyn\n\t7O+q7pgbk4mDHLDHo7l7pMZ/gwS1mES54uSCnMvVaDi8vqDNPUJTLKGCDs0Qd1+xvUB3\n\tz5+91CcgDplOgKSJx4HQOcUy1zE59B+clkZ+q9ufiZtH1UVXhpOTFKMTW28Uqwh1NkZY\n\tM3YlBKIpEuHW+O0hWWMLDujLmENNC55EQnt4JX2qH5JbLB55FPIxutY2WrHoW4gaMu7C\n\ttzgg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1776209431; x=1776814231;\n\th=mime-version:user-agent:autocrypt:references:in-reply-to:date:cc:to\n\t:from:subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=yG9O5Az6RS6TkHqjFCmPoxqRj77auZC7vZP7MPMGXTU=;\n\tb=pbKl+VTU0A0vTMs5fV0LTB7viMu8Xw7q/u498W3ln6W0E/0c51o1X07kBKxRjk/oSU\n\tMznaQbWKJeJO4Q3s+fu8oMIsb/4zOgmjAYIG6yYG/mwGCYDptDntPpd5u9csgx6d9bUS\n\tTmF+QjgtVV8XK+c6Ezp5dpuB1JnMCy5S0YvOoirOXB4f8TQSShluZUbFpU37VD/ukWVY\n\t6y+D7xFArUdioIkddT0i6FmSFtwCSpTiZhVky19dhfCRgqRXYW9tPzgO4RcfXP5BxNXZ\n\toIBphe/6vBZzAZwQ3ecnh6Ol+EhGnfQqyTGGQ7PYxIKNtiZmnC/a/3cCqtMMjr1XrpJR\n\tiMnw==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ+UDRafjeZgYtKmn8gR3CkKtDL6S0wKfNzypI9pHd0sMq8OBhnFdNJ6b0xug214L0hdBV3vcmqfNYTBls2OV5M=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YzXLdcUkcNaCgoB9v7Fj461yYgUjGOoc9Yhd1fiTJnhabOZoqEg\n\tPH/oofcXKMnQNUT1824Qxclmr82Hqm8ud3cFcAionMWjwAAqw39VZhxxublSz53aHqpEV0eE+Na\n\tjZW5H","X-Gm-Gg":"AeBDiev/Utpdo/CY6+Mc8SDkJoC70gwGRVJ6mgk6+jfpj+v4B5sDLvgoBdW2h3tsGZR\n\tKfXqsWpaJQEtUxjLzW0yn6sYCoN1nZGj6cJlpLuxi9hUtKCfmL1rPHxlEc5rqif1GsaMXhhWoXR\n\twrKRFHe2bLDtBPveglsgRmihAnZUKA9Neex/Gp5KX9fasplH851nJgqpy0NZd/DZCL1Os8Fxm2q\n\tOXbBIRVOLd1m3IV1uvDfFZIK5P9Em0J4KLosWLxgT5IvGlOx++C2DlTUiicfDvjbmcg+t0/U9EM\n\tVyCwhrnLcMYhAT/uulpIlbcjD71X7ciHMjNmpoCZrrc1f9VUraI5VIIqIhZV281VIn8c3OLkP+3\n\t7oHrAIZckKyJxgBvVF2AZu0kTgOkOag/OENCRSfxovURTzyZP1TikDovXCJgQexI2JW+vjCMFMl\n\t9GkpAn12wrKhWz5VSx//NdMu4jmyB/HZW4yEIun3w=","X-Received":"by 2002:a05:6214:5a07:b0:89f:4a69:4498 with SMTP id\n\t6a1803df08f44-8ac861caaedmr296092186d6.25.1776209431038; \n\tTue, 14 Apr 2026 16:30:31 -0700 (PDT)","Message-ID":"<18136481a7507856901a158fb2b2725cf78f805e.camel@ndufresne.ca>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","From":"Nicolas Dufresne <nicolas@ndufresne.ca>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>, David Plowman\n\t<david.plowman@raspberrypi.com>, Fabien Danieau\n\t<fabien.danieau@pollen-robotics.com>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 14 Apr 2026 19:30:27 -0400","In-Reply-To":"<177618727758.102801.7357081723310699508@ping.linuxembedded.co.uk>","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>\n\t<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>\n\t<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>\n\t<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>\n\t<177618727758.102801.7357081723310699508@ping.linuxembedded.co.uk>","Autocrypt":"addr=nicolas@ndufresne.ca; prefer-encrypt=mutual;\n\tkeydata=mDMEaCN2ixYJKwYBBAHaRw8BAQdAM0EHepTful3JOIzcPv6ekHOenE1u0vDG1gdHFrChD\n\t/e0J05pY29sYXMgRHVmcmVzbmUgPG5pY29sYXNAbmR1ZnJlc25lLmNhPoicBBMWCgBEAhsDBQsJCA\n\tcCAiICBhUKCQgLAgQWAgMBAh4HAheABQkJZfd1FiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrjo\n\tCGQEACgkQ2UGUUSlgcvQlQwD/RjpU1SZYcKG6pnfnQ8ivgtTkGDRUJ8gP3fK7+XUjRNIA/iXfhXMN\n\tabIWxO2oCXKf3TdD7aQ4070KO6zSxIcxgNQFtDFOaWNvbGFzIER1ZnJlc25lIDxuaWNvbGFzLmR1Z\n\tnJlc25lQGNvbGxhYm9yYS5jb20+iJkEExYKAEECGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4\n\tAWIQTvDVKBFcTDwhoEbxLZQZRRKWBy9AUCaCyyxgUJCWX3dQAKCRDZQZRRKWBy9ARJAP96pFmLffZ\n\tsmBUpkyVBfFAf+zq6BJt769R0al3kHvUKdgD9G7KAHuioxD2v6SX7idpIazjzx8b8rfzwTWyOQWHC\n\tAAS0LU5pY29sYXMgRHVmcmVzbmUgPG5pY29sYXMuZHVmcmVzbmVAZ21haWwuY29tPoiZBBMWCgBBF\n\tiEE7w1SgRXEw8IaBG8S2UGUUSlgcvQFAmibrGYCGwMFCQll93UFCwkIBwICIgIGFQoJCAsCBBYCAw\n\tECHgcCF4AACgkQ2UGUUSlgcvRObgD/YnQjfi4+L8f4fI7p1pPMTwRTcaRdy6aqkKEmKsCArzQBAK8\n\tbRLv9QjuqsE6oQZra/RB4widZPvphs78H0P6NmpIJ","Content-Type":"multipart/signed; micalg=\"pgp-sha512\";\n\tprotocol=\"application/pgp-signature\";\n\tboundary=\"=-dfCHBl4vvPU7HOHilbCI\"","User-Agent":"Evolution 3.58.3 (3.58.3-1.fc43) ","MIME-Version":"1.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":38624,"web_url":"https://patchwork.libcamera.org/comment/38624/","msgid":"<CAHW6GYJHkZ1=2Sa-J2UaVsCm1EAYVm4MiOUiK27E9wwkoYrUvw@mail.gmail.com>","date":"2026-04-17T07:35:12","subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi again\n\nYes, it's certainly a thumbs up from me for merging this. I think as\nit stands it captures the intention (as it currently stands) and\npractice of the SensorConfiguration class pretty much directly.\n\nThis is probably the single biggest reason that I caution users about\nusing libcamera through gstreamer - because I know that when they\ncan't get the output resolution they want in the camera mode they\nwant, they're going to start complaining at me and it will all be my\nfault. So it would be great finally to lance this boil, perhaps even\nfor the upcoming release? (Pretty please??)\n\nThanks\nDavid\n\nOn Wed, 15 Apr 2026 at 00:30, Nicolas Dufresne <nicolas@ndufresne.ca> wrote:\n>\n> Hi Kieran,\n>\n> Le mardi 14 avril 2026 à 18:21 +0100, Kieran Bingham a écrit :\n> > Quoting David Plowman (2026-04-14 16:20:47)\n> > > Hi Fabien\n> > >\n> > > Thanks for the information. Yes, I think is the expected - intended,\n> > > even - behaviour:\n> > >\n> > > Case 1: If you explicitly ask for the 2304x1296 mode, then you can't\n> > > have 60fps - it just won't go that fast!\n> > >\n> > > Case 2: If you don't use the sensor-config you're at the mercy of the\n> > > auto mode selection, but which continues to do what it did before,\n> > > giving you the cropped mode with the fast framerate.\n> > >\n> > > Case 3: Exactly so, the 2304x1296 mode goes up to 56fps but no more!\n> > >\n> > > I think the moral of the story has always been that anyone who cares\n> > > strongly about the sensor mode should really consider saying exactly\n> > > what sensor-config they want (just as with the C++ API).\n> >\n> > I know it's a long running/desired action, but still some how I think we\n> > should really find a good way to convey the capabilities to the users.\n> >\n> > I really like what the raspi-cam --list gives:\n> >\n> > │ 0 : imx258 [4208x3120 10-bit RGGB]\n> > │ (/base/axi/pcie@120000/rp1/i2c@88000/imx258@10)\n> > │     Modes: 'SRGGB10_CSI2P' : 1048x780 [56.85 fps - (0, 0)/4208x3120 crop]\n> > │                              2104x1560 [30.14 fps - (0, 0)/4208x3120 crop]\n> > │                              4208x3120 [15.08 fps - (0, 0)/4208x3120 crop]\n> >\n> > But we have to do a configuration dance to 'test' the camera driver\n> > capabilities. Would be great to be able to avoid that.\n> >\n> > And of course when a camera driver can be freely configured for cropping\n> > and binning, the combinations just increase here...\n>\n> I really like it to, but the dance was also very expensive and slow, and the\n> subset was artificial. The only way I can think of, would be to provide a list\n> of \"well known modes\" with the matching sensor configuration to achieve that.\n> But then, where do you maintain that list is something to think of, and how big\n> that list will be, what kind of rules we'd have. Seems like a project in itself.\n> UVC camera do pretty much that in their descriptor, but also offers nothing else\n> usually. This on libcamera would defeat the point of giving wider access to the\n> cameras.\n>\n> > Ultimately ... is this patch good to merge? It seems like it could be\n> > good to go?\n> >\n> > I see two RB tags anyway....\n>\n> For me it is, there was discussion around the optional parameters, and while\n> valid question, no bug or violation of the API was found.\n>\n> cheers,\n> Nicolas","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 63962C324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 17 Apr 2026 07:35:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 65EE462EC4;\n\tFri, 17 Apr 2026 09:35:25 +0200 (CEST)","from mail-ed1-x532.google.com (mail-ed1-x532.google.com\n\t[IPv6:2a00:1450:4864:20::532])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9291B62CE6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Apr 2026 09:35:23 +0200 (CEST)","by mail-ed1-x532.google.com with SMTP id\n\t4fb4d7f45d1cf-6714f678bdaso573974a12.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Apr 2026 00:35:23 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"Kecz3U+M\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1776411323; cv=none;\n\td=google.com; s=arc-20240605;\n\tb=dKZBMI9HmB2RKxL49IuFafALZ0xsPqdSw2kFHlx+sPlS/tdKooaAVNpJWM2fzoXO5i\n\tiTh1YaDhoJVnhdolW7o1YTLqmWCC37cNVdERFNr0dAYMZRUn7dGNUBYJmBvYyUJAhdWz\n\tExqeinbPaadjxKeTgdde1x4Z7uqyVim2jnXmaPu5e2zOaYEkH0rxc4sfJsqbkwOENKiQ\n\tS1MItPyyMHSI+UaB8GB09K6w6AOgcK7/oLk9UB+rfaTpKCYYVdx6ckOxtSzi9+55niy0\n\tHMhkmekOJYsVyMXTQbWSm8jozJr8mPCg/V4gvpim1lXaKD6993TXK+iOfNX17tQBXbBa\n\taheQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n\ts=arc-20240605; \n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:dkim-signature;\n\tbh=UiVnWuFt1E0+152poWJrgrqlAFE3ucxNrhDW9vCDCD0=;\n\tfh=mMq0DOh0VsJLthTNfcodmjFwuC5URQ1nJVJf2U2r67M=;\n\tb=Fg6dzFbzWa0PMzBfDLyGPF714erxq2k67FhL8EkKBNF7LNymPaJciBqFK0dtsyFRNX\n\tdrwnbKB40DNgoIWSa7VkyydyQ7hvS1Wvw7an3MkLOc+b+Cxt9rHR7Ga4oarhfxZCqEXx\n\tQRSIe68Q7VvGqzBkdHUfzNbHqCITvUV8x8paZQh2qs7PLEWRfxbCrTMNrH7zpthNIwS7\n\t4CA4J2m1KMHhtxsACboqZx5uOq3+dcpcFQ4VyxgtdjxZt3hQIKLlPTtEIjKpvy5ZJ3AL\n\trLg1wRqBmxe3RlZbPAyuF9X+gb3el3rfQmjM//d8dbj3laXvKBVS1K3hkcA7/FOqP62Q\n\tT3eA==; darn=lists.libcamera.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1776411323; x=1777016123;\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=UiVnWuFt1E0+152poWJrgrqlAFE3ucxNrhDW9vCDCD0=;\n\tb=Kecz3U+MLxAQxonUz0AvE1yEgCBdWiPZoFQ/mRRiHbQIVUwwGxGNmw5xM+uJZfiPEi\n\t8a8BmR8tbW/UZey/Yq5wP3lr5CHhm+MJwpnOPbVed94HnxLgsIVs2Nqu5eQ2NtLyklty\n\toy/s5PN9gqqx7CXLdS/FKxoDqlTCRK0YzwPuUFIlBO6yCwqtt5lvl5J2cG9z6nRIGyEK\n\t/AIMnb3oAbQl5CiHLS1K0Mjqey4m2me0tG0139aLCXJVMTBwO8HWueU1p/9PwyyBQTJ1\n\tGp0Tj2AfynXK1OLPr6uNWZoWKf8isitZRlOXyFQ7cXvmV+LiuHQ3zoVeFmZ2tkLaHTZ7\n\teBYA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1776411323; x=1777016123;\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=UiVnWuFt1E0+152poWJrgrqlAFE3ucxNrhDW9vCDCD0=;\n\tb=VsOhjAEBQoqoLI3ZwPz4P+So6JHDwtsjt5loYG94uhBufzLOd/RMX7DnNFvNE8xoX7\n\t2tVii6Vh3LjGiWWAVIkie5c94kD4VNQUJXB7Cw7aelJ7DTXH6axIAAhGaPTjvIJkFP9F\n\tmz0PF7zve6B6KP1p7LnsPVdgIl3HWfwUbd7pudsWUpv+fjw026F1Y8pnFmAYvLfSVyxi\n\teILcasQRMy0zjnV0jgtFCAtRcJrscRhzfq4trctmUFwOhcr2autDcd32kw5PF4E4fASe\n\twyV7d8iqcO5wx++R6BalxaIHNa4ms7XM4xQEVVO9Sh4mfdHR+7fgK4peQAhXlHyl0MHj\n\t0jWQ==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ9k2wM0TR7yQC3thPb0sPnlIp1fPCRg6qf//E3G8/4wPJjDzL8YoZBQEQ7zM2TyyFBZws2KwTtmDi+wwMxD2Bg=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YyJdM6gZ1Hl3HlcuZCIBC6hXjR1YKbQ09waj40u62/+29SB2fQo\n\tpF+VHOB2knIqPzFTJbYvexSUC3yPMkUUPE7ZpaEJLb25MnNZ5XK7sslZhq0dftBRlza+mxBDG4q\n\tyC7bhpCuNfSH3lznpEMlxVF/o0YSqI8dItDNAfJhsRg==","X-Gm-Gg":"AeBDieuEJCcgQSnhaBryb7eSCFfGtyd1cr7YN+2Z3K24HRhtlxp4Xm/lKo7zQ59Vo/R\n\tGU0x9eVOVq2+XAq0x+gExmzsjSZPs01cMFK0OHYZFuS/bnrg5lzqqQS3swcdCRUsou10i6YfgOQ\n\tunskYvvw4vFgBvp3pnRfoGf/ekV/0uhvwdsYBFmqzGkqFUv1yIJfC8+SXTyesfMCZmR1LxaSvXj\n\t4g/MhG1c6M2pCcLEc6dgdbDuRZJFqoulYyF8/3ROuASKIWjqgyPrI0Og7oo+KVFLWwZHWV6E562\n\tNfG2zCH56Q3t7bR82eEgBeqT3YW9qwenOBY0dxPMB/1osweuisDuwrgMMhWJ2K6hJPcVInDNIk3\n\tBMKyGKQCmnEn6NtT+jA1sfidYpCkxk23Zyw==","X-Received":"by 2002:a17:907:94d4:b0:ba2:45e:aeea with SMTP id\n\ta640c23a62f3a-ba41898e4f4mr84932666b.0.1776411322933; Fri, 17 Apr 2026\n\t00:35:22 -0700 (PDT)","MIME-Version":"1.0","References":"<20260330101654.3332-1-david.plowman@raspberrypi.com>\n\t<20260409153725.659135-1-fabien.danieau@pollen-robotics.com>\n\t<20260409163620.GA2712636@killaraus.ideasonboard.com>\n\t<CAHW6GY++UXzmeNTrOQ=hM_Dz64vca3ep1jZmLqxBRv1xYeGv6w@mail.gmail.com>\n\t<36dde37c7fe89b56a18c29a281e72e0bef410861.camel@pollen-robotics.com>\n\t<CAHW6GY+uH+10NS0h2A46Z=KojeVg8bk_MYwGLrA5PhsuZZkGng@mail.gmail.com>\n\t<177618727758.102801.7357081723310699508@ping.linuxembedded.co.uk>\n\t<18136481a7507856901a158fb2b2725cf78f805e.camel@ndufresne.ca>","In-Reply-To":"<18136481a7507856901a158fb2b2725cf78f805e.camel@ndufresne.ca>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Fri, 17 Apr 2026 08:35:12 +0100","X-Gm-Features":"AQROBzDRRH6DYB2YvZyMBaSif6WQTLzn-hw0UzURJf5ISFzlbwP_bmBoXFypBzk","Message-ID":"<CAHW6GYJHkZ1=2Sa-J2UaVsCm1EAYVm4MiOUiK27E9wwkoYrUvw@mail.gmail.com>","Subject":"Re: [PATCH v4] gstreamer: Add sensor-config property","To":"Nicolas Dufresne <nicolas@ndufresne.ca>","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>, \n\tFabien Danieau <fabien.danieau@pollen-robotics.com>, \n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","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>"}}]