[{"id":35225,"web_url":"https://patchwork.libcamera.org/comment/35225/","msgid":"<d888dc0eb8b6093620d1cad1145e172f6cb36f8a.camel@collabora.com>","date":"2025-07-28T22:54:32","subject":"Re: [PATCH v4 2/3] gstreamer: Move existing GValue helpers to\n\tgstreamer-utils","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Le jeudi 24 juillet 2025 à 19:03 +0530, Umang Jain a écrit :\n> Move the existing GValue helpers from gstlibcamera-controls.cpp.in\n> to gstreamer-utils.cpp. The intention here is to make these helpers\n> available to other parts of gstreamer source element, for example,\n> reporting camera properties in GstDeviceProvider.\n> \n> The function signature has been changed to match with the other\n> gstreamer-utils utility functions:\n> \n> value_get_rectangle() =>  gst_libcamera_gvalue_get_rectangle()\n> value_set_rectangle() =>  gst_libcamera_gvalue_set_rectangle()\n> value_set_point()     =>  gst_libcamera_gvalue_set_point()\n> value_set_size()      =>  gst_libcamera_gvalue_set_size()\n> \n> Signed-off-by: Umang Jain <uajain@igalia.com>\n\nReviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\n> ---\n>  src/gstreamer/gstlibcamera-controls.cpp.in | 56 ++--------------------\n>  src/gstreamer/gstlibcamera-utils.cpp       | 47 ++++++++++++++++++\n>  src/gstreamer/gstlibcamera-utils.h         |  4 ++\n>  3 files changed, 56 insertions(+), 51 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamera-controls.cpp.in\n> b/src/gstreamer/gstlibcamera-controls.cpp.in\n> index 1bc781cc..6faf3ee7 100644\n> --- a/src/gstreamer/gstlibcamera-controls.cpp.in\n> +++ b/src/gstreamer/gstlibcamera-controls.cpp.in\n> @@ -14,56 +14,10 @@\n>  #include <libcamera/geometry.h>\n>  \n>  #include \"gstlibcamera-controls.h\"\n> +#include \"gstlibcamera-utils.h\"\n>  \n>  using namespace libcamera;\n>  \n> -static void value_set_point(GValue *value, const Point &point)\n> -{\n> -\tGValue x = G_VALUE_INIT;\n> -\tg_value_init(&x, G_TYPE_INT);\n> -\tg_value_set_int(&x, point.x);\n> -\tgst_value_array_append_and_take_value(value, &x);\n> -\n> -\tGValue y = G_VALUE_INIT;\n> -\tg_value_init(&y, G_TYPE_INT);\n> -\tg_value_set_int(&y, point.y);\n> -\tgst_value_array_append_and_take_value(value, &y);\n> -}\n> -\n> -static void value_set_size(GValue *value, const Size &size)\n> -{\n> -\tGValue width = G_VALUE_INIT;\n> -\tg_value_init(&width, G_TYPE_INT);\n> -\tg_value_set_int(&width, size.width);\n> -\tgst_value_array_append_and_take_value(value, &width);\n> -\n> -\tGValue height = G_VALUE_INIT;\n> -\tg_value_init(&height, G_TYPE_INT);\n> -\tg_value_set_int(&height, size.height);\n> -\tgst_value_array_append_and_take_value(value, &height);\n> -}\n> -\n> -static void value_set_rectangle(GValue *value, const Rectangle &rect)\n> -{\n> -\tvalue_set_point(value, rect.topLeft());\n> -\tvalue_set_size(value, rect.size());\n> -}\n> -\n> -static Rectangle value_get_rectangle(const GValue *value)\n> -{\n> -\tconst GValue *r;\n> -\tr = gst_value_array_get_value(value, 0);\n> -\tint x = g_value_get_int(r);\n> -\tr = gst_value_array_get_value(value, 1);\n> -\tint y = g_value_get_int(r);\n> -\tr = gst_value_array_get_value(value, 2);\n> -\tint w = g_value_get_int(r);\n> -\tr = gst_value_array_get_value(value, 3);\n> -\tint h = g_value_get_int(r);\n> -\n> -\treturn Rectangle(x, y, w, h);\n> -}\n> -\n>  {% for vendor, ctrls in controls %}\n>  {%- for ctrl in ctrls if ctrl.is_enum %}\n>  static const GEnumValue {{ ctrl.name|snake_case }}_types[] = {\n> @@ -179,7 +133,7 @@ bool GstCameraControls::getProperty(guint propId, GValue\n> *value,\n>  \t\t\tGValue element = G_VALUE_INIT;\n>  {%- if ctrl.is_rectangle %}\n>  \t\t\tg_value_init(&element, GST_TYPE_PARAM_ARRAY_LIST);\n> -\t\t\tvalue_set_rectangle(&element, control[i]);\n> +\t\t\tgst_libcamera_gvalue_set_rectangle(&element,\n> control[i]);\n>  {%- else %}\n>  \t\t\tg_value_init(&element, G_TYPE_{{ ctrl.gtype|upper\n> }});\n>  \t\t\tg_value_set_{{ ctrl.gtype }}(&element, control[i]);\n> @@ -188,7 +142,7 @@ bool GstCameraControls::getProperty(guint propId, GValue\n> *value,\n>  \t\t}\n>  {%- else %}\n>  {%- if ctrl.is_rectangle %}\n> -\t\tvalue_set_rectangle(value, control);\n> +\t\tgst_libcamera_gvalue_set_rectangle(value, control);\n>  {%- else %}\n>  \t\tg_value_set_{{ ctrl.gtype }}(value, control);\n>  {%- endif %}\n> @@ -252,7 +206,7 @@ bool GstCameraControls::setProperty(guint propId, const\n> GValue *value,\n>  \t\t\t\t\t  i);\n>  \t\t\t\treturn true;\n>  \t\t\t}\n> -\t\t\tvalues[i] = value_get_rectangle(element);\n> +\t\t\tvalues[i] =\n> gst_libcamera_gvalue_get_rectangle(element);\n>  {%- else %}\n>  \t\t\tvalues[i] = g_value_get_{{ ctrl.gtype }}(element);\n>  {%- endif %}\n> @@ -271,7 +225,7 @@ bool GstCameraControls::setProperty(guint propId, const\n> GValue *value,\n>  \t\t\t\t  \"array of size 4\");\n>  \t\t\treturn true;\n>  \t\t}\n> -\t\tRectangle val = value_get_rectangle(value);\n> +\t\tRectangle val = gst_libcamera_gvalue_get_rectangle(value);\n>  {%- else %}\n>  \t\tauto val = g_value_get_{{ ctrl.gtype }}(value);\n>  {%- endif %}\n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp\n> b/src/gstreamer/gstlibcamera-utils.cpp\n> index a548b0c1..63e00fe0 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -584,6 +584,53 @@ void gst_libcamera_framerate_to_caps(GstCaps *caps, const\n> GstStructure *element_\n>  \tgst_structure_set(s, \"framerate\", GST_TYPE_FRACTION, fps_caps_n,\n> fps_caps_d, nullptr);\n>  }\n>  \n> +void gst_libcamera_gvalue_set_point(GValue *value, const Point &point)\n> +{\n> +\tGValue x = G_VALUE_INIT;\n> +\tg_value_init(&x, G_TYPE_INT);\n> +\tg_value_set_int(&x, point.x);\n> +\tgst_value_array_append_and_take_value(value, &x);\n> +\n> +\tGValue y = G_VALUE_INIT;\n> +\tg_value_init(&y, G_TYPE_INT);\n> +\tg_value_set_int(&y, point.y);\n> +\tgst_value_array_append_and_take_value(value, &y);\n> +}\n> +\n> +void gst_libcamera_gvalue_set_size(GValue *value, const Size &size)\n> +{\n> +\tGValue width = G_VALUE_INIT;\n> +\tg_value_init(&width, G_TYPE_INT);\n> +\tg_value_set_int(&width, size.width);\n> +\tgst_value_array_append_and_take_value(value, &width);\n> +\n> +\tGValue height = G_VALUE_INIT;\n> +\tg_value_init(&height, G_TYPE_INT);\n> +\tg_value_set_int(&height, size.height);\n> +\tgst_value_array_append_and_take_value(value, &height);\n> +}\n> +\n> +void gst_libcamera_gvalue_set_rectangle(GValue *value, const Rectangle &rect)\n> +{\n> +\tgst_libcamera_gvalue_set_point(value, rect.topLeft());\n> +\tgst_libcamera_gvalue_set_size(value, rect.size());\n> +}\n> +\n> +Rectangle gst_libcamera_gvalue_get_rectangle(const GValue *value)\n> +{\n> +\tconst GValue *r;\n> +\tr = gst_value_array_get_value(value, 0);\n> +\tint x = g_value_get_int(r);\n> +\tr = gst_value_array_get_value(value, 1);\n> +\tint y = g_value_get_int(r);\n> +\tr = gst_value_array_get_value(value, 2);\n> +\tint w = g_value_get_int(r);\n> +\tr = gst_value_array_get_value(value, 3);\n> +\tint h = g_value_get_int(r);\n> +\n> +\treturn Rectangle(x, y, w, h);\n> +}\n> +\n>  #if !GST_CHECK_VERSION(1, 17, 1)\n>  gboolean\n>  gst_task_resume(GstTask *task)\n> diff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-\n> utils.h\n> index 5f4e8a0f..1812be75 100644\n> --- a/src/gstreamer/gstlibcamera-utils.h\n> +++ b/src/gstreamer/gstlibcamera-utils.h\n> @@ -25,6 +25,10 @@ void\n> gst_libcamera_clamp_and_set_frameduration(libcamera::ControlList &controls,\n>  \t\t\t\t\t       const\n> libcamera::ControlInfoMap &camera_controls,\n>  \t\t\t\t\t       GstStructure *element_caps);\n>  void gst_libcamera_framerate_to_caps(GstCaps *caps, const GstStructure\n> *element_caps);\n> +void gst_libcamera_gvalue_set_point(GValue *value, const libcamera::Point\n> &point);\n> +void gst_libcamera_gvalue_set_size(GValue *value, const libcamera::Size\n> &size);\n> +void gst_libcamera_gvalue_set_rectangle(GValue *value, const\n> libcamera::Rectangle &rect);\n> +libcamera::Rectangle gst_libcamera_gvalue_get_rectangle(const GValue *value);\n>  \n>  #if !GST_CHECK_VERSION(1, 16, 0)\n>  static inline void gst_clear_event(GstEvent **event_ptr)","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 DF05FC3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Jul 2025 22:54:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8D15B691C4;\n\tTue, 29 Jul 2025 00:54:35 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 32B636146A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 29 Jul 2025 00:54:34 +0200 (CEST)","from [IPv6:2606:6d00:11:5a76::5ac] (unknown\n\t[IPv6:2606:6d00:11:5a76::5ac])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (4096 bits)\n\tserver-digest SHA256)\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id 4C50A17E0FA8;\n\tTue, 29 Jul 2025 00:54:33 +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=\"gUNPSaII\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1753743273;\n\tbh=f4WLMsKiDLgtUvh3OlV7zt6N7M1G9zqutyGvhY9l9wk=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=gUNPSaII2AfVrvMNlThh5Fr1xd4To0eVTYqe/2ylRzjEs/S/Hi4Y+Opi5a2WgZAHY\n\tyZi933tApHSLF+sNS/EBJOioCR9bBdQnmLArQLCfv0OaDjIfvPMtfhLz4rbuUz/JM/\n\teqe4ZRGS9Zblu2xuRq8GJ7Dww4Xvi74hrWjt/Rq/3eH82al9yBIq6stVAeyC4eBH82\n\t3fZevUVbUMa39UHGYIhx0mIn7N1N4mDmkPx72anYMi2xfaZkpK0CPH/OMi7iz9Vggv\n\tfCMHeGuqRRPsZYHq8LxKgKRIaF6dwEXxlWl4mcvwWPpAex9mbGk+ZQXYVoZug8F342\n\t8B0QVuZH3/egw==","Message-ID":"<d888dc0eb8b6093620d1cad1145e172f6cb36f8a.camel@collabora.com>","Subject":"Re: [PATCH v4 2/3] gstreamer: Move existing GValue helpers to\n\tgstreamer-utils","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Umang Jain <uajain@igalia.com>, libcamera-devel@lists.libcamera.org","Cc":"Jaslo Ziska <jaslo@ziska.de>","Date":"Mon, 28 Jul 2025 18:54:32 -0400","In-Reply-To":"<20250724133343.353044-3-uajain@igalia.com>","References":"<20250724133343.353044-1-uajain@igalia.com>\n\t<20250724133343.353044-3-uajain@igalia.com>","Autocrypt":"addr=nicolas.dufresne@collabora.com; prefer-encrypt=mutual;\n\tkeydata=mQGiBEUQN0MRBACQYceNSezSdMjx7sx6gwKkMghrrODgl3B0eXBTgNp6c431IfOOEsdvk\n\toOh1kwoYcQgbg4MXw6beOltysX4e8fFWsiRkc2nvvRW9ir9kHDm49MkBLqaDjTqOkYKNMiurFW+go\n\tzpr/lUW15QqT6v68RYe0zRdtwGZqeLzX2LVuukGwCg4AISzswrrYHNV7vQLcbaUhPgIl0D+gILYT9\n\tTJgAEK4YHW+bFRcY+cgUFoLQqQayECMlctKoLOE69nIYOc/hDr9uih1wxrQ/yL0NJvQCohSPyoyLF\n\t9b2EuIGhQVp05XP7FzlTxhYvGO/DtO08ec85+bTfVBMV6eeY4MS3ZU+1z7ObD7Pf29YjyTehN2Dan\n\t6w1g2rBk5MoA/9nDocSlk4pbFpsYSFmVHsDiAOFje3+iY4ftVDKunKYWMhwRVBjAREOByBagmRau0\n\tcLEcElpf4hX5f978GoxSGIsiKoDAlXX+ICDOWC1/EXhEEmBR1gL0QJgiVviNyLfGJlZWnPjw6xhhm\n\ttHYWTDxBOP5peztyc2PqeKsLsLWzAr7QnTmljb2xhcyBEdWZyZXNuZSA8bmljb2xhc0BuZHVmcmVz\n\tbmUuY2E+iGIEExECACIFAlXA3CACGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHFTAi2sB\n\tqgcJngAnRDBTr8bhzuH0KQwFP1nEYtfgpKdAKCrQ/sJfuG/8zsd7J8wVl7y3e8ARbRDTmljb2xhcy\n\tBEdWZyZXNuZSAoQi4gU2MuIEluZm9ybWF0aXF1ZSkgPG5pY29sYXMuZHVmcmVzbmVAZ21haWwuY29\n\ttPohgBBMRAgAgBQJFlCyOAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQcVMCLawGqBwhLQCg\n\tzYlrLBj6KIAZ4gmsfjXD6ZtddT8AoIeGDicVq5WvMHNWign6ApQcZUihtElOaWNvbGFzIER1ZnJlc\n\t25lIChCLiBTYy4gSW5mb3JtYXRpcXVlKSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY28udW\n\ts+iGIEExECACIFAkuzca8CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHFTAi2sBqgcQX8\n\tAn2By6LDEeMxi4B9hUbpvRnzaaeNqAJ9Rox8rfqHZnSErw9bCHiBwvwJZ77QxTmljb2xhcyBEdWZy\n\tZXNuZSA8bmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEuY29tPohiBBMRAgAiBQJNzZzPAhsDBgsJC\n\tAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBxUwItrAaoHLlxAKCYAGf4JL7DYDLs/188CPMGuwLypw\n\tCfWKc9DorA9f5pyYlD5pQo6SgSoiC0R05pY29sYXMgRHVmcmVzbmUgKEIgU2MuIEluZm9ybWF0aXF\n\t1ZSkgPG5pY29sYXMuZHVmcmVzbmVAdXNoZXJicm9va2UuY2E+iGAEExECACAFAkUQN0MCGwMGCwkI\n\tBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBxUwItrAaoHPTnAJ0WGgJJVspoctAvEcI00mtp5WAFGgCgr\n\t+E7ItOqZEHAs+xabBgknYZIFPU=","Organization":"Collabora Canada","Content-Type":"multipart/signed; micalg=\"pgp-sha1\";\n\tprotocol=\"application/pgp-signature\"; \n\tboundary=\"=-PimhoxG1P5+nWVtIYHUw\"","User-Agent":"Evolution 3.56.2 (3.56.2-1.fc42) ","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>"}}]