[{"id":31921,"web_url":"https://patchwork.libcamera.org/comment/31921/","msgid":"<689202fdd2416bfe3d0e3bf79ba9effad6ac5117.camel@ndufresne.ca>","date":"2024-10-25T15:23:28","subject":"Re: [PATCH] gstreamer: Add GstVideoMeta support","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Thank for looking into this.\n\nLe vendredi 25 octobre 2024 à 12:37 +0900, Hou Qi a écrit :\n> This change is to provide correct stride and offset for downstream\n                                    strides    offsets\n> plugin who needs GstVideoMeta when camera is connected to waylandsink\n> or others.\n> \n> Without GstVideoMeta, waylandsink uses video-info calculated stride an\n                                                               strides\n> offset to create wlbuffer. The calculated stride is 4 aligned with width.\n  offsets\n\nJust state that the stride from GStreamer libgstvideo may differ from the one\nused by the camera. It is otherwise too specific to your lab testing.\n\n> While camera stride got from driver reported bytesperline maybe the\n> same size with width. There will be mismatch between camera output\n> buffer and wlbuffer if camera generated size is not 4 aligned for\n> multi-plane formats such as NV12 and NV16. It causes display abnormal.\n\nThere is room for wording improvement here too.\n\n> \n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 22 +++++++++++++++++++++-\n>  1 file changed, 21 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 912a8d55..c357dda1 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -285,10 +285,30 @@ int GstLibcameraSrcState::processRequest()\n>  \tGstFlowReturn ret = GST_FLOW_OK;\n>  \tgst_flow_combiner_reset(src_->flow_combiner);\n>  \n> -\tfor (GstPad *srcpad : srcpads_) {\n> +\tfor (gsize i = 0; i < srcpads_.size(); i++) {\n> +\t\tGstPad *srcpad = srcpads_[i];\n>  \t\tStream *stream = gst_libcamera_pad_get_stream(srcpad);\n>  \t\tGstBuffer *buffer = wrap->detachBuffer(stream);\n> +\t\tStreamConfiguration &stream_cfg = src_->state->config_->at(i);\n> +\t\tGstVideoInfo info;\n> +\t\tg_autoptr(GstCaps) caps = gst_pad_get_current_caps(srcpad);\n>  \n> +\t\tif (!gst_video_info_from_caps(&info, caps)) {\n> +\t\t\tGST_WARNING(\"Failed to create video info\");\n> +\t\t} else {\n> +\t\t\tguint k, stride;\n> +\t\t\tgsize offset = 0;\n> +\t\t\tfor (k = 0; k < GST_VIDEO_INFO_N_PLANES(&info); k++) {\n> +\t\t\t\tstride = gst_video_format_info_extrapolate_stride(info.finfo, k, stream_cfg.stride);\n> +\t\t\t\tinfo.stride[k] = stride;\n> +\t\t\t\tinfo.offset[k] = offset;\n> +\t\t\t\toffset += stride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info.finfo, k, GST_VIDEO_INFO_HEIGHT(&info));\n> +\t\t\t}\n\n> +\t\t\tgst_buffer_add_video_meta_full(buffer, GST_VIDEO_FRAME_FLAG_NONE,\n> +\t\t\t\t\t\t       GST_VIDEO_INFO_FORMAT(&info), GST_VIDEO_INFO_WIDTH(&info),\n> +\t\t\t\t\t\t       GST_VIDEO_INFO_HEIGHT(&info), GST_VIDEO_INFO_N_PLANES(&info),\n> +\t\t\t\t\t\t       info.offset, info.stride);\n\nOnce we are streaming, this will never change. Please, pre-calculate the\ninformation and encapsulate this into the buffer pool implementation. This will\nalso avoid doing malloc for every request, and ensure there is only one video\nmeta per buffers.\n\nNote that downstream may not support VideoMeta (think of filesink), this is\ndetected in the allocation query. You must copy to system memory the buffer\nbefore pushing this. Otherwise, save disk image will vary in padding, making\nthem impossible to read back.\n\nNicolas\n\n> +\t\t}\n>  \t\tFrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);\n>  \n>  \t\tif (GST_CLOCK_TIME_IS_VALID(wrap->pts_)) {","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 8D16AC3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 25 Oct 2024 15:23:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9B4BF65398;\n\tFri, 25 Oct 2024 17:23:32 +0200 (CEST)","from mail-oi1-x235.google.com (mail-oi1-x235.google.com\n\t[IPv6:2607:f8b0:4864:20::235])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 574776538B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 25 Oct 2024 17:23:31 +0200 (CEST)","by mail-oi1-x235.google.com with SMTP id\n\t5614622812f47-3e5f9712991so1223133b6e.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 25 Oct 2024 08:23:31 -0700 (PDT)","from nicolas-tpx395.lan ([2606:6d00:15:862e::7a9])\n\tby smtp.gmail.com with ESMTPSA id\n\t6a1803df08f44-6d179a7227asm6495676d6.145.2024.10.25.08.23.29\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 25 Oct 2024 08:23:29 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=ndufresne-ca.20230601.gappssmtp.com\n\theader.i=@ndufresne-ca.20230601.gappssmtp.com\n\theader.b=\"dDS1ljzn\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1729869810;\n\tx=1730474610; darn=lists.libcamera.org; \n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=QnPZoKbDIsHEgzVckY83FBA2CnSTznA7lcVL9YOUlgY=;\n\tb=dDS1ljznTvbDql27kNrKTWX9TBpc4gKEOHQLmQEsBEkCvKbJRD5QST2Jojp6T9LY9v\n\tdmTFgaJ35efapQ/5cVOp7NAdcODkImyBOk7OFW+17s+uXkYbl15EVBM2Jn89v/JTBjqF\n\tNy18r0qiLdTGkSetvkHYCsOTfGlk0exL/QCW3tPPQX/h1rTYiV20AyEMlakm+TI7b/JI\n\tFLN2CxjPzfGb6i3xX+J6eo8ovudl2/rl5uNoUTv5rtoNrisAtKwSZxsk622tjvAUyMR9\n\tUVPt2O56hRVCf35723Fvec2DSyMLIj6lUpoh3TEWrj59Z045pQj9mEWfeIpqSBCVC46j\n\tllRg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1729869810; x=1730474610;\n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=QnPZoKbDIsHEgzVckY83FBA2CnSTznA7lcVL9YOUlgY=;\n\tb=KZbF51TRNiaRh8XRzeqZLCLpOxu/VP1deNU4QSGX21bUQkh7kn2Onr9ZDRwKhD435c\n\tMg3UKem9yUHaop10vgEinAPI1EcqS6IAeYT2RfviNSZp+Uv78SEVvg99tAH8FIiwFy8A\n\tQT12TpRDyGD9pW0NcTisqLZatpsETdOEHr0px20a+yAJQREfRcGhegnkEsEQM2GYQRJe\n\t73vtg3l2qUq7GOZybnbull7MyeCrjZ9k5vbiKNk35K3R7LtQc2eVRHscOXlR6gY00zMP\n\tQ1H+BiFCTDeVmzM9VTFRy3bcWIECODsvJn0bv09BIEGLserRAbjapOCpQBsR8YPIvfw1\n\ts+hQ==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCUGtx7qg4uhuiKJJqLJRHvP2aanfZsHTJVMBUxsNtO7egaM5EYm9vwoRozrBl7jcHbucvLNgasQiLzIGNi7WQo=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YzjoLXvhIGKCD9BqLehpjP/ceTG9LjEAcM+dqlmfKoZfDsfEr5J\n\ty4f5zHdX4gii4nDDdHCqHd0qN1PJ9gQAQTR3tzRghPxsBncCrSvnTtb9U9mrk7M=","X-Google-Smtp-Source":"AGHT+IHxUCbz59TktM8AsCu0YP52m8CGOLfSVBMSbsbOid71VV919bTCl/PZ8EAjswOnTnGl8XJX2g==","X-Received":"by 2002:a05:6808:10d6:b0:3e5:feec:e0aa with SMTP id\n\t5614622812f47-3e624502343mr9452511b6e.16.1729869809956; \n\tFri, 25 Oct 2024 08:23:29 -0700 (PDT)","Message-ID":"<689202fdd2416bfe3d0e3bf79ba9effad6ac5117.camel@ndufresne.ca>","Subject":"Re: [PATCH] gstreamer: Add GstVideoMeta support","From":"Nicolas Dufresne <nicolas@ndufresne.ca>","To":"Hou Qi <qi.hou@nxp.com>, libcamera-devel@lists.libcamera.org","Cc":"jared.hu@nxp.com, julien.vuillaumier@nxp.com","Date":"Fri, 25 Oct 2024 11:23:28 -0400","In-Reply-To":"<20241025033718.2387920-1-qi.hou@nxp.com>","References":"<20241025033718.2387920-1-qi.hou@nxp.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.52.4 (3.52.4-1.fc40) ","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":32070,"web_url":"https://patchwork.libcamera.org/comment/32070/","msgid":"<PAXPR04MB828575FB862A559027F0E071975D2@PAXPR04MB8285.eurprd04.prod.outlook.com>","date":"2024-11-08T09:22:05","subject":"RE: [EXT] Re: [PATCH] gstreamer: Add GstVideoMeta support","submitter":{"id":195,"url":"https://patchwork.libcamera.org/api/people/195/","name":"Qi Hou","email":"qi.hou@nxp.com"},"content":"Hi Nicolas,\n\nThanks for your review. I have sent out v2 according to your advice. Please help review.\n\nRegards,\nQi Hou\n\n-----Original Message-----\nFrom: Nicolas Dufresne <nicolas@ndufresne.ca> \nSent: 2024年10月25日 23:23\nTo: Qi Hou <qi.hou@nxp.com>; libcamera-devel@lists.libcamera.org\nCc: Jared Hu <jared.hu@nxp.com>; Julien Vuillaumier <julien.vuillaumier@nxp.com>\nSubject: [EXT] Re: [PATCH] gstreamer: Add GstVideoMeta support\n\nCaution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button\n\n\nThank for looking into this.\n\nLe vendredi 25 octobre 2024 à 12:37 +0900, Hou Qi a écrit :\n> This change is to provide correct stride and offset for downstream\n                                    strides    offsets\n> plugin who needs GstVideoMeta when camera is connected to waylandsink \n> or others.\n>\n> Without GstVideoMeta, waylandsink uses video-info calculated stride an\n                                                               strides\n> offset to create wlbuffer. The calculated stride is 4 aligned with width.\n  offsets\n\nJust state that the stride from GStreamer libgstvideo may differ from the one used by the camera. It is otherwise too specific to your lab testing.\n\n> While camera stride got from driver reported bytesperline maybe the \n> same size with width. There will be mismatch between camera output \n> buffer and wlbuffer if camera generated size is not 4 aligned for \n> multi-plane formats such as NV12 and NV16. It causes display abnormal.\n\nThere is room for wording improvement here too.\n\n>\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 22 +++++++++++++++++++++-\n>  1 file changed, 21 insertions(+), 1 deletion(-)\n>\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp \n> b/src/gstreamer/gstlibcamerasrc.cpp\n> index 912a8d55..c357dda1 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -285,10 +285,30 @@ int GstLibcameraSrcState::processRequest()\n>       GstFlowReturn ret = GST_FLOW_OK;\n>       gst_flow_combiner_reset(src_->flow_combiner);\n>\n> -     for (GstPad *srcpad : srcpads_) {\n> +     for (gsize i = 0; i < srcpads_.size(); i++) {\n> +             GstPad *srcpad = srcpads_[i];\n>               Stream *stream = gst_libcamera_pad_get_stream(srcpad);\n>               GstBuffer *buffer = wrap->detachBuffer(stream);\n> +             StreamConfiguration &stream_cfg = src_->state->config_->at(i);\n> +             GstVideoInfo info;\n> +             g_autoptr(GstCaps) caps = \n> + gst_pad_get_current_caps(srcpad);\n>\n> +             if (!gst_video_info_from_caps(&info, caps)) {\n> +                     GST_WARNING(\"Failed to create video info\");\n> +             } else {\n> +                     guint k, stride;\n> +                     gsize offset = 0;\n> +                     for (k = 0; k < GST_VIDEO_INFO_N_PLANES(&info); k++) {\n> +                             stride = gst_video_format_info_extrapolate_stride(info.finfo, k, stream_cfg.stride);\n> +                             info.stride[k] = stride;\n> +                             info.offset[k] = offset;\n> +                             offset += stride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info.finfo, k, GST_VIDEO_INFO_HEIGHT(&info));\n> +                     }\n\n> +                     gst_buffer_add_video_meta_full(buffer, GST_VIDEO_FRAME_FLAG_NONE,\n> +                                                    GST_VIDEO_INFO_FORMAT(&info), GST_VIDEO_INFO_WIDTH(&info),\n> +                                                    GST_VIDEO_INFO_HEIGHT(&info), GST_VIDEO_INFO_N_PLANES(&info),\n> +                                                    info.offset, \n> + info.stride);\n\nOnce we are streaming, this will never change. Please, pre-calculate the information and encapsulate this into the buffer pool implementation. This will also avoid doing malloc for every request, and ensure there is only one video meta per buffers.\n\nNote that downstream may not support VideoMeta (think of filesink), this is detected in the allocation query. You must copy to system memory the buffer before pushing this. Otherwise, save disk image will vary in padding, making them impossible to read back.\n\nNicolas\n\n> +             }\n>               FrameBuffer *fb = \n> gst_libcamera_buffer_get_frame_buffer(buffer);\n>\n>               if (GST_CLOCK_TIME_IS_VALID(wrap->pts_)) {","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 49E5BBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  8 Nov 2024 09:22:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E026665495;\n\tFri,  8 Nov 2024 10:22:08 +0100 (CET)","from EUR05-AM6-obe.outbound.protection.outlook.com\n\t(mail-am6eur05on2062e.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:2612::62e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A6DAB60589\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  8 Nov 2024 10:22:07 +0100 (CET)","from PAXPR04MB8285.eurprd04.prod.outlook.com\n\t(2603:10a6:102:1ca::15)\n\tby GVXPR04MB9851.eurprd04.prod.outlook.com (2603:10a6:150:118::17)\n\twith Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.22;\n\tFri, 8 Nov 2024 09:22:05 +0000","from PAXPR04MB8285.eurprd04.prod.outlook.com\n\t([fe80::e003:8fb:64ea:acfd]) by\n\tPAXPR04MB8285.eurprd04.prod.outlook.com\n\t([fe80::e003:8fb:64ea:acfd%3]) with mapi id 15.20.8137.018;\n\tFri, 8 Nov 2024 09:22:05 +0000"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"CNfJZc0U\";\n\tdkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=nxp.com;"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n\tb=XqNgIt7aBzp+XNeyXU1ortSURGNgWnbuIIMb1KqDOwKQ75O7ZpgD1WV9rq8QlJT96jkobJSMPzjYc2hctbqF0Vui+IwMK+HwX+CLEfXZuhoYM2xBBtunk3ynGYyIN2vlG0I1GnhqzIX2zAy0sU77aWd3AYG/kv7yD999qUWJYxJL84y3ablOczbN8Nuypk/1N+dSO2riMZuu4K84f8vFv4em39na09ZUg2buH+vPmZqViF/ASqMgDL+4LYiepLP4Y31G1Kdb67X928MagYEbTPKNA0F3W0Nd+RUUe/VsU9LuqFLIIW0XgYhZ16m4mBTAiaTnUsZeB7MHkR4CqTjKfg==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n\ts=arcselector10001;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n\tbh=P98ZmbbY2U1u0U/dYIGoCA/zAk9+fDg3NcVX0yAqJh0=;\n\tb=pu1GPW/PQLgpIRb6NkfNjsfUHSMoYHsyy08dpEbz495mtgXQASnzc726S88KDxHclRJP/wO/0CErL08PnmNLCIYc1PsWxBaeC8BvcPM5PVMKXYizqqWB6d8ohZX8bdMmBE6yRJeL40SBLG1wsVGpQEC0XQqQmLttuNh7sevODSx+jzZQdfsG2qeEIgbFSsYPd2BP7WRGRPDXtlmjRUgsF2nsWGs/dbF2oskAJtrrEOX4hqAeyqmtQlv8s0zjzaGwhaeh8Svq8HUcXejS1e4QaQb+CEXiT8IwnoeyM+jFHhH9n1ATi1Zbu2v8T6Q5oNH0F8y+MoyqtFTBa1/kZDEOwA==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n\tsmtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com;\n\tdkim=pass header.d=nxp.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=P98ZmbbY2U1u0U/dYIGoCA/zAk9+fDg3NcVX0yAqJh0=;\n\tb=CNfJZc0UQ5aDqu/ercctwnJUbf+zMSnrsKGFhqaDwQBiaDoRjfukmg51Y8zhmDQhiyg5g/pXr+O9VWHWi0IUF2LR4/wCsQ10oJ4i1jh6ZTw6dtOt4bQh/HvQFDCWpbY2p6ZpPr/0xpRlI/3SX9eEEECKUodaGS5JopunwRxqPyBQWAiclf2m5fmqGhBAkh1UhX4kccwx2pfESJ2veGq2CZ0y8H2gvODU8kAOaMlIvuRpGzcSMFT3XVJC0+opEjGaShuBMWlDLSHF+dl0tVqoJwtV/WqPUBwmjY6mv3hIbk0iJwAAluyIQHecNXRZ1KEQqRjF9AG77rmEm3aIEQlvXA==","From":"Qi Hou <qi.hou@nxp.com>","To":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\t\"libcamera-devel@lists.libcamera.org\"\n\t<libcamera-devel@lists.libcamera.org>","CC":"Jared Hu <jared.hu@nxp.com>, Julien Vuillaumier\n\t<julien.vuillaumier@nxp.com>","Subject":"RE: [EXT] Re: [PATCH] gstreamer: Add GstVideoMeta support","Thread-Topic":"[EXT] Re: [PATCH] gstreamer: Add GstVideoMeta support","Thread-Index":"AQHbJo9DcdmJi+6ZcU2PNgueoalnQ7KXlpAAgBWZS+A=","Date":"Fri, 8 Nov 2024 09:22:05 +0000","Message-ID":"<PAXPR04MB828575FB862A559027F0E071975D2@PAXPR04MB8285.eurprd04.prod.outlook.com>","References":"<20241025033718.2387920-1-qi.hou@nxp.com>\n\t<689202fdd2416bfe3d0e3bf79ba9effad6ac5117.camel@ndufresne.ca>","In-Reply-To":"<689202fdd2416bfe3d0e3bf79ba9effad6ac5117.camel@ndufresne.ca>","Accept-Language":"zh-CN, en-US","Content-Language":"en-US","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","authentication-results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"CNfJZc0U\";\n\tdkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=nxp.com;"],"x-ms-publictraffictype":"Email","x-ms-traffictypediagnostic":"PAXPR04MB8285:EE_|GVXPR04MB9851:EE_","x-ms-office365-filtering-correlation-id":"21307208-df8a-4ada-1266-08dcffd6d002","x-ms-exchange-senderadcheck":"1","x-ms-exchange-antispam-relay":"0","x-microsoft-antispam":"BCL:0;\n\tARA:13230040|1800799024|366016|376014|38070700018; ","x-microsoft-antispam-message-info":"=?utf-8?q?gXJXJ+rv1xJXMhJujivOjXotKq0s?=\n\t=?utf-8?q?IxEdRPQCfTG8QF3y+UpZYFhucG7fGcRdw9vhAdK/Vvd77o2KTmb9Fl0J?=\n\t=?utf-8?q?Uw9pLgGRystMX3ulvLVMQfL5cDAd4jjcy5ASiLKtBt448NOK+GyuSmXd?=\n\t=?utf-8?q?v1MF8274H8Ge4oN4ea15MqQs5Tt6lWS79G8kUIaVpYmIJtaEqsYryLlX?=\n\t=?utf-8?q?Jrk/0FC4ErliRDAx71/fv9Rqw4wZfjEdUVdTRHupWJp4Nydjnw5pA/68?=\n\t=?utf-8?q?DRF7JEnTNfNMapuB0lD380nDqFnetSenRxh/ElRzCfWxgDyKr6K//2Yx?=\n\t=?utf-8?q?85j2f/XqXD4Zuqv/QgT8Ffe6uEboUUOjzS6UyKhr8ulJoB8WtFlEM/QE?=\n\t=?utf-8?q?0vPyNJ/Uy4ZAjLEFiAbHKEDJpz/baOI/LcgdHgHc7/Y8EElKis3ZuYX0?=\n\t=?utf-8?q?7ImssmBb8/xZdmMshhVpXYnhLF5tNNcG2zBB3n7HAMcYJkBBhEE5lV4O?=\n\t=?utf-8?q?4V2Lhe46fwNUebq1HqvGVu8IgqR/teCBf67BDuQgY8KMBCo9nqmbKI0F?=\n\t=?utf-8?q?B2sJmuROv6KC8HvzMKwc22WhMG1KjATx2Q+JII37vhFWFrmda+6WrVTO?=\n\t=?utf-8?q?LaTD3Dc08kpjAeG0CSnDvbucBE9gmb/50TmEe6TbjQJ4jqoEjX/rniLX?=\n\t=?utf-8?q?Ws7n4B2FR9YKGEP/iaJvQyCvpe3iH2msKvExA0vy/9KeMA83HWQJinS/?=\n\t=?utf-8?q?YM8fSsONTU7c8lTk8mCyTCOGDNFwAQ8gW5yzL8Fy1rOAprRq1hN5UhZC?=\n\t=?utf-8?q?wDAHOsT35D3hoAOV2ij792OESZ6WfSeDtlH2xYbL4dMSBaT/M3Thk20k?=\n\t=?utf-8?q?BIIGsOAyjVtA+gRdKQLp+gl8xihpmjBouVex5NTdRdfntEFZNMF24xsW?=\n\t=?utf-8?q?cAm6LHzO6/wLPz6jBmCS6Pi8AsoSwB+X7frMrOlp+LRqtIky8ydUrc7C?=\n\t=?utf-8?q?H820/B5vcWhmz2wufyQ3DkJ/rAF/hDwFrfsmwoXKxwKS16HOgZ0Hq99g?=\n\t=?utf-8?q?MqzYxDZDMGWk+iBkWfhY+WQCIHxAPPdcdI66uYxhBkJlYNLpfAnMypZ6?=\n\t=?utf-8?q?OINK+h7wSdluz0K3B1AnDL+3OIAN796Ylayoxb6s3ABcsz8f52Uy1cet?=\n\t=?utf-8?q?y30xIpkel1nYpbnnvwJbmDaTejs/M49vZ0XtQ7wEKvDSfMC6RiDsXyAi?=\n\t=?utf-8?q?hffCJr7QDS6bybn2iWmFUnSIsZBsTAsK3914S5wSrXvWn2BDvwIPFDFL?=\n\t=?utf-8?q?nK+Sql9XiBxExGZE/qz0cD27YYefdFKcCDc5IO3/KUMXIIFY+TO+XGFH?=\n\t=?utf-8?q?oHnxq7fDbxFTw7v0S9hvPl6A/VdEBsPwIYBFtIBtZVXYoQ+guCkLU7T/?=\n\t=?utf-8?q?02CNIc6ho2AqqdudjoGX6j3/YHcTldAaCdc4sWoe606eI7bVKhKaWM5F?=\n\t=?utf-8?q?mqhYK4p46hhpvDc=3D?=","x-forefront-antispam-report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:PAXPR04MB8285.eurprd04.prod.outlook.com; PTR:;\n\tCAT:NONE; \n\tSFS:(13230040)(1800799024)(366016)(376014)(38070700018); DIR:OUT;\n\tSFP:1101; ","x-ms-exchange-antispam-messagedata-chunkcount":"1","x-ms-exchange-antispam-messagedata-0":"=?utf-8?q?gnWnGEx+wvdGeFlo8F8zObz1M?=\n\t=?utf-8?q?HbpQ+kq3OCLtaFLvDT1EyH2TcFieUDiMx5UxXlCOOsRj8Aux1GXDEYJ6?=\n\t=?utf-8?q?yy0tXPMvgGFXZ1PQ4GO3A+pmknR5sHGGNDyTC4yvQCIHHYnl3hVAeDAF?=\n\t=?utf-8?q?3nPDvyfpnPIKMOsVGJbKetfeqlQFuqo8ep3ur3IYw0ZYJvtTRT2xIRYZ?=\n\t=?utf-8?q?QqdTFWVRv+U73ZBL9Z1Rh/vr5rBAW7OCQJjqu0TCcs3/xbffhc2dgRis?=\n\t=?utf-8?q?2DyC8yR3aD5lyjIyPo1l9T35f1JPV6yVnn8DFIxBCJKViwMeUYzQ/oI3?=\n\t=?utf-8?q?HJ2vjjq1fETAWUZWaDzfCBcme3BydCCYn0yu6wwkuy18EjJspXRx1qT3?=\n\t=?utf-8?q?5+tnsiP1H9zrmKe6kFqeF/Gv52rVGNSbmhnkWkyaxoOAf/elVNU7UL5r?=\n\t=?utf-8?q?XcChqudYneBm1QuJA7ZnMAgct/06rZv0Lih8DRnd9PjonLMLhBPv84NE?=\n\t=?utf-8?q?FP+ZTy3z85fB1dOXxADH20cJGBUtos+ypGIS4FrMibYSC0rk1scQXCwk?=\n\t=?utf-8?q?TZwKo+zQj0qDa/C3xXyAX2Z2aHmpiuSs+E321YNdtXxkdD/V9/Ih0ZMz?=\n\t=?utf-8?q?gDXc5f69haejABrT0tDFre/go27/UEMwBb5IdTGJg9XRTMRCwjTYUGKR?=\n\t=?utf-8?q?iOriskRCt7/IFNTjoaAX6tBpH4Ojb9KXLbcPmNlAXpbpDP/WsuSGAFIL?=\n\t=?utf-8?q?ttZsOI28x1PaShr5bumcRigxHOIR8q4mtQa95j10ljIa1HBOJ485uA7s?=\n\t=?utf-8?q?+ATjQfTjIvcSQmQrScQaenqOuIqxyMf4m2ZgeeUjVStIMnFrVmykq5Av?=\n\t=?utf-8?q?4E+RB3GVlcUsvJY24KpWV85ANadGLK1gVD6Qyd8XGD6YTP2Anpeh2Cei?=\n\t=?utf-8?q?pwVLec0KHDU1YnwIsT5IniotlvA7nHPUdpe1TtvIIs5Juu+RfLP44xcl?=\n\t=?utf-8?q?1jXJLSmkDd4mQUarikqHminjXys3Tr/bORUnzHnqzXHcZti4fL9qMsQq?=\n\t=?utf-8?q?3LKVBCOjmosn7Aanuw1LFrtAEHEkb3MOAykUUy6a+oy0e7DrroCegolw?=\n\t=?utf-8?q?QVFaGuAbKq8JNPYZbPHBcThJysskzUf60RuYWBS0VGkrTJ/4i4TQy5XH?=\n\t=?utf-8?q?gDxgCMAmreZx04qemVAn6TKUaR9A+iTsvPKaNLmzR5DF3oOzCHjdpC2/?=\n\t=?utf-8?q?Dijg8ZH1/Fb5mkMv3OiCoIe1humfI8OJ2nYYTZaZKJpojRIBR1GWJg5d?=\n\t=?utf-8?q?KPE+IzptG2zDOritbTHAqICHD4dKsgXmTnWYSRq/uIHoZl4aAzi6hZLv?=\n\t=?utf-8?q?py3v5Gw8NGLSnHp3+EeKVihS+mPW3XUI3qF8FY52eLtZSVCQZ2Gx3jYG?=\n\t=?utf-8?q?ocufDWoDTiFJBqiSCTQkbQXg1HjdzZ8giOmQ1x4ct6uX9cXxVRHgaL/B?=\n\t=?utf-8?q?rUShpFI9BVq/FcHzm88L1Inyc3uq1c6iLewV5kifNzjo20sH2stsQc4G?=\n\t=?utf-8?q?U/3vfm9f+Z6aP4RwPYG1ihlKyXpYv6vRpccYNwcVPGgsLpEiZ4SzelTG?=\n\t=?utf-8?q?caYAEi3pjxFv2LlqnCmR387jVvdSzLYTHDY9M5x3AXEu6mee/EuIIJ13?=\n\t=?utf-8?q?UrUZtr9tRyGITSmno7QaJIGxIEqKOhzmhnqjXvfHzg=3D?=","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","MIME-Version":"1.0","X-OriginatorOrg":"nxp.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-AuthSource":"PAXPR04MB8285.eurprd04.prod.outlook.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"21307208-df8a-4ada-1266-08dcffd6d002","X-MS-Exchange-CrossTenant-originalarrivaltime":"08 Nov 2024 09:22:05.7325\n\t(UTC)","X-MS-Exchange-CrossTenant-fromentityheader":"Hosted","X-MS-Exchange-CrossTenant-id":"686ea1d3-bc2b-4c6f-a92c-d99c5c301635","X-MS-Exchange-CrossTenant-mailboxtype":"HOSTED","X-MS-Exchange-CrossTenant-userprincipalname":"ei0DSVjqr52esifXfHgag+Crj7OMx5LU5lSmQ2pGZi5RdcNxbz5oAgamnchO973V","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"GVXPR04MB9851","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>"}}]