[{"id":39930,"web_url":"https://patchwork.libcamera.org/comment/39930/","msgid":"<e752132e-a160-4c8e-84b3-d71336675813@ideasonboard.com>","date":"2026-07-31T15:07:27","subject":"Re: [PATCH] sensor: camera_sensor_legacy: Support separate H/V flips","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2026. 07. 31. 16:37 keltezéssel, Stefan Klug írta:\n> CameraSensorLegacy supports flipping on the sensor side only if the\n> driver supports V4L2_CID_HFLIP and V4L2_CID_VFLIP. In cases where a\n> driver only supports a single flip mode, flipping support gets disabled\n> completely. This is unexpected and annoying when validating sensor\n> drivers.\n\nWhat about `CameraSensorRaw`?\n\n\n> \n> Fix that by handling vertical and horizontal flips separately.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n> Hi all,\n> \n> I had this patch somewhere in my tree for a long time. Now I stumbled\n> over this issue again and had to manually rebase the changes. So maybe\n> it is time to upstream :-)\n> \n> Best regards,\n> Stefan\n> \n>   src/libcamera/sensor/camera_sensor_legacy.cpp | 72 +++++++++++++------\n>   1 file changed, 52 insertions(+), 20 deletions(-)\n> \n> diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> index 6a683821f219..0f8e3c8cf251 100644\n> --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n> +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> @@ -133,7 +133,8 @@ private:\n>   \tSize pixelArraySize_;\n>   \tRectangle activeArea_;\n>   \tconst BayerFormat *bayerFormat_;\n> -\tbool supportFlips_;\n> +\tbool supportHFlips_;\n> +\tbool supportVFlips_;\n>   \tbool flipsAlterBayerOrder_;\n>   \tOrientation mountingOrientation_;\n>   \n> @@ -153,7 +154,7 @@ private:\n>   \n>   CameraSensorLegacy::CameraSensorLegacy(const MediaEntity *entity)\n>   \t: entity_(entity), pad_(UINT_MAX), staticProps_(nullptr),\n> -\t  bayerFormat_(nullptr), supportFlips_(false),\n> +\t  bayerFormat_(nullptr), supportHFlips_(false), supportVFlips_(false),\n>   \t  flipsAlterBayerOrder_(false), properties_(properties::properties)\n>   {\n>   }\n> @@ -365,19 +366,37 @@ int CameraSensorLegacy::validateSensorDriver()\n>   \t * \\todo Handle horizontal and vertical flips independently.\n>   \t */\n>   \tconst struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP);\n> -\tconst struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP);\n> -\tif (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY) &&\n> -\t    vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> -\t\tsupportFlips_ = true;\n> +\tif (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> +\t\tsupportHFlips_ = true;\n>   \n> -\t\tif (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT ||\n> -\t\t    vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n> +\t\tif (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n>   \t\t\tflipsAlterBayerOrder_ = true;\n> +\t} else {\n> +\t\tLOG(CameraSensor, Debug)\n> +\t\t\t<< \"Camera sensor does not support horizontal flip\";\n>   \t}\n>   \n> -\tif (!supportFlips_)\n> +\tconst struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP);\n> +\tif (vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> +\t\tsupportVFlips_ = true;\n> +\n> +\t\tif (vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n> +\t\t\tflipsAlterBayerOrder_ = true;\n> +\t} else {\n>   \t\tLOG(CameraSensor, Debug)\n> -\t\t\t<< \"Camera sensor does not support horizontal/vertical flip\";\n> +\t\t\t<< \"Camera sensor does not support vertical flip\";\n> +\t}\n> +\n> +\tif (supportHFlips_ && supportVFlips_ &&\n> +\t    ((vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT) !=\n> +\t     (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT))) {\n> +\t\tLOG(CameraSensor, Error)\n> +\t\t\t<< \"Flips have different alter bayer order properties.\"\n> +\t\t\t<< \" Disable flipping altogether\";\n\nThis is theoretically possible, right? Should it be a warning with\nan \"unsupported\" somewhere in the message?\n\n\n> +\t\tsupportHFlips_ = false;\n> +\t\tsupportVFlips_ = false;\n> +\t\tflipsAlterBayerOrder_ = false;\n> +\t}\n>   \n>   \t/*\n>   \t * Make sure the required selection targets are supported.\n> @@ -759,11 +778,20 @@ CameraSensorLegacy::getFormat(Span<const unsigned int> mbusCodes,\n>   int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transform)\n>   {\n>   \t/* Configure flips if the sensor supports that. */\n> -\tif (supportFlips_) {\n> +\tif (supportHFlips_) {\n>   \t\tControlList flipCtrls(subdev_->controls());\n>   \n>   \t\tflipCtrls.set(V4L2_CID_HFLIP,\n>   \t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n> +\n> +\t\tint ret = subdev_->setControls(&flipCtrls);\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n> +\t}\n> +\n> +\tif (supportVFlips_) {\n> +\t\tControlList flipCtrls(subdev_->controls());\n> +\n>   \t\tflipCtrls.set(V4L2_CID_VFLIP,\n>   \t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n>   \n> @@ -936,15 +964,6 @@ int CameraSensorLegacy::sensorInfo(IPACameraSensorInfo *info) const\n>   \n>   Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const\n>   {\n> -\t/*\n> -\t * If we cannot do any flips we cannot change the native camera mounting\n> -\t * orientation.\n> -\t */\n> -\tif (!supportFlips_) {\n> -\t\t*orientation = mountingOrientation_;\n> -\t\treturn Transform::Identity;\n> -\t}\n> -\n>   \t/*\n>   \t * Now compute the required transform to obtain 'orientation' starting\n>   \t * from the mounting rotation.\n> @@ -955,6 +974,19 @@ Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const\n>   \t */\n>   \tTransform transform = *orientation / mountingOrientation_;\n>   \n> +\t/*\n> +\t * If we cannot do the required flips, fall back to identity.\n> +\t */\n> +\tif (!supportHFlips_ & !!(transform & Transform::HFlip)) {\n\nI would write\n\n   if (!supportHFlips_ && (transform & Transform::HFlip))\n\n\n> +\t\t*orientation = mountingOrientation_;\n> +\t\treturn Transform::Identity;\n> +\t}\n> +\n> +\tif (!supportVFlips_ & !!(transform & Transform::VFlip)) {\n\nSimilarly here.\n\n\n> +\t\t*orientation = mountingOrientation_;\n> +\t\treturn Transform::Identity;\n> +\t}\n> +\n>   \t/*\n>   \t * If transform contains any Transpose we cannot do it, so adjust\n>   \t * 'orientation' to report the image native orientation and return Identity.","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 750DBBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 31 Jul 2026 15:07:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7986767FDC;\n\tFri, 31 Jul 2026 17:07:33 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0632165F9F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 31 Jul 2026 17:07:32 +0200 (CEST)","from [192.168.33.22] (185.182.215.156.nat.pool.zt.hu\n\t[185.182.215.156])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2D9D1BE;\n\tFri, 31 Jul 2026 17:06:25 +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=\"thw1Ag+b\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1785510385;\n\tbh=qXYy+a2/k3Ve8YMKOxqGeQzmz8pyD9tc/RDZF1Utoj4=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=thw1Ag+br4uskR6rSt+riWGoXLCwgDGmEQTEnHO2o+6g7gnPGXKWY0ex/MrshWIbC\n\tptmEqXgZ8TRWAOnEIePCRbMd1PgUQRPddWEQpTj0DKBCze5tGm7B0HFArYIWrBHyAP\n\tf+NBDwbv+ynmYhpus0pUwcMlaKRLcgTuLZWqrNLw=","Message-ID":"<e752132e-a160-4c8e-84b3-d71336675813@ideasonboard.com>","Date":"Fri, 31 Jul 2026 17:07:27 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] sensor: camera_sensor_legacy: Support separate H/V flips","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260731143741.689779-1-stefan.klug@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260731143741.689779-1-stefan.klug@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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":39940,"web_url":"https://patchwork.libcamera.org/comment/39940/","msgid":"<20260731174052.GI1555869@killaraus.ideasonboard.com>","date":"2026-07-31T17:40:52","subject":"Re: [PATCH] sensor: camera_sensor_legacy: Support separate H/V flips","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Jul 31, 2026 at 05:07:27PM +0200, Barnabás Pőcze wrote:\n> 2026. 07. 31. 16:37 keltezéssel, Stefan Klug írta:\n> > CameraSensorLegacy supports flipping on the sensor side only if the\n> > driver supports V4L2_CID_HFLIP and V4L2_CID_VFLIP. In cases where a\n> > driver only supports a single flip mode, flipping support gets disabled\n> > completely. This is unexpected and annoying when validating sensor\n> > drivers.\n> \n> What about `CameraSensorRaw`?\n> \n> > Fix that by handling vertical and horizontal flips separately.\n> > \n> > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> > ---\n> > Hi all,\n> > \n> > I had this patch somewhere in my tree for a long time. Now I stumbled\n> > over this issue again and had to manually rebase the changes. So maybe\n> > it is time to upstream :-)\n> > \n> > Best regards,\n> > Stefan\n> > \n> >   src/libcamera/sensor/camera_sensor_legacy.cpp | 72 +++++++++++++------\n> >   1 file changed, 52 insertions(+), 20 deletions(-)\n> > \n> > diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > index 6a683821f219..0f8e3c8cf251 100644\n> > --- a/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp\n> > @@ -133,7 +133,8 @@ private:\n> >   \tSize pixelArraySize_;\n> >   \tRectangle activeArea_;\n> >   \tconst BayerFormat *bayerFormat_;\n> > -\tbool supportFlips_;\n> > +\tbool supportHFlips_;\n> > +\tbool supportVFlips_;\n> >   \tbool flipsAlterBayerOrder_;\n> >   \tOrientation mountingOrientation_;\n> >   \n> > @@ -153,7 +154,7 @@ private:\n> >   \n> >   CameraSensorLegacy::CameraSensorLegacy(const MediaEntity *entity)\n> >   \t: entity_(entity), pad_(UINT_MAX), staticProps_(nullptr),\n> > -\t  bayerFormat_(nullptr), supportFlips_(false),\n> > +\t  bayerFormat_(nullptr), supportHFlips_(false), supportVFlips_(false),\n> >   \t  flipsAlterBayerOrder_(false), properties_(properties::properties)\n> >   {\n> >   }\n> > @@ -365,19 +366,37 @@ int CameraSensorLegacy::validateSensorDriver()\n> >   \t * \\todo Handle horizontal and vertical flips independently.\n\nThis needs an update.\n\n> >   \t */\n> >   \tconst struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP);\n> > -\tconst struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP);\n> > -\tif (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY) &&\n> > -\t    vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> > -\t\tsupportFlips_ = true;\n> > +\tif (hflipInfo && !(hflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> > +\t\tsupportHFlips_ = true;\n> >   \n> > -\t\tif (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT ||\n> > -\t\t    vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n> > +\t\tif (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n> >   \t\t\tflipsAlterBayerOrder_ = true;\n> > +\t} else {\n> > +\t\tLOG(CameraSensor, Debug)\n> > +\t\t\t<< \"Camera sensor does not support horizontal flip\";\n> >   \t}\n> >   \n> > -\tif (!supportFlips_)\n> > +\tconst struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP);\n> > +\tif (vflipInfo && !(vflipInfo->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n> > +\t\tsupportVFlips_ = true;\n> > +\n> > +\t\tif (vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)\n> > +\t\t\tflipsAlterBayerOrder_ = true;\n> > +\t} else {\n> >   \t\tLOG(CameraSensor, Debug)\n> > -\t\t\t<< \"Camera sensor does not support horizontal/vertical flip\";\n> > +\t\t\t<< \"Camera sensor does not support vertical flip\";\n> > +\t}\n> > +\n\nThis essentially repeats the same code twice. A small helper function\ncould help\n\nstd::tuple<bool, bool> CameraSensorLegacy::queryFlip(uint32_t id, const char *name)\n{\n\tconst struct v4l2_query_ext_ctrl *info = subdev_->controlInfo(id);\n\tif (!info || info->flags & V4L2_CTRL_FLAG_READ_ONLY)) {\n\t\tLOG(CameraSensor, Debug)\n\t\t\t<< \"Camera sensor does not support \" << name << \" flip\";\n\t\treturn { false, false };\n\t}\n\n\treturn { true, info->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT };\n}\n\nwhich can be used with something like\n\n\tauto hflip = queryFlip(V4L2_CID_HFLIP, \"horizontal\");\n\tauto vflip = queryFlip(V4L2_CID_VFLIP, \"vertical\");\n\n\tif (hflip.get<1> == vflip.get<1>) {\n\t\tsupportHFlips_= hflip.get<0>;\n\t\tsupportVFlips_= vflip.get<0>;\n\t\tflipsAlterBayerOrder_ = hflip.get<1>;\n\t} else {\n\t\tLOG(CameraSensor, Error)\n\t\t\t<< \"Flips have different alter bayer order properties.\"\n\t\t\t<< \" Disable flipping altogether\";\n\t}\n\nA small structure to avoid the get<0> and get<1> may be better.\n\n> > +\tif (supportHFlips_ && supportVFlips_ &&\n> > +\t    ((vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT) !=\n> > +\t     (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT))) {\n> > +\t\tLOG(CameraSensor, Error)\n> > +\t\t\t<< \"Flips have different alter bayer order properties.\"\n> > +\t\t\t<< \" Disable flipping altogether\";\n> \n> This is theoretically possible, right? Should it be a warning with\n> an \"unsupported\" somewhere in the message?\n> \n> > +\t\tsupportHFlips_ = false;\n> > +\t\tsupportVFlips_ = false;\n> > +\t\tflipsAlterBayerOrder_ = false;\n> > +\t}\n> >   \n> >   \t/*\n> >   \t * Make sure the required selection targets are supported.\n> > @@ -759,11 +778,20 @@ CameraSensorLegacy::getFormat(Span<const unsigned int> mbusCodes,\n> >   int CameraSensorLegacy::setFormat(V4L2SubdeviceFormat *format, Transform transform)\n> >   {\n> >   \t/* Configure flips if the sensor supports that. */\n> > -\tif (supportFlips_) {\n> > +\tif (supportHFlips_) {\n> >   \t\tControlList flipCtrls(subdev_->controls());\n> >   \n> >   \t\tflipCtrls.set(V4L2_CID_HFLIP,\n> >   \t\t\t      static_cast<int32_t>(!!(transform & Transform::HFlip)));\n> > +\n> > +\t\tint ret = subdev_->setControls(&flipCtrls);\n> > +\t\tif (ret)\n> > +\t\t\treturn ret;\n> > +\t}\n> > +\n> > +\tif (supportVFlips_) {\n> > +\t\tControlList flipCtrls(subdev_->controls());\n> > +\n> >   \t\tflipCtrls.set(V4L2_CID_VFLIP,\n> >   \t\t\t      static_cast<int32_t>(!!(transform & Transform::VFlip)));\n> >   \n> > @@ -936,15 +964,6 @@ int CameraSensorLegacy::sensorInfo(IPACameraSensorInfo *info) const\n> >   \n> >   Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const\n> >   {\n> > -\t/*\n> > -\t * If we cannot do any flips we cannot change the native camera mounting\n> > -\t * orientation.\n> > -\t */\n> > -\tif (!supportFlips_) {\n> > -\t\t*orientation = mountingOrientation_;\n> > -\t\treturn Transform::Identity;\n> > -\t}\n> > -\n> >   \t/*\n> >   \t * Now compute the required transform to obtain 'orientation' starting\n\ns/Now compute/Compute/\n\n> >   \t * from the mounting rotation.\n> > @@ -955,6 +974,19 @@ Transform CameraSensorLegacy::computeTransform(Orientation *orientation) const\n> >   \t */\n> >   \tTransform transform = *orientation / mountingOrientation_;\n> >   \n> > +\t/*\n> > +\t * If we cannot do the required flips, fall back to identity.\n> > +\t */\n> > +\tif (!supportHFlips_ & !!(transform & Transform::HFlip)) {\n> \n> I would write\n> \n>    if (!supportHFlips_ && (transform & Transform::HFlip))\n> \n> > +\t\t*orientation = mountingOrientation_;\n> > +\t\treturn Transform::Identity;\n> > +\t}\n> > +\n> > +\tif (!supportVFlips_ & !!(transform & Transform::VFlip)) {\n> \n> Similarly here.\n> \n> > +\t\t*orientation = mountingOrientation_;\n> > +\t\treturn Transform::Identity;\n> > +\t}\n> > +\n> >   \t/*\n> >   \t * If transform contains any Transpose we cannot do it, so adjust\n> >   \t * 'orientation' to report the image native orientation and return Identity.","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 85BA0BDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 31 Jul 2026 17:40:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B3F2067FEA;\n\tFri, 31 Jul 2026 19:40:55 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 976C465F9F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 31 Jul 2026 19:40:53 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-70f3-e800--a06.rev.dnainternet.fi\n\t[IPv6:2001:14ba:70f3:e800::a06])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6B340BE;\n\tFri, 31 Jul 2026 19:39:46 +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=\"dRB1eBBs\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1785519586;\n\tbh=Wv0CZ9lz2lE8aA4UUHwJGAtPkEwmrFXmior3ZwqO1Ps=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=dRB1eBBslWWQc5OmxsAi98M9C5HUvf7WawXrMcQmHDpNJmlqEgXB6KpXJNQh62cyl\n\tGMXHu1RqtyXi/zFvR3XXo1cEWVizzZZn3/e3Fe6F9wQcKu4wJrJNgUJwuIGnfzvkPn\n\twrgDI1/nHqKEjMNaMsWTXYdr+11pORsKL0a0nxKE=","Date":"Fri, 31 Jul 2026 20:40:52 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] sensor: camera_sensor_legacy: Support separate H/V flips","Message-ID":"<20260731174052.GI1555869@killaraus.ideasonboard.com>","References":"<20260731143741.689779-1-stefan.klug@ideasonboard.com>\n\t<e752132e-a160-4c8e-84b3-d71336675813@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<e752132e-a160-4c8e-84b3-d71336675813@ideasonboard.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>"}}]