{"id":18891,"url":"https://patchwork.libcamera.org/api/1.1/patches/18891/?format=json","web_url":"https://patchwork.libcamera.org/patch/18891/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20230725125641.1557350-3-kieran.bingham@ideasonboard.com>","date":"2023-07-25T12:56:41","name":"[libcamera-devel,2/2] libcamera: pipeline: uvcvideo: Implement AeFlickerMode","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"c4e1735f3c59a8090ea3abc9996c774fc39a419b","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/1.1/people/4/?format=json","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/18891/mbox/","series":[{"id":3987,"url":"https://patchwork.libcamera.org/api/1.1/series/3987/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=3987","date":"2023-07-25T12:56:39","name":"libcamera: pipeline: AeFlickerMode support","version":1,"mbox":"https://patchwork.libcamera.org/series/3987/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/18891/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/18891/checks/","tags":{},"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 C4E8ABDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 25 Jul 2023 12:56:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id ED3EB628C4;\n\tTue, 25 Jul 2023 14:56:50 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A57E628BD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 25 Jul 2023 14:56:47 +0200 (CEST)","from Monstersaurus.local\n\t(aztw-30-b2-v4wan-166917-cust845.vm26.cable.virginm.net\n\t[82.37.23.78])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0B378EBA;\n\tTue, 25 Jul 2023 14:55:49 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1690289811;\n\tbh=zvBHbP5hQQ3RLymul2dakGq72RThh7OoxW54kOu9ffE=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=xvLVEPVFrNFGFBPFngmXc0l0M627IqVbWZgXQg0H8V+N/iErFH+db6jUViYjFeG9k\n\tY+X2Lvd3gw3HG3Q4CBW5Flc2WO1TYMETRYHxz1EX1FmifOiflIgUgDol5jqwD6TKit\n\toygdOstSJiUQnL/jpjd49c+5kC42kL+k02DwY3KbDi0WbGf2vseRosXHHMd69J0OaH\n\tjgZ+f9I0nfCzsjJP1dYz4omoV3eFp0/Fr/nvw9iaYspoe7/z+lp6JGiqw9zbXo0KdY\n\tPnhHUymK2F6sadoswV2zXEJ8w32A51RiZC8EthjzESQu4iZSp6uFsswO45iZJAtRG6\n\t/TMx9GciB8lpw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1690289749;\n\tbh=zvBHbP5hQQ3RLymul2dakGq72RThh7OoxW54kOu9ffE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=Hu6XuJWQa0zRZ5MPTm9BikBKaOCoYW/1Xi7vnravWQLpnkYPgobJ9V9gOoAbQwo2k\n\tSsBjRvYXcX2+kYI4OB0TqnO5UFbXbSN6Zq8jt7Wcpl8JAOYluI+1Pqi7DhWZuXKv+s\n\tV1FEAXnI0iBTp24LfBXIaNJLn6m6f4XyLa6jOo1k="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Hu6XuJWQ\"; dkim-atps=neutral","To":"libcamera devel <libcamera-devel@lists.libcamera.org>","Date":"Tue, 25 Jul 2023 13:56:41 +0100","Message-Id":"<20230725125641.1557350-3-kieran.bingham@ideasonboard.com>","X-Mailer":"git-send-email 2.34.1","In-Reply-To":"<20230725125641.1557350-1-kieran.bingham@ideasonboard.com>","References":"<20230725125641.1557350-1-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH 2/2] libcamera: pipeline: uvcvideo:\n\tImplement AeFlickerMode","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":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Vedant Paranjape <vedantparanjape160201@gmail.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"UVC devices often provide controls to support setting the power line\nfrequency which adapts the camera processing to avoid flicker visible to\nthe user.\n\nNow that libcamera has implemented AeFlickerMode, use the new control to\nimplement support for UVC devices.\n\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n---\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 59 ++++++++++++++++++--\n 1 file changed, 55 insertions(+), 4 deletions(-)","diff":"diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex 38f48a5d9269..365410284e5b 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -89,8 +89,8 @@ public:\n \tbool match(DeviceEnumerator *enumerator) override;\n \n private:\n-\tint processControl(ControlList *controls, unsigned int id,\n-\t\t\t   const ControlValue &value);\n+\tint processControl(Request *request, ControlList *controls,\n+\t\t\t   unsigned int id, const ControlValue &value);\n \tint processControls(UVCCameraData *data, Request *request);\n \n \tUVCCameraData *cameraData(Camera *camera)\n@@ -260,7 +260,8 @@ void PipelineHandlerUVC::stopDevice(Camera *camera)\n \tdata->video_->releaseBuffers();\n }\n \n-int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,\n+int PipelineHandlerUVC::processControl(Request *request, ControlList *controls,\n+\t\t\t\t       unsigned int id,\n \t\t\t\t       const ControlValue &value)\n {\n \tuint32_t cid;\n@@ -277,6 +278,8 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,\n \t\tcid = V4L2_CID_EXPOSURE_ABSOLUTE;\n \telse if (id == controls::AnalogueGain)\n \t\tcid = V4L2_CID_GAIN;\n+\telse if (id == controls::AeFlickerMode)\n+\t\tcid = V4L2_CID_POWER_LINE_FREQUENCY;\n \telse\n \t\treturn -EINVAL;\n \n@@ -331,6 +334,42 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,\n \t\tbreak;\n \t}\n \n+\tcase V4L2_CID_POWER_LINE_FREQUENCY: {\n+\t\tenum v4l2_power_line_frequency mode;\n+\t\tunsigned int period = request->controls().get(controls::AeFlickerPeriod)\n+\t\t\t\t\t\t\t .value_or(0);\n+\t\tswitch (value.get<int32_t>()) {\n+\t\tdefault:\n+\t\tcase controls::FlickerOff:\n+\t\t\tmode = V4L2_CID_POWER_LINE_FREQUENCY_DISABLED;\n+\t\t\tbreak;\n+\t\tcase controls::FlickerAuto:\n+\t\t\tmode = V4L2_CID_POWER_LINE_FREQUENCY_AUTO;\n+\t\t\tbreak;\n+\t\tcase controls::FlickerManual:\n+\t\t\tswitch (period) {\n+\t\t\tcase 10000: /* 100Hz in microseconds */\n+\t\t\t\tmode = V4L2_CID_POWER_LINE_FREQUENCY_50HZ;\n+\t\t\t\tbreak;\n+\t\t\tcase 8333: /* 120Hz in microseconds */\n+\t\t\t\tmode = V4L2_CID_POWER_LINE_FREQUENCY_60HZ;\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tLOG(UVC, Warning)\n+\t\t\t\t\t<< \"Unsupported AeFlickerPeriod : \"\n+\t\t\t\t\t<< period;\n+\t\t\t\t[[fallthrough]];\n+\t\t\tcase 0:\n+\t\t\t\tmode = V4L2_CID_POWER_LINE_FREQUENCY_DISABLED;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tcontrols->set(cid, static_cast<int32_t>(mode));\n+\t\tbreak;\n+\t}\n+\n \tdefault: {\n \t\tint32_t ivalue = value.get<int32_t>();\n \t\tcontrols->set(cid, ivalue);\n@@ -346,7 +385,7 @@ int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n \tControlList controls(data->video_->controls());\n \n \tfor (const auto &[id, value] : request->controls())\n-\t\tprocessControl(&controls, id, value);\n+\t\tprocessControl(request, &controls, id, value);\n \n \tfor (const auto &ctrl : controls)\n \t\tLOG(UVC, Debug)\n@@ -605,6 +644,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,\n \tcase V4L2_CID_GAIN:\n \t\tid = &controls::AnalogueGain;\n \t\tbreak;\n+\tcase V4L2_CID_POWER_LINE_FREQUENCY:\n+\t\tid = &controls::AeFlickerMode;\n+\t\tbreak;\n \tdefault:\n \t\treturn;\n \t}\n@@ -689,6 +731,15 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,\n \t\tbreak;\n \t}\n \n+\tcase V4L2_CID_POWER_LINE_FREQUENCY: {\n+\t\tinfo = ControlInfo{\n+\t\t\t{ static_cast<int>(controls::FlickerOff) },\n+\t\t\t{ static_cast<int>(controls::FlickerAuto) },\n+\t\t\t{ static_cast<int>(controls::FlickerOff) }\n+\t\t};\n+\t\tbreak;\n+\t}\n+\n \tdefault:\n \t\tinfo = v4l2Info;\n \t\tbreak;\n","prefixes":["libcamera-devel","2/2"]}