From patchwork Sat Sep 10 13:15:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 17359 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 E42A8C0DA4 for ; Sat, 10 Sep 2022 13:15:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3356C620A8; Sat, 10 Sep 2022 15:15:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1662815711; bh=P8IG4LuTNwd+tk2pNyPtqEwa7eFBKyyng1fnYF0dSdc=; h=Date:References:To:In-Reply-To:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=D3TnXtU5PddO4Y+C7gsCdpgtIfvH/kfdEI2Ax1lh3CqAAuZQBLl3sODiHwBC7vdmn i9ypJT6cumm3HAiDHDjer1KLtPklqxTIIiVC4k0Ld5K9762Ee/ndM0JMpHEpUEKKri DGHQLJqnJbrjjGM+z9T1d0cGeBt2v2BbXRWWSteqVntxGF9vwMp3r5N6p6+V8bebC7 3Oi57YEq1sDo+Ecbq5YqfXs88gUOW7cZtxXPo965xT4nTWd0M2K0KNK/AZOIpmEC1C dCrhJQ7sjWwKfDxQrm89ZHYoXTuFEwH0BSlCFEo0ROojAAJH2u82eRacWMRXRS9mf4 u2YK3Rdu2dirg== Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BE2E161F97 for ; Sat, 10 Sep 2022 15:15:09 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="ABrR2uO6"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1662815709; bh=P8IG4LuTNwd+tk2pNyPtqEwa7eFBKyyng1fnYF0dSdc=; h=X-UI-Sender-Class:Date:Subject:References:To:From:In-Reply-To; b=ABrR2uO6OBiaKzZNXfIjU7VaPq1CEV4v+tb3RD8vNi3CxnMem7n5phvQYxPt5MpCg c+xcA7C9EPsVamHo6m9C5Ps5LIDpTO4ia7HN473+pQtucaLMrW2J9ms/d1bdOf/HnL udg7Z46VQ2lr7n7W+53FhdEARPcP/lNhcMNUXd/4= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.0.158] ([88.152.184.103]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MtwZ4-1pKQ0v0vC0-00uFDm for ; Sat, 10 Sep 2022 15:15:09 +0200 Message-ID: <37d32be5-5d65-3d9d-b40a-78781f6820de@gmx.de> Date: Sat, 10 Sep 2022 15:15:09 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 References: <20220903213330.213117-1-Rauch.Christian@gmx.de> Content-Language: en-GB To: libcamera devel In-Reply-To: <20220903213330.213117-1-Rauch.Christian@gmx.de> X-Forwarded-Message-Id: <20220903213330.213117-1-Rauch.Christian@gmx.de> X-Provags-ID: V03:K1:3FKfe1lBpfZ/AGUU65k5m8Oip2SvE8BpiQgzkNJClX9kOvYCsfd 6AQ5PDQRu1KqJiaUzhkhdh+mb7ybcj5KT1zwRq6ajxCuCZfese2Z+cJGD/1fX0d9uAJbLY9 p1KDzoWmrpgvFUOYvpKfZqkZDsykNmUuSySx+gcokXqMfxGau2/N9Ejg0GLSz8N7PNO0cY+ EMk7WVTI85p36kQxM4nYg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:ANbJFiWXoq0=:UBIsBCbHAR/QU5sbbxP0eC UAbADrWZ8ojXs9C1EtbZ0/dozJxtedMr1acsQ1UcQk0y2iMPIGQt2GshUEXv+YMxfMKN1wqqw Qs8UmKOaWA0g4Li01BRK7bfskUUXdpXAxfKhARJmMbM5a2BWopfS0PHX40RU96Q64mRF+ut9Q hs1o9bAO9Q5iYG46F41k0OpRgFRM3K/BLnphR3WYmyNaGRDiAzuFxzwe31R8+7j+tji7LtoQI jS38tPJOiRDmpisjEgb40l4dACfrNf4G/pyME+rdFbHbI+5I/QGNU625EZzoDjMYYQY6Q2rWB Pkp9dxtMMj1oF938WdvVoduJNwKKdDFtKeovy6mqEDf4GAnqAoarUrjbFUm4jvOIH57/VN9bd VPHkFuTQ6D8I31C2E08fODxVFcFO8PL/2CubUeGo5AWH1Da/NGGLfHMqnWRhBzASCFjPg71Ui ahmR9U7eRIgimouDH7escCDxUY1NWjnezYER8f7DWsZqbtA/uUp7KwGuW0QPgoCZsgvLXI5bL 4x/bbV+55SkkPfWr9HezGC63NdqFuR2coyEBE8b9+p6OpV2N/smhCJG+41gjWOCGLGtfw35X4 U9g5epTCyefZZzFtwRINdWpkP47VIrVVXR0nKE2dprvDiB8w17cypkJPI3xEcXfei6IaXM2eq 8PGRX5tcYiZJOvJw1Sx/V1L7e+X8vZtI9D2hmxgDcMp3ZGOjKgghOzPcZ68J2BQ+Bmlsy8MzW 6bQK9YBjjkI6T4pGIwc6BOINJiK2rUnvMpr8oKUOfiQt8osCIePvSAmosfSHQ3HdX2H9+iVvF HpfCaLMYo8beVc16EF1JK4yfcWmExC5ad/gB6IMe3xUB4NxTsqLYFQKerZdo9oYCBToNR42p1 LbTXg3YrNxWx2bThuwBf7VnzvyiZ7ErnBc6jRFXpyT8cLZlBxtgVEGwhTlZlvOoy1zpcUeaoI 5CVkuF6P3omeNQaR/m9rXiULyY2P4+ycNpx7/eo0h0lFeWTt+bnt6JTOAwd7m27eBA6MHaDYR 7ygTbRrwxoDg86DIrZmm/Fn8UkdeQad9Vf+K3ofTkALwaEAPZ3twUnNhP4YWzoasWBO+08Gp7 nnIjQsIxcDN4ct+jtqVOMfDb3NuJmecucdt6YgLYduM+Z111RCKGHEQwzD/JfRsdCiZia5LmS /m95Ya74N3l0u7g3nmIckOHau+ Subject: [libcamera-devel] Fwd: [PATCH v4 1/2] libcamera: control_serializer: 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" Hi, To bring this up to attention again, is this something you are willing to merge to fix the issue 137? Best, Christian -------- Weitergeleitete Nachricht -------- Betreff: [PATCH v4 1/2] libcamera: control_serializer: store/load all ControlValue types Datum: Sat, 3 Sep 2022 23:33:29 +0200 Von: Christian Rauch An: libcamera-devel@lists.libcamera.org Kopie (CC): Christian Rauch , Paul Elder 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 their 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. Fixes: https://bugs.libcamera.org/show_bug.cgi?id=137 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(-) @@ -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; -- 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()); }