[{"id":27343,"web_url":"https://patchwork.libcamera.org/comment/27343/","msgid":"<e6fe366f-440e-390f-e9d5-28e2f659dfcb@ideasonboard.com>","date":"2023-06-14T16:41:59","subject":"Re: [libcamera-devel] [PATCH] gstreamer: src: Send\n\timage-orientation tag","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Robert,\n\nOn 6/14/23 9:51 PM, Robert Mader via libcamera-devel wrote:\n> Matching the validated Transform of the configuration, if the transform\n> is not the Identity. As we currently always request a configuration with\n> `Identity` transform, this can be the case if camera has a rotation\n> property (90/180/270 degree) and the sensor can't do rotation in\n> question. Sending the orientation-tag allows downstream elements to\n> compensate accordingly.\n>\n> This matches current pipewiresrc behavior and can be tested with e.g.:\n> gst-launch-1.0 libcamerasrc ! videoconvert ! videoflip video-direction=auto ! gtksink\n>\n> Signed-off-by: Robert Mader <robert.mader@collabora.com>\n> ---\n>   src/gstreamer/gstlibcamera-utils.cpp | 24 ++++++++++++++++++++++++\n>   src/gstreamer/gstlibcamera-utils.h   |  3 +++\n>   src/gstreamer/gstlibcamerasrc.cpp    | 11 +++++++++++\n>   3 files changed, 38 insertions(+)\n>\n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index 750ec351..3bfbc354 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -553,3 +553,27 @@ gst_libcamera_get_camera_manager(int &ret)\n>   \n>   \treturn cm;\n>   }\n> +\n> +const char *\n> +gst_libcamera_transform_to_tag_string(libcamera::Transform transform)\n> +{\n> +\tswitch (transform) {\n> +\tcase Transform::Rot90:\n> +\t\treturn \"rotate-90\";\n> +\tcase Transform::Rot180:\n> +\t\treturn \"rotate-180\";\n> +\tcase Transform::Rot270:\n> +\t\treturn \"rotate-270\";\n> +\tcase Transform::HFlip:\n> +\t\treturn \"flip-rotate-0\";\n> +\tcase Transform::VFlip:\n> +\t\treturn \"flip-rotate-180\";\n> +\tcase Transform::Transpose:\n> +\t\treturn \"flip-rotate-270\";\n> +\tcase Transform::Rot180Transpose:\n> +\t\treturn \"flip-rotate-90\";\n> +\tcase Transform::Identity:\n> +\tdefault:\n> +\t\treturn \"rotate-0\";\n> +\t}\n> +}\n> diff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\n> index fd304a8b..499533c4 100644\n> --- a/src/gstreamer/gstlibcamera-utils.h\n> +++ b/src/gstreamer/gstlibcamera-utils.h\n> @@ -11,6 +11,7 @@\n>   #include <libcamera/camera_manager.h>\n>   #include <libcamera/controls.h>\n>   #include <libcamera/stream.h>\n> +#include <libcamera/transform.h>\n>   \n>   #include <gst/gst.h>\n>   #include <gst/video/video.h>\n> @@ -30,6 +31,8 @@ gboolean gst_task_resume(GstTask *task);\n>   #endif\n>   std::shared_ptr<libcamera::CameraManager> gst_libcamera_get_camera_manager(int &ret);\n>   \n> +const char *gst_libcamera_transform_to_tag_string(libcamera::Transform transform);\n> +\n>   /**\n>    * \\class GLibLocker\n>    * \\brief A simple scoped mutex locker for GMutex\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index a10cbd4f..b41f52d7 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -461,6 +461,7 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n>   \tGLibRecLocker lock(&self->stream_lock);\n>   \tGstLibcameraSrcState *state = self->state;\n>   \tGstFlowReturn flow_ret = GST_FLOW_OK;\n> +\tconst char *transform_tag;\n>   \tgint ret;\n>   \n>   \tg_autoptr(GstStructure) element_caps = gst_structure_new_empty(\"caps\");\n> @@ -519,6 +520,16 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n>   \t\tgoto done;\n>   \t}\n>   \n> +\ttransform_tag = gst_libcamera_transform_to_tag_string(state->config_->transform);\n\nReading the transform isn't enough. I think the camera property \n'rotation' should be reported instead when the transform is not \nrequested (or it can be set to identity for default)\n\nThere will be cases I believe when the image-orientation should be set \nto transform as well - those is when users supplies a transform and it \napplies to the camera as expected. For cases were the transform cannot \nbe applied, we need to detect that and report property::rotation again? \nI am not sure on the latter front right now...\n\n> +\tfor (gsize i = 0; i < state->srcpads_.size(); i++) {\n> +\t\tGstPad *srcpad = state->srcpads_[i];\n> +\t\tGstEvent *tag_event;\n> +\n> +\t\ttag_event = gst_event_new_tag(gst_tag_list_new(GST_TAG_IMAGE_ORIENTATION,\n> +\t\t\t\t\t\t\t       transform_tag, NULL));\n> +\t\tgst_pad_push_event(srcpad, tag_event);\n> +\t}\n> +\n>   \tret = state->cam_->configure(state->config_.get());\n>   \tif (ret) {\n>   \t\tGST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,","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 E9FF3C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 14 Jun 2023 16:42:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 31F11628B6;\n\tWed, 14 Jun 2023 18:42:08 +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 567D761E4A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 Jun 2023 18:42:06 +0200 (CEST)","from [192.168.1.108] (unknown [103.86.18.143])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D9675838;\n\tWed, 14 Jun 2023 18:41:34 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686760928;\n\tbh=l56liNf1LxMidpKkNMLX7qNBZh83xOdrEkBh11Rxsu4=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=ekltNu0eKj+iSTeJzTN/5tVpojbCacM1l1fRKtsnx1e1+5K5VQksa8gBHG5XMRndO\n\tzL4g9miHhr4a8cLGqajyRV88WCRbX5Q6nGoFVCP3NuDhQv/T0vL3o/A43t/VL8Mkbw\n\tJTSzr+D8Lff8k61NFSX6Q9ZGPr7hHESv1Sm7fuMFO3qaaPLtvGF33uK1KpIfRLsdMf\n\tp1E40iDj7tZLzVrEMPllGmz25UGcuxgopDU2qrgMX69JdDqnoDUM0kIrKeDnSHtgi5\n\taJ3dyJd92D7a8FkILut/NRKIG3AJNBg/WP7cAY7QAY54okHUcTSXPWdKI4/Ehfnw29\n\tZjUU+L8Ao2HFw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1686760895;\n\tbh=l56liNf1LxMidpKkNMLX7qNBZh83xOdrEkBh11Rxsu4=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=sAzK8zUtFp3ChYAlAAt9mTB/ZUaQpdijWiR1CgNIq/aw6ixww4AwvG5eKKU53KU7W\n\t831J0wgysftYZ0vlP3fwNLClvhZhTvm9UAJLHBJ9UJYc/IU4VkQN0/NEBt1qiMXPxU\n\tWXhtjpt64RKrHAM8b+GWide8iv0Vll3RMMBjqtc8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"sAzK8zUt\"; dkim-atps=neutral","Message-ID":"<e6fe366f-440e-390f-e9d5-28e2f659dfcb@ideasonboard.com>","Date":"Wed, 14 Jun 2023 22:11:59 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101\n\tThunderbird/102.7.1","Content-Language":"en-US","To":"Robert Mader <robert.mader@collabora.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20230614162222.20943-1-robert.mader@collabora.com>","In-Reply-To":"<20230614162222.20943-1-robert.mader@collabora.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH] gstreamer: src: Send\n\timage-orientation tag","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>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]