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;