[{"id":36248,"web_url":"https://patchwork.libcamera.org/comment/36248/","msgid":"<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>","date":"2025-10-14T12:53:04","subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Le mardi 14 octobre 2025 à 12:45 +0530, Umang Jain a écrit :\n> From: Giacomo Cappellini <giacomo.cappellini.87@gmail.com>\n> \n> Plumb the support for CameraConfiguration::orientation in libcamerasrc.\n> A new \"orientation\" property is introduced and mappings for\n> libcamera::Orientation <> GstVideoOrientationMethod are provided\n> with helpers.\n> \n> Signed-off-by: Giacomo Cappellini <giacomo.cappellini.87@gmail.com>\n> Co-developed-by: Umang Jain <uajain@igalia.com>\n> Signed-off-by: Umang Jain <uajain@igalia.com>\n> ---\n> Changes in v5:\n> - patch scrubbing and cleanup\n> - If different orientation is returned than requested, update the\n>   property\n> - Minor string fixes, append appropriate tags\n> \n> Link to v4: https://patchwork.libcamera.org/patch/23965/\n> \n> Note: Checkstyle will complain on this patch on a hunk, but the existing format\n> is quite read-able IMO, hence ignored.\n> ---\n>  src/gstreamer/gstlibcamera-utils.cpp | 36 ++++++++++++++++++++++++++++\n>  src/gstreamer/gstlibcamera-utils.h   |  3 +++\n>  src/gstreamer/gstlibcamerasrc.cpp    | 27 +++++++++++++++++++++\n>  3 files changed, 66 insertions(+)\n> \n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index bfb094c9..44050cbb 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -357,6 +357,42 @@ control_type_to_gtype(const ControlType &type)\n>  \treturn G_TYPE_INVALID;\n>  }\n>  \n> +static const struct {\n> +\tOrientation orientation;\n> +\tGstVideoOrientationMethod method;\n> +} orientation_map[]{\n> +\t{ Orientation::Rotate0, GST_VIDEO_ORIENTATION_IDENTITY },\n> +\t{ Orientation::Rotate90, GST_VIDEO_ORIENTATION_90R },\n> +\t{ Orientation::Rotate180, GST_VIDEO_ORIENTATION_180 },\n> +\t{ Orientation::Rotate270, GST_VIDEO_ORIENTATION_90L },\n> +\t{ Orientation::Rotate0Mirror, GST_VIDEO_ORIENTATION_HORIZ },\n> +\t{ Orientation::Rotate180Mirror, GST_VIDEO_ORIENTATION_VERT },\n> +\t{ Orientation::Rotate90Mirror, GST_VIDEO_ORIENTATION_UL_LR },\n> +\t{ Orientation::Rotate270Mirror, GST_VIDEO_ORIENTATION_UR_LL },\n> +};\n> +\n> +Orientation\n> +gst_video_orientation_to_libcamera_orientation(GstVideoOrientationMethod method)\n> +{\n> +\tfor (auto &b : orientation_map) {\n> +\t\tif (b.method == method)\n> +\t\t\treturn b.orientation;\n> +\t}\n> +\n> +\treturn Orientation::Rotate0;\n> +}\n> +\n> +GstVideoOrientationMethod\n> +libcamera_orientation_to_gst_video_orientation(Orientation orientation)\n> +{\n> +\tfor (auto &a : orientation_map) {\n> +\t\tif (a.orientation == orientation)\n> +\t\t\treturn a.method;\n> +\t}\n> +\n> +\treturn GST_VIDEO_ORIENTATION_IDENTITY;\n> +}\n> +\n>  GstCaps *\n>  gst_libcamera_stream_formats_to_caps(const StreamFormats &formats)\n>  {\n> diff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\n> index 35df56fb..4364811e 100644\n> --- a/src/gstreamer/gstlibcamera-utils.h\n> +++ b/src/gstreamer/gstlibcamera-utils.h\n> @@ -10,6 +10,7 @@\n>  \n>  #include <libcamera/camera_manager.h>\n>  #include <libcamera/controls.h>\n> +#include <libcamera/orientation.h>\n>  #include <libcamera/stream.h>\n>  \n>  #include <gst/gst.h>\n> @@ -32,6 +33,8 @@ libcamera::Rectangle gst_libcamera_gvalue_get_rectangle(const GValue *value);\n>  int gst_libcamera_set_structure_field(GstStructure *structure,\n>  \t\t\t\t      const libcamera::ControlId *id,\n>  \t\t\t\t      const libcamera::ControlValue &value);\n> +libcamera::Orientation gst_video_orientation_to_libcamera_orientation(GstVideoOrientationMethod method);\n> +GstVideoOrientationMethod libcamera_orientation_to_gst_video_orientation(libcamera::Orientation orientation);\n>  \n>  #if !GST_CHECK_VERSION(1, 16, 0)\n>  static inline void gst_clear_event(GstEvent **event_ptr)\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 79a025a5..2d5f0bf5 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -146,6 +146,7 @@ struct _GstLibcameraSrc {\n>  \tGstTask *task;\n>  \n>  \tgchar *camera_name;\n> +\tGstVideoOrientationMethod orientation;\n>  \n>  \tstd::atomic<GstEvent *> pending_eos;\n>  \n> @@ -157,6 +158,7 @@ struct _GstLibcameraSrc {\n>  enum {\n>  \tPROP_0,\n>  \tPROP_CAMERA_NAME,\n> +\tPROP_ORIENTATION,\n\nThe subject is ambiguous, I read this as libcamera would be providing the\norientation, and that this patch would simply translate it to a tag (image-\norientation) and push that in the pipeline. But in short, you are looking to\nsupport sensor HFLIP and VFLIP, very rarely the other rotations are supported.\n\nPlease, update the subject and patch description so we can understand what this\npatch is about.\n\n>  \tPROP_LAST\n>  };\n>  \n> @@ -616,6 +618,10 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n>  \t\tgst_libcamera_get_framerate_from_caps(caps, element_caps);\n>  \t}\n>  \n> +\t/* Set orientation. */\n> +\tOrientation requestedOrientation = gst_video_orientation_to_libcamera_orientation(self->orientation);\n\nMissing \"GLibLocker lock(GST_OBJECT(object));\" You can create a local get\nfunction that does that.\n\n> +\tstate->config_->orientation = requestedOrientation;\n> +\n>  \t/* Validate the configuration. */\n>  \tCameraConfiguration::Status status = state->config_->validate();\n>  \tif (status == CameraConfiguration::Invalid)\n> @@ -637,6 +643,10 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n>  \tgst_libcamera_clamp_and_set_frameduration(state->initControls_,\n>  \t\t\t\t\t\t  state->cam_->controls(), element_caps);\n>  \n> +\t/* If orientation is changed, update the property. */\n> +\tif (state->config_->orientation != requestedOrientation)\n> +\t\tg_object_set(G_OBJECT(self), \"orientation\", state->config_->orientation, nullptr);\n\nIts always risky to call g_object_set() on self due to possible locking. This\ncase seem to work, but required me to think harder. Perhaps use the usual\nmethod:\n\n+\t/* If orientation is changed, update the property. */\n+\tif (state->config_->orientation != requestedOrientation) {\n+\t\t{ // You can also make this a getter\n+\t\t\tGLibLocker lock(GST_OBJECT(object));\n+\t\t\tstate->config_->orientation = state->config_-\n>orientation;\n+\t\t}\n+\t\tg_object_notify(G_OBJECT(self), \"orientation\");\n+\t}\n\nPersonally, I would rather have the source push an image-orientation tag with\nthe missing operation needed to match the requested orientation. This this way\nwe won't need any code to offload the rest of the work to downstream elements.\nOf course, you can't do that properly without also dealing with the sensor\nrotation. And you can't do that if you merge this code as it will be impossible\nto make something compatible.\n\n> +\n>  \t/*\n>  \t * Regardless if it has been modified, create clean caps and push the\n>  \t * caps event. Downstream will decide if the caps are acceptable.\n> @@ -936,6 +946,9 @@ 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_ORIENTATION:\n> +\t\tself->orientation = static_cast<GstVideoOrientationMethod>(g_value_get_enum(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> @@ -955,6 +968,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_ORIENTATION:\n> +\t\tg_value_set_enum(value, static_cast<gint>(self->orientation));\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> @@ -1164,6 +1180,17 @@ 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> +\n> +\tspec = g_param_spec_enum(\"orientation\", \"Orientation\",\n> +\t\t\t\t \"Select the preferred image orientation.\",\n\nNot enough doc.\n\n> +\t\t\t\t GST_TYPE_VIDEO_ORIENTATION_METHOD,\n> +\t\t\t\t GST_VIDEO_ORIENTATION_IDENTITY,\n> +\t\t\t\t (GParamFlags)(GST_PARAM_MUTABLE_READY\n> +\t\t\t\t\t       | G_PARAM_CONSTRUCT\n> +\t\t\t\t\t       | G_PARAM_READWRITE\n> +\t\t\t\t\t       | G_PARAM_STATIC_STRINGS));\n> +\tg_object_class_install_property(object_class, PROP_ORIENTATION, 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 60B6DBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Oct 2025 12:53:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 68C46605F0;\n\tTue, 14 Oct 2025 14:53:08 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A637D605DF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Oct 2025 14:53:07 +0200 (CEST)","from [IPv6:2606:6d00:17:ebd3::c41] (unknown\n\t[IPv6:2606:6d00:17:ebd3::c41])\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 97E8717E12DF;\n\tTue, 14 Oct 2025 14:53:06 +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=\"gwYNis2Z\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1760446387;\n\tbh=mEqGqReZoF/pbiXMZmMGOtGzhkhnqh46QVc3KDPLy9g=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=gwYNis2ZnNFwnsj9eFs2hWovMWFJJcPzz1bbtzYlznN+JoDHOf+WJtqjLCJOpanAq\n\tQgi4Dukw0vKof8UpWxhU/2Kj4bV7gFZNfkBT0lzWOVVGQPHAtbERnT9dCIBc9ep7cJ\n\t7IfzOs6AmwTNXK7iuQ4k8SSdsjNnTE1YvNAWDburH4riuqL2lU7LNeBwJcvwSsW0d2\n\tQUladftUp8HWl952XW1cHFe4tI7wsQ2CLAY7OgMR/kYELUJUJO/oUobKOEJ80XQVmF\n\twK/TXsEJK0WTS29mf7lCpdzzQoRgA6ZjrGUUnwRiIKb4kRPYAhgV/EAKOxztsldtRJ\n\tL9/2enjTxzkhQ==","Message-ID":"<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>","Subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Umang Jain <uajain@igalia.com>, libcamera-devel@lists.libcamera.org","Cc":"Giacomo Cappellini <giacomo.cappellini.87@gmail.com>","Date":"Tue, 14 Oct 2025 08:53:04 -0400","In-Reply-To":"<20251014071533.270074-1-uajain@igalia.com>","References":"<20251014071533.270074-1-uajain@igalia.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=\"=-JwWaa8a9rmhmq2LMsEc/\"","User-Agent":"Evolution 3.56.2 (3.56.2-2.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>"}},{"id":36249,"web_url":"https://patchwork.libcamera.org/comment/36249/","msgid":"<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","date":"2025-10-14T14:09:13","subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"On Tue, Oct 14, 2025 at 08:53:04AM -0400, Nicolas Dufresne wrote:\n> Le mardi 14 octobre 2025 à 12:45 +0530, Umang Jain a écrit :\n> > From: Giacomo Cappellini <giacomo.cappellini.87@gmail.com>\n> > \n> > Plumb the support for CameraConfiguration::orientation in libcamerasrc.\n> > A new \"orientation\" property is introduced and mappings for\n> > libcamera::Orientation <> GstVideoOrientationMethod are provided\n> > with helpers.\n> > \n> > Signed-off-by: Giacomo Cappellini <giacomo.cappellini.87@gmail.com>\n> > Co-developed-by: Umang Jain <uajain@igalia.com>\n> > Signed-off-by: Umang Jain <uajain@igalia.com>\n> > ---\n> > Changes in v5:\n> > - patch scrubbing and cleanup\n> > - If different orientation is returned than requested, update the\n> >   property\n> > - Minor string fixes, append appropriate tags\n> > \n> > Link to v4: https://patchwork.libcamera.org/patch/23965/\n> > \n> > Note: Checkstyle will complain on this patch on a hunk, but the existing format\n> > is quite read-able IMO, hence ignored.\n> > ---\n> >  src/gstreamer/gstlibcamera-utils.cpp | 36 ++++++++++++++++++++++++++++\n> >  src/gstreamer/gstlibcamera-utils.h   |  3 +++\n> >  src/gstreamer/gstlibcamerasrc.cpp    | 27 +++++++++++++++++++++\n> >  3 files changed, 66 insertions(+)\n> > \n> > diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> > index bfb094c9..44050cbb 100644\n> > --- a/src/gstreamer/gstlibcamera-utils.cpp\n> > +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> > @@ -357,6 +357,42 @@ control_type_to_gtype(const ControlType &type)\n> >  \treturn G_TYPE_INVALID;\n> >  }\n> >  \n> > +static const struct {\n> > +\tOrientation orientation;\n> > +\tGstVideoOrientationMethod method;\n> > +} orientation_map[]{\n> > +\t{ Orientation::Rotate0, GST_VIDEO_ORIENTATION_IDENTITY },\n> > +\t{ Orientation::Rotate90, GST_VIDEO_ORIENTATION_90R },\n> > +\t{ Orientation::Rotate180, GST_VIDEO_ORIENTATION_180 },\n> > +\t{ Orientation::Rotate270, GST_VIDEO_ORIENTATION_90L },\n> > +\t{ Orientation::Rotate0Mirror, GST_VIDEO_ORIENTATION_HORIZ },\n> > +\t{ Orientation::Rotate180Mirror, GST_VIDEO_ORIENTATION_VERT },\n> > +\t{ Orientation::Rotate90Mirror, GST_VIDEO_ORIENTATION_UL_LR },\n> > +\t{ Orientation::Rotate270Mirror, GST_VIDEO_ORIENTATION_UR_LL },\n> > +};\n> > +\n> > +Orientation\n> > +gst_video_orientation_to_libcamera_orientation(GstVideoOrientationMethod method)\n> > +{\n> > +\tfor (auto &b : orientation_map) {\n> > +\t\tif (b.method == method)\n> > +\t\t\treturn b.orientation;\n> > +\t}\n> > +\n> > +\treturn Orientation::Rotate0;\n> > +}\n> > +\n> > +GstVideoOrientationMethod\n> > +libcamera_orientation_to_gst_video_orientation(Orientation orientation)\n> > +{\n> > +\tfor (auto &a : orientation_map) {\n> > +\t\tif (a.orientation == orientation)\n> > +\t\t\treturn a.method;\n> > +\t}\n> > +\n> > +\treturn GST_VIDEO_ORIENTATION_IDENTITY;\n> > +}\n> > +\n> >  GstCaps *\n> >  gst_libcamera_stream_formats_to_caps(const StreamFormats &formats)\n> >  {\n> > diff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\n> > index 35df56fb..4364811e 100644\n> > --- a/src/gstreamer/gstlibcamera-utils.h\n> > +++ b/src/gstreamer/gstlibcamera-utils.h\n> > @@ -10,6 +10,7 @@\n> >  \n> >  #include <libcamera/camera_manager.h>\n> >  #include <libcamera/controls.h>\n> > +#include <libcamera/orientation.h>\n> >  #include <libcamera/stream.h>\n> >  \n> >  #include <gst/gst.h>\n> > @@ -32,6 +33,8 @@ libcamera::Rectangle gst_libcamera_gvalue_get_rectangle(const GValue *value);\n> >  int gst_libcamera_set_structure_field(GstStructure *structure,\n> >  \t\t\t\t      const libcamera::ControlId *id,\n> >  \t\t\t\t      const libcamera::ControlValue &value);\n> > +libcamera::Orientation gst_video_orientation_to_libcamera_orientation(GstVideoOrientationMethod method);\n> > +GstVideoOrientationMethod libcamera_orientation_to_gst_video_orientation(libcamera::Orientation orientation);\n> >  \n> >  #if !GST_CHECK_VERSION(1, 16, 0)\n> >  static inline void gst_clear_event(GstEvent **event_ptr)\n> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > index 79a025a5..2d5f0bf5 100644\n> > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > @@ -146,6 +146,7 @@ struct _GstLibcameraSrc {\n> >  \tGstTask *task;\n> >  \n> >  \tgchar *camera_name;\n> > +\tGstVideoOrientationMethod orientation;\n> >  \n> >  \tstd::atomic<GstEvent *> pending_eos;\n> >  \n> > @@ -157,6 +158,7 @@ struct _GstLibcameraSrc {\n> >  enum {\n> >  \tPROP_0,\n> >  \tPROP_CAMERA_NAME,\n> > +\tPROP_ORIENTATION,\n> \n> The subject is ambiguous, I read this as libcamera would be providing the\n> orientation, and that this patch would simply translate it to a tag (image-\n> orientation) and push that in the pipeline. But in short, you are looking to\n> support sensor HFLIP and VFLIP, very rarely the other rotations are supported.\n> \n> Please, update the subject and patch description so we can understand what this\n> patch is about.\n\nI assumed libcamera::orientation is well documented and the reader would\nrather read that to gain more insight, since this is just a plumbing\npatch. I can add a line or two to make more clearer.\n\n> \n> >  \tPROP_LAST\n> >  };\n> >  \n> > @@ -616,6 +618,10 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n> >  \t\tgst_libcamera_get_framerate_from_caps(caps, element_caps);\n> >  \t}\n> >  \n> > +\t/* Set orientation. */\n> > +\tOrientation requestedOrientation = gst_video_orientation_to_libcamera_orientation(self->orientation);\n> \n> Missing \"GLibLocker lock(GST_OBJECT(object));\" You can create a local get\n> function that does that.\n> \n> > +\tstate->config_->orientation = requestedOrientation;\n> > +\n> >  \t/* Validate the configuration. */\n> >  \tCameraConfiguration::Status status = state->config_->validate();\n> >  \tif (status == CameraConfiguration::Invalid)\n> > @@ -637,6 +643,10 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n> >  \tgst_libcamera_clamp_and_set_frameduration(state->initControls_,\n> >  \t\t\t\t\t\t  state->cam_->controls(), element_caps);\n> >  \n> > +\t/* If orientation is changed, update the property. */\n> > +\tif (state->config_->orientation != requestedOrientation)\n> > +\t\tg_object_set(G_OBJECT(self), \"orientation\", state->config_->orientation, nullptr);\n> \n> Its always risky to call g_object_set() on self due to possible locking. This\n> case seem to work, but required me to think harder. Perhaps use the usual\n> method:\n> \n> +\t/* If orientation is changed, update the property. */\n> +\tif (state->config_->orientation != requestedOrientation) {\n> +\t\t{ // You can also make this a getter\n> +\t\t\tGLibLocker lock(GST_OBJECT(object));\n> +\t\t\tstate->config_->orientation = state->config_-\n> >orientation;\n> +\t\t}\n> +\t\tg_object_notify(G_OBJECT(self), \"orientation\");\n> +\t}\n> \n> Personally, I would rather have the source push an image-orientation tag with\n> the missing operation needed to match the requested orientation. This this way\n> we won't need any code to offload the rest of the work to downstream elements.\n\nI think there is no \"missing\" operation here because\nCameraConfiguration::orientation would not apply anything if the\nrequested orientation cannot be satisfied and defaults to native image\norientation that the sensor will produce.\n\n> Of course, you can't do that properly without also dealing with the sensor\n> rotation. And you can't do that if you merge this code as it will be impossible\n> to make something compatible.\n\nSo, I think you are asking for the \"missing\" operation to be computed (in order\nto achieve the desired orientation) and push that down, via image-orientation tag\nfor downstream to compensate. I wonder why you say this is impossible if\nthis patch gets merged ? Rather, it should be built on top, no?\n\n> \n> > +\n> >  \t/*\n> >  \t * Regardless if it has been modified, create clean caps and push the\n> >  \t * caps event. Downstream will decide if the caps are acceptable.\n> > @@ -936,6 +946,9 @@ 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_ORIENTATION:\n> > +\t\tself->orientation = static_cast<GstVideoOrientationMethod>(g_value_get_enum(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> > @@ -955,6 +968,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_ORIENTATION:\n> > +\t\tg_value_set_enum(value, static_cast<gint>(self->orientation));\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> > @@ -1164,6 +1180,17 @@ 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> > +\n> > +\tspec = g_param_spec_enum(\"orientation\", \"Orientation\",\n> > +\t\t\t\t \"Select the preferred image orientation.\",\n> \n> Not enough doc.\n> \n> > +\t\t\t\t GST_TYPE_VIDEO_ORIENTATION_METHOD,\n> > +\t\t\t\t GST_VIDEO_ORIENTATION_IDENTITY,\n> > +\t\t\t\t (GParamFlags)(GST_PARAM_MUTABLE_READY\n> > +\t\t\t\t\t       | G_PARAM_CONSTRUCT\n> > +\t\t\t\t\t       | G_PARAM_READWRITE\n> > +\t\t\t\t\t       | G_PARAM_STATIC_STRINGS));\n> > +\tg_object_class_install_property(object_class, PROP_ORIENTATION, 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 6BF7BBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Oct 2025 14:09:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 06341605F8;\n\tTue, 14 Oct 2025 16:09:01 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2960B605DF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Oct 2025 16:09:00 +0200 (CEST)","from [49.36.127.56] (helo=uajain)\n\tby fanzine2.igalia.com with esmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1v8fhy-009Qw3-5s; Tue, 14 Oct 2025 16:08:58 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"Pz5HCyql\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version\n\t:References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=DHyUeza2ANWMRDs6dfsJKI4swTtek33n/Dj8HXadzUo=;\n\tb=Pz5HCyqlJyzzoBXBRZj4iRo3so\n\te7xmagiyWOsc+zDVBYdy7Pm6QTY9+hEwX/HIMl9gZOf651pwuIMeudbhn1TcRKG2JF4K1N825/J/n\n\tJ+p9uvhspKHnhr7A11Vc25UaxIhRs08ZteaI5aT6W+7JVnVy+ALoOsvu8+TPoER4ZUUwjIcAN5B1O\n\tWK/iNVwKGk3ZC+PxA1tIym2SHxaFg0LvE9MVCkL4MB7EBk1ybtApUNi0sRE0zLVh1i5c8UtbzTi7L\n\t0EF0YMT7Pn13Vv2xI8X3Op6JoanZDZzP1E9D82u402SknB5ngH5KhRC5Ipb7iXBOtwnWiwboZvQmc\n\thY52BOmg==;","Date":"Tue, 14 Oct 2025 19:39:13 +0530","From":"Umang Jain <uajain@igalia.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tGiacomo Cappellini <giacomo.cappellini.87@gmail.com>","Subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","Message-ID":"<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","References":"<20251014071533.270074-1-uajain@igalia.com>\n\t<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>","User-Agent":"NeoMutt/20250905-dirty","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":36252,"web_url":"https://patchwork.libcamera.org/comment/36252/","msgid":"<83066769f9f6a89d3f93ae638247812ecf79e57d.camel@collabora.com>","date":"2025-10-14T15:31:20","subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Le mardi 14 octobre 2025 à 19:39 +0530, Umang Jain a écrit :\n> On Tue, Oct 14, 2025 at 08:53:04AM -0400, Nicolas Dufresne wrote:\n> > Le mardi 14 octobre 2025 à 12:45 +0530, Umang Jain a écrit :\n> > > From: Giacomo Cappellini <giacomo.cappellini.87@gmail.com>\n> > > \n> > > \n\n[...]\n\n> > >  \n> > > @@ -157,6 +158,7 @@ struct _GstLibcameraSrc {\n> > >  enum {\n> > >  \tPROP_0,\n> > >  \tPROP_CAMERA_NAME,\n> > > +\tPROP_ORIENTATION,\n> > \n> > The subject is ambiguous, I read this as libcamera would be providing the\n> > orientation, and that this patch would simply translate it to a tag (image-\n> > orientation) and push that in the pipeline. But in short, you are looking to\n> > support sensor HFLIP and VFLIP, very rarely the other rotations are supported.\n> > \n> > Please, update the subject and patch description so we can understand what this\n> > patch is about.\n> \n> I assumed libcamera::orientation is well documented and the reader would\n> rather read that to gain more insight, since this is just a plumbing\n> patch. I can add a line or two to make more clearer.\n\nThis is the first source I'm aware that implements this operation. If you found\nother sources doing so, let me know. This is normally found on filters and\ndisplay sink. A property that change its value from inside is also very uncommon\nand must be documented thoroughly, GStreamer application developers are not use\nto that.\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 7952BBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Oct 2025 15:31:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 409F660600;\n\tTue, 14 Oct 2025 17:31:24 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 093CC605F3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Oct 2025 17:31:23 +0200 (CEST)","from [IPv6:2606:6d00:17:ebd3::bad] (unknown\n\t[IPv6:2606:6d00:17:ebd3::bad])\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 2C19517E0C54;\n\tTue, 14 Oct 2025 17:31:22 +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=\"H1G/M3zQ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1760455882;\n\tbh=bm3gVzhs5Cv8P5Ry8/5HqXyX+MC9fgnU530QE8xyGwA=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=H1G/M3zQbJtlnViW3Kr3wYBSWZbRWlYcst7RXmaWqd0eqXTnvQ4RbDD/rKOflHyEy\n\thOr6Q7nXlQkZvzuVF1+RI2Ndwg/ybMkyCYfcIiUhuNnbeDeUoceZ62e7sdWsQ0X6k5\n\tHPFBnQovGWN7fKFDrxC0TK+AEbaur51ON2ANDPC7hBBANeVo0snd8gI8h2WiStLrB8\n\tvLSCIFbyZrPc1trCv25V46TC8PwMJrXHlRv6GPuC+dls9xCAYxnBskhhJiVgTBnA/Q\n\tyPUkjwb+xn4qZ3ybBtbgk03UVvB+o/1/itpqw5GNrci69/kiiIVGg97lhAAvLpeuQm\n\t4nkpGu0rDi9Sw==","Message-ID":"<83066769f9f6a89d3f93ae638247812ecf79e57d.camel@collabora.com>","Subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org, Giacomo Cappellini\n\t<giacomo.cappellini.87@gmail.com>","Date":"Tue, 14 Oct 2025 11:31:20 -0400","In-Reply-To":"<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","References":"<20251014071533.270074-1-uajain@igalia.com>\n\t<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>\n\t<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","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=\"=-04sfk9svgV8Ew95nC/sQ\"","User-Agent":"Evolution 3.56.2 (3.56.2-2.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>"}},{"id":36253,"web_url":"https://patchwork.libcamera.org/comment/36253/","msgid":"<0d7b392f1217bcea2f107f2a8e9a0a89cbc06e2b.camel@collabora.com>","date":"2025-10-14T15:34:09","subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Hi Umang,\n\nLe mardi 14 octobre 2025 à 19:39 +0530, Umang Jain a écrit :\n> > Personally, I would rather have the source push an image-orientation tag with\n> > the missing operation needed to match the requested orientation. This this way\n> > we won't need any code to offload the rest of the work to downstream elements.\n> \n> I think there is no \"missing\" operation here because\n> CameraConfiguration::orientation would not apply anything if the\n> requested orientation cannot be satisfied and defaults to native image\n> orientation that the sensor will produce.\n> \n> > Of course, you can't do that properly without also dealing with the sensor\n> > rotation. And you can't do that if you merge this code as it will be impossible\n> > to make something compatible.\n> \n> So, I think you are asking for the \"missing\" operation to be computed (in order\n> to achieve the desired orientation) and push that down, via image-orientation tag\n> for downstream to compensate. I wonder why you say this is impossible if\n> this patch gets merged ? Rather, it should be built on top, no?\n\nThese are two different behaviour, which in my knowledge is an ABI break. I\nnever design toward a known ABI break.\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 1A856BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Oct 2025 15:34:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4C9A960601;\n\tTue, 14 Oct 2025 17:34:13 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A1A87605F3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Oct 2025 17:34:11 +0200 (CEST)","from [IPv6:2606:6d00:17:ebd3::bad] (unknown\n\t[IPv6:2606:6d00:17:ebd3::bad])\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\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id B234C17E013C;\n\tTue, 14 Oct 2025 17:34:10 +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=\"LXy3TE14\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1760456051;\n\tbh=1IwIwGBMNmEFESIZjKjUdhX1TEiv02zHbx3fQn1YKuM=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=LXy3TE14NxkATNBeiVZH8yV41sBmc09lucMLqL5F5SPiJR/1cTrIPVa3dUU7ExZrf\n\txhvcoZOHJ2olS2oCc5msxUiFTLvTt0bZzX6X+orEENLN2/dRkeu8fiPqeDGRE4bSgK\n\talo7il68nIyZW8zXIYHXAzs2SkiM9tU+lj4AYGNOAMsKa9Xg5cMtGQ5C/FajqJmfko\n\tpDvh5q9+6w5FLk9kUAxHO1J09y6h9E52X/tJYPwL5UeDxOpk3vUcWUUeoULHQ+1l2p\n\tGhggAuVdJXUJt8ffQfjtYa6+eX4/wox1EmQ3mHfMRW02copbp1TABStXrYaHO6xmNo\n\tXgr9ZeHMLvDdA==","Message-ID":"<0d7b392f1217bcea2f107f2a8e9a0a89cbc06e2b.camel@collabora.com>","Subject":"Re: [PATCH v5] gstreamer: Add support for Orientation","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org, Giacomo Cappellini\n\t<giacomo.cappellini.87@gmail.com>","Date":"Tue, 14 Oct 2025 11:34:09 -0400","In-Reply-To":"<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","References":"<20251014071533.270074-1-uajain@igalia.com>\n\t<ed47e85b651b43b17938ea057e6bb8e386d85301.camel@collabora.com>\n\t<vdnbsej47ek4wzc7txelp3genzd364uqbfozfs7w5m5l6572kf@osbdqlkctikg>","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=\"=-bKKCBIzD86lsdNW8keed\"","User-Agent":"Evolution 3.56.2 (3.56.2-2.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>"}}]