From patchwork Fri Sep 2 22:49:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 17282 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 BE9D1C0DA4 for ; Fri, 2 Sep 2022 22:49:45 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id EAB9E62001; Sat, 3 Sep 2022 00:49:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1662158985; bh=Pf1zM2cu96faGPiFzQgKAai5FABxWhC/3Bsm+aHuOy8=; h=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=uGi9ezrNcFHiWXLx0g4oScuGqLlOPyhuBNg05qKFVm6wTF1eBD8JQ7VaXs+1F9kl/ 7Q4O/3JuJ1eRGDGYtDRaBsuJKbJW0SUQ7zNrY2WCDECG0VJkarS19KDyrQedIAVi9a hzyTvD3KqSmdWNe9lfcsKXAbn3XQ+OEWGC6X37zFXCBW7Wc/dH2bM7PutshJuDvB9f DBQKt0eZrRt6tvUVx3krEcm63qQDlivB1QqWUwASA2r3rOUHKWqHPWGIm8FDBwhvg3 Nvgy3yvMEuTxdtUWNNpoEkXN9QHdPsNVLdkTCFltN3ad919kMSBcoKqLbI8eufZXF/ ZB1E2WXQKFjjQ== Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CB70661FF8 for ; Sat, 3 Sep 2022 00:49:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="VQUkYX8g"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1662158982; bh=Pf1zM2cu96faGPiFzQgKAai5FABxWhC/3Bsm+aHuOy8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=VQUkYX8glNHE0coa1aZXjrVlZKjxgeDFxRiq1nmodxUfFLRDCjJ6xAZfUxGaNeyo/ WosBEzFiNyYlrcYa1ENvf1sTBDopcz6HcQeKOwpdiqqihXtIAQWLLFHmDYo05oakEy UPb71TJ8/K/c2UUJMKHGI2OaXQtEciZJSrkAwbBU= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from voyager ([88.152.184.103]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MYeMt-1oq6210nqN-00Vj2K; Sat, 03 Sep 2022 00:49:42 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 3 Sep 2022 00:49:38 +0200 Message-Id: <20220902224939.111640-1-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Provags-ID: V03:K1:oP/o1ZyMWWeK5nX1+GBQ+WFkZiOo2G3PXwkSM0Tw3ZfPLT54e8d SkZD+bhwiHmzVyMoBpU1o2BEXEv62oHoRWnmq+c2ETe+8Hh776A4OHVZln7mgnrSL6l8OIw 6I4R2q8m8YAk9Mbc8L5nQW0SQZxTR3OkZdS3liG3yxkRCdSVkEWqAsr9M5lU2LJ2cvRrR7u HKUhf4f8T6uewKcoX5dBw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:2UGm0nphP2A=:R3h62Nh2CWBtaf1bKp0PPA LlL+6dfjInlrwq9omQ/lUJgVVw2oHwjMpes8Jr9hywqHmHf38W8KI+KfnvyhA0fJcgSa2vYmE 09shJblfN6tabQcgkqUU3+gBSu2nuA+pI4Xk0j6ZGmmwneE4FSctmYhvdQEXW7eIwYAWe1PkM 6kGghJDjiX0WzD2bDDU5BSFrB0spzVHnIU0q0FPYOKhTiifPy03j+ukc6QL/R1V+uq82UvSKG H69spYz9YeUmTzAKZp5QmXOAE17OHOkPzrhNx66ft93eL5JRIAqTF7ynCBNixqVaPm98dt6b7 H+zF/3udArZKBLpJfSMTgDJh4G0qjPz48M5NcBdgkBAMQLnzEQeSMt5yRU0ZDYl97uzvXGR+P OhmFQMUqDl7wE65ry9seAcjChKZFlg6V8K+2dSpe72P2xdmhuKeeOYeuUQ6iOYkXCJUdG2IYm +cRsdgoH/da+eCZjt2zNdwNIXPzf0vnaJmDbmvJYIEqpdbDj3gFjEvHfAMdF9LIMm3JRXbl0U nqMhxHlcyoS8OvEKCuxRtS6zYnXM6pWV7CDyV3yfCt6C/nrpk0LMMDQrDU59vIAA9G3wlm3YF GFaPxBvKABkH0vuMGBX1NqI1tuwb14bb+XvNbRMNm6AY50gHB1p4eQ7tOyC5S8miwwfDQ9IS5 oVWlflSXmHcQ73+Nmxg4oRx9Fj+GEF4GDYbt2wP7Tsmb4LaRvFjmpFegdiohGH+6yvMZBQ7Su 7e7rvR1yne6Ig4vmHCDQZHXib/Q5wnMyyU+bA8xRp+uC/UB8/S2ckS0OevywES1tVgU8QQMLh zARfC0iFFDOG3lBaKOmWf8XvdFHlmCm4SH9qnDQwdxpbiwnKjmQ/AQRo8Yap3kVFH6zcHQ5As bslQvTOr9matow+TpEkUF+frxg+0BTHNDMRY+joyTPer/+DSVkXZSM9Jvzjyc84kmI0pwFGhR zYdacmPpFhsD+VhRSK2ggBQNQ1GhFHzM8ry7uVeHekZsGnYQr+Qj7Re0Hx/YKSXcYBjQ/hNoZ VAAK+Oox1XjV7YflTjBlEa0iD7U0ORaJtBqFXW2aqHozQBJWb7rbYTq6sBciISmNeLRXSIZkx 5QRLBjqaGiRl7+YASaME9hg+NeS4UQK6LQU3F519h98LKVWMmdgBexoQ2wKei2wPXDHMzMS3+ pwEy+9hfp6n5nyZWR80ocfkcXF Subject: [libcamera-devel] [PATCH v3 1/2] libcamera: serialiser: store/load all ControlValue types 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: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The min/max/def ControlValue of a ControlInfo can take arbitrary types that are different from each other and different from the ControlId type. The serialiser serialises these ControlValue separately by there type but does not store the type. The deserialiser assumes that ControlValue types match the ControlId type. If this is not the case, deserialisation will try to deserialise values of the wrong type. Fix this by serialising each of the min/max/def ControlValue's ControlType and storing it just before the serialised ControlValue. Signed-off-by: Christian Rauch Tested-by: Paul Elder Reviewed-by: Paul Elder --- .../libcamera/internal/control_serializer.h | 4 +-- src/libcamera/control_serializer.cpp | 28 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) -- 2.34.1 diff --git a/include/libcamera/internal/control_serializer.h b/include/libcamera/internal/control_serializer.h index 99e57fee..a38ca6b0 100644 --- a/include/libcamera/internal/control_serializer.h +++ b/include/libcamera/internal/control_serializer.h @@ -47,9 +47,9 @@ private: static void store(const ControlValue &value, ByteStreamBuffer &buffer); static void store(const ControlInfo &info, ByteStreamBuffer &buffer); - ControlValue loadControlValue(ControlType type, ByteStreamBuffer &buffer, + ControlValue loadControlValue(ByteStreamBuffer &buffer, bool isArray = false, unsigned int count = 1); - ControlInfo loadControlInfo(ControlType type, ByteStreamBuffer &buffer); + ControlInfo loadControlInfo(ByteStreamBuffer &buffer); unsigned int serial_; unsigned int serialSeed_; diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp index e87d2362..0cf719bd 100644 --- a/src/libcamera/control_serializer.cpp +++ b/src/libcamera/control_serializer.cpp @@ -144,7 +144,7 @@ void ControlSerializer::reset() size_t ControlSerializer::binarySize(const ControlValue &value) { - return value.data().size_bytes(); + return sizeof(ControlType) + value.data().size_bytes(); } size_t ControlSerializer::binarySize(const ControlInfo &info) @@ -195,6 +195,8 @@ size_t ControlSerializer::binarySize(const ControlList &list) void ControlSerializer::store(const ControlValue &value, ByteStreamBuffer &buffer) { + const ControlType type = value.type(); + buffer.write(&type); buffer.write(value.data()); } @@ -379,11 +381,13 @@ int ControlSerializer::serialize(const ControlList &list, return 0; } -ControlValue ControlSerializer::loadControlValue(ControlType type, - ByteStreamBuffer &buffer, +ControlValue ControlSerializer::loadControlValue(ByteStreamBuffer &buffer, bool isArray, unsigned int count) { + ControlType type; + buffer.read(&type); + ControlValue value; value.reserve(type, isArray, count); @@ -392,15 +396,11 @@ ControlValue ControlSerializer::loadControlValue(ControlType type, return value; } -ControlInfo ControlSerializer::loadControlInfo(ControlType type, - ByteStreamBuffer &b) +ControlInfo ControlSerializer::loadControlInfo(ByteStreamBuffer &b) { - if (type == ControlTypeString) - type = ControlTypeInteger32; - - ControlValue min = loadControlValue(type, b); - ControlValue max = loadControlValue(type, b); - ControlValue def = loadControlValue(type, b); + ControlValue min = loadControlValue(b); + ControlValue max = loadControlValue(b); + ControlValue def = loadControlValue(b); return ControlInfo(min, max, def); } @@ -513,7 +513,7 @@ ControlInfoMap ControlSerializer::deserialize(ByteStreamBuffer & } /* Create and store the ControlInfo. */ - ctrls.emplace(controlId, loadControlInfo(type, values)); + ctrls.emplace(controlId, loadControlInfo(values)); } /* @@ -624,10 +624,8 @@ ControlList ControlSerializer::deserialize(ByteStreamBuffer &buffer return {}; } - ControlType type = static_cast(entry->type); ctrls.set(entry->id, - loadControlValue(type, values, entry->is_array, - entry->count)); + loadControlValue(values, entry->is_array, entry->count)); } return ctrls; From patchwork Fri Sep 2 22:49:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 17283 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 E7886C327D for ; Fri, 2 Sep 2022 22:49:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9A29762003; Sat, 3 Sep 2022 00:49:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1662158985; bh=43Wc/2BpudvfrX/o3utclvPD0GpzMKvzRuoMqKNZyAc=; 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=aQuJPRWiXa3tyYwXG5gxwfYBBEl9/InlRX/4ARbP6qZEpgia9NziFuvYBd5tbOG8M 30HGrsTXl7VYBxslH8j98xn4cdnhbPrmh18HYano9eTdlxBVeQssViu0Y40pH64vzT p0SDr5+TBXN+4wDaRTPrxze46j45/0t8eP9dfPxTmAen9POVw1Xx8mpCEvNEVk4IAP c/FXV+uXh46NgLmRDt+ZaPAHOyjIsJ21gv2JaEx++POTXxkDqYoHwJVDfLNYcceaYz GLenlN8UTozjxtBvkAz9h3WpUzk9EvVPunyuuirfLrrekh5zlY5Xv0YXuoIB6gtAyO XBYlIcxvsFMUw== Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C32B161F98 for ; Sat, 3 Sep 2022 00:49:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="IA35MEPn"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1662158982; bh=43Wc/2BpudvfrX/o3utclvPD0GpzMKvzRuoMqKNZyAc=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=IA35MEPnHro8EySkf/GvRkBwE1ViYjQnP9SKMeG2tzGjEhkDmzMhRNRmzqxIXIGgQ 0tcgwp81spMPwlmBNcn5MRaNjXQlAHZmQvEu5Rnkb4+irnKWxW+QKXXPX/WsL20Uh/ 19glWxpZ7JOu19ISmOWtYsIV7z8nhon+tWnOV5AI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from voyager ([88.152.184.103]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MWASY-1os0mC1PwI-00Xeyb; Sat, 03 Sep 2022 00:49:42 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 3 Sep 2022 00:49:39 +0200 Message-Id: <20220902224939.111640-2-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220902224939.111640-1-Rauch.Christian@gmx.de> References: <20220902224939.111640-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:+U2dkuPU9DeXru8ShUM4nvi5GxyK1y2QAPuaJ7fqhAgu6GtELSK jjTyl709jJGl7PVSRSLp7Go1V2iT2nYivJAvhZvZQoAs5z8W6LgjlU9M7W/Xz2FpImeYXeZ 3Kcf5ugKJU238b9f3M581wOc3K546A9viBY1hvkKW6/biYSYzEtK1ZUvLbhhLPVGT4hi4OV zbzP3v7HdpOdO5KEkWM9g== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:+3mYHzLqsa4=:UCsUUrJ0l5GyIqZmc8dFO9 U/YRifkBDGfGf2ViDzqmNBzbH72BShAA+zscJc3YOayvds7qCvic4QB6rhX+2k7/0wtjME1u/ JGzm7l/kbYGnWlbOC580jJX+vFJeuXyBNA4DepiC2ddd98A2smKmf6V5PsP8RQTbBmyJ69Srx LPagpAIx+Lyvx1ssMvKyg98pjCh11E7DVfBfQxKbRH08Jo9cnz/A2DMvopRniSTTZomuq/mCr Rzp3mO/mf5uGF81wJe3NCbeF8sSzpgCUVTObc2BA6+s66an6yR7/x9DwCRuXr7bCaTCtucpm2 HAWls7b9Usmm3N4K/MDFbVoPV0EVY972M140HULsxTRGJwhyu3oc4DLwr15dZ0iQNmgQyjX0W CLf9l0nDt3BaEfXjSRsIHzAtLH94fQvusxKD9cQ7+ScP/1+3UHVCXwQgd+zrd392qLlcG+hYc Kyoljf/dUI44DnfDcUEhkcEfSYsSvVvEE4ZZntH1N5RCK55k7KTC1Xlt0yR/hrtmZm3a5GY1O e0VsGk0UdQUGQCKm+gBkoWuhYwN2hU1Lm7Nqhl+RvO2O8QyNG15MtfOMjuqPqPUqnAs9VGR+9 O6MswCT0tgjS7/kOdAjfjXUyAOgsHuNQ/LuRdHx2TiLnIuip6O/423fDp410ILY1Zji/NyWrx jeH2yXDH2Xj5VD5wdTubWKLT70hA4LjC04H+FyMLG2m5638sS8mAERfg+zXKf8RDbF61wkJUN kUl6JkXafDSXrY9hyI8ttDko4a4VRlriNi2LpTzwmwNjqgkKyY7OV2RjRq0ARrLeGSE5GqFDg 6bQKSj/aBXlF5d8FK6WG4L+nVK8188qGcir2+05adbEmNpPWIrJ5Pgp6PpxZ0Fzq4ZjbJSCJz xLAzetuvhjAQNU/oDpNDTYARY8R4YMOhu/EPHjhVGY/80j0novfOshDewQUBFURg6YwJZtBOE c7x4fSK5xwV4dkhnG8eaHG9bUelT23IjWDSBRWXADJr2PPp2/j9/XyjvlH1Yhj88dRsZxCAuI m6yc2oYxDiG0GRKhuBFh9QFE2Pl7zbVFNxSU4+iQUIMOWQZ+NBTN/uz+oJ9nNGKk7YUUWW56b FDVqohG8XJ4d1OImN0aqweZJBMlRi70DSXhdZnUp85cE2QSG/iDL7IUB0LMcYyV/plUmjKIa0 guzt3aLH06LVcnUvfdA58dwpHm Subject: [libcamera-devel] [PATCH v3 2/2] libcamera: control: initialise control info to ControlTypeNone by default 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: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The default ControlInfo constructor allows to partially initialised the min/max/def values. Uninitialised values are assigned to 0 by default. This implicit initialisation makes it impossible to distinguish between and uninitialised and an explicitly 0-initialised ControlValue. Default construct the ControlValue in the ControlInfo default contructor to explicitly represent uninitialised values by the ControlTypeNone type. Signed-off-by: Christian Rauch Reviewed-by: Paul Elder --- include/libcamera/controls.h | 6 +++--- test/controls/control_info.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) -- 2.34.1 diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index ebc168fc..38d0a3e8 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -268,9 +268,9 @@ private: class ControlInfo { public: - explicit ControlInfo(const ControlValue &min = 0, - const ControlValue &max = 0, - const ControlValue &def = 0); + explicit ControlInfo(const ControlValue &min = {}, + const ControlValue &max = {}, + const ControlValue &def = {}); explicit ControlInfo(Span values, const ControlValue &def = {}); explicit ControlInfo(std::set values, bool def); diff --git a/test/controls/control_info.cpp b/test/controls/control_info.cpp index 2827473b..56b4101f 100644 --- a/test/controls/control_info.cpp +++ b/test/controls/control_info.cpp @@ -26,8 +26,8 @@ protected: */ ControlInfo brightness; - if (brightness.min().get() != 0 || - brightness.max().get() != 0) { + if (brightness.min().type() != ControlType::ControlTypeNone || + brightness.max().type() != ControlType::ControlTypeNone) { cout << "Invalid control range for Brightness" << endl; return TestFail; }