From patchwork Wed Jan 25 22:08:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 18196 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 607A6BDC71 for ; Wed, 25 Jan 2023 22:08:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A23BC625D8; Wed, 25 Jan 2023 23:08:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1674684513; bh=5reU1KfdwvuRTRd9ZoOcTlk5BxIA9jmRxD+xPXMHCUM=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=2R2M0FGB1uGaYVxL2Kt3IHVqtimzVaM/eiaP88NZaprYVA5AK91Aj/UKCq6aJbZnr 1qUjPKnlqBG16avLLfkiPZGogGtuuTZbnJrPV+c+YeL1M0Mt7xG0fJcYpc4+fxQzGH 9BJBw0iKM+Ydn4YCjQO5dTo+GR8uS2bFlYIJLwJR9EXv03D7ei5K9UtU4mWGK8f9hb jdYST+nheZ20aprDoSXGHyI8VmRtYAvFKskUmejNJKUWCfNNXI3U9JuZglLqYC9lfT i+/K9rQi+IpeJ6sCsB2f7PmHkvvUld8iVTlOs0MN8jzfvmW7ErUR+CTxq1RohIF+9e vXUmy4owcygTg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 968E1603C0 for ; Wed, 25 Jan 2023 23:08:31 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rodpRBcu"; dkim-atps=neutral Received: from Monstersaurus.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E8E9C6E0; Wed, 25 Jan 2023 23:08:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1674684511; bh=5reU1KfdwvuRTRd9ZoOcTlk5BxIA9jmRxD+xPXMHCUM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rodpRBcudDjsMy+6L9erz4UJ+HnVrHrtpCd0BMzMd/++AXrJarK/AvIML6/h/rwFR 3FmjxfX9l2efxEQNMhDA823AjTnQV4OFz0/YbEL2qI7icMUeIqSjJZqrZ0zfDZ+/9f Uhez27dJXXF1lew1QuN78CGJyaI6bGa7se22MtRU= To: David Plowman , libcamera devel Date: Wed, 25 Jan 2023 22:08:26 +0000 Message-Id: <20230125220826.2122375-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230125132018.5725-1-david.plowman@raspberrypi.com> References: <20230125132018.5725-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] pipeline: uvcvideo: Implement AeFlickerMode X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Implement the mapping for AeFlickerMode support. Custom flicker modes are not supported by UVC devices. Signed-off-by: Kieran Bingham --- RFC: An untested implementation of the AeFlickerMode control in the UVC pipeline handler. Any particularly easy way to test this ? Perhaps we should be adding tests to lc-compliance for new control definitions? - Though I'm not sure how easily we can validate the operation of the control. But at least if it's present we can test that setting it doesn't crash the pipeline or cause errors for instance. src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 3afa1f8e4bc7..3a18f624a30a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -277,6 +277,8 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id, cid = V4L2_CID_EXPOSURE_ABSOLUTE; else if (id == controls::AnalogueGain) cid = V4L2_CID_GAIN; + else if (id == controls::AeFlickerMode) + cid = V4L2_CID_POWER_LINE_FREQUENCY; else return -EINVAL; @@ -331,6 +333,30 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id, break; } + case V4L2_CID_POWER_LINE_FREQUENCY: { + enum v4l2_power_line_frequency mode; + switch (value.get()) { + default: + case controls::FlickerCustom: + LOG(UVC, Warning) << "Unsupported AeflickerMode"; + [[fallthrough]]; + case controls::FlickerOff: + mode = V4L2_CID_POWER_LINE_FREQUENCY_DISABLED; + break; + case controls::Flicker50Hz: + mode = V4L2_CID_POWER_LINE_FREQUENCY_50HZ; + break; + case controls::Flicker60Hz: + mode = V4L2_CID_POWER_LINE_FREQUENCY_60HZ; + break; + case controls::FlickerAuto: + mode = V4L2_CID_POWER_LINE_FREQUENCY_AUTO; + break; + } + controls->set(cid, static_cast(mode)); + break; + } + default: { int32_t ivalue = value.get(); controls->set(cid, ivalue); @@ -605,6 +631,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info, case V4L2_CID_GAIN: id = &controls::AnalogueGain; break; + case V4L2_CID_POWER_LINE_FREQUENCY: + id = &controls::AeFlickerMode; + break; default: return; } @@ -689,6 +718,15 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info, break; } + case V4L2_CID_POWER_LINE_FREQUENCY: { + info = ControlInfo{ + { static_cast(controls::FlickerOff) }, + { static_cast(controls::FlickerAuto) }, + { static_cast(controls::FlickerOff) } + }; + break; + } + default: info = v4l2Info; break;