[{"id":17008,"web_url":"https://patchwork.libcamera.org/comment/17008/","msgid":"<20210518124152.cj3lpg7xk7qg7n2i@uno.localdomain>","date":"2021-05-18T12:41:52","subject":"Re: [libcamera-devel] [PATCH v4 6/6] android: CameraDevice: Report\n\tqueried test pattern modes","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Hiro,\n\nOn Thu, May 06, 2021 at 04:54:49PM +0900, Hirokazu Honda wrote:\n> Report test pattern modes obtained by Camera::controls().\n\nReport to the Android camera stack the list of supported test\npattern modes constructed by inspecting the values reported\nby libcamera through the controls::draft::TestPatternMode control.\n\n>\n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n>  src/android/camera_device.cpp | 46 ++++++++++++++++++++++++++++++++---\n>  1 file changed, 42 insertions(+), 4 deletions(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 3d5b5f24..a96bc09b 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1090,12 +1090,50 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>\n>  \tstaticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, &orientation_, 1);\n>\n> -\tstd::vector<int32_t> testPatterModes = {\n> -\t\tANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n> +\tconst auto &testPatternsInfo =\n> +\t\tcontrolsInfo.find(&controls::draft::TestPatternMode);\n> +\tstd::vector<int32_t> testPatternModes = {\n> +\t\tANDROID_SENSOR_TEST_PATTERN_MODE_OFF\n>  \t};\n\nShould we report OFF if testPatternsInfo == controlsInfo.end() ? Or\nshould it be reported unconditionally, as if a driver reports any\ntest pattern mode, it supports disabling it as well...\n\n\n> +\tif (testPatternsInfo != controlsInfo.end()) {\n> +\t\tconst auto &values = testPatternsInfo->second.values();\n> +\t\tif (!values.empty()) {\n\nDo we need this ? If the control is reported, it should be populated,\nright ?\n\n> +\t\t\ttestPatternModes.clear();\n> +\t\t\tfor (const auto &value : values) {\n> +\t\t\t\tint aValue = -1;\n> +\t\t\t\tswitch (value.get<int32_t>()) {\n> +\t\t\t\tcase controls::draft::TestPatternModeOff:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tcase controls::draft::TestPatternModeSolidColor:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tcase controls::draft::TestPatternModeColorBars:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tcase controls::draft::TestPatternModeColorBarsFadeToGray:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tcase controls::draft::TestPatternModePn9:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_PN9;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tcase controls::draft::TestPatternModeCustom1:\n> +\t\t\t\t\taValue = ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1;\n> +\t\t\t\t\tbreak;\n> +\t\t\t\tdefault:\n> +\t\t\t\t\tLOG(HAL, Error)\n> +\t\t\t\t\t\t<< \"Unknown test pattern mode: \"\n> +\t\t\t\t\t\t<< value.get<int32_t>();\n> +\t\t\t\t\tcontinue;\n> +\t\t\t\t}\n> +\n> +\t\t\t\ttestPatternModes.push_back(aValue);\n> +\t\t\t}\n> +\t\t}\n> +\t}\n\nWhat about:\n\n        std::vector<int32_t> testPatternModes = {\n                ANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n        };\n        const auto &testPatternsInfo = controlsInfo.find(&controls::draft::TestPatternMode);\n        if (testPatternInfo == controlsInfo.end()) {\n                const auto &values = testPatternsInfo->second.values();\n                for (const auto &value : values) {\n                        switch (value.get<int32_t>()) {\n                        case controls::draft::TestPatternModeSolidColor:\n                                testPatternModes.push_back(\n                                        ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR);\n                                break;\n                        case controls::draft::TestPatternModeColorBars:\n                                testPatternModes.push_back(\n                                        ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS);\n                                break;\n                        case controls::draft::TestPatternModeColorBarsFadeToGray:\n                                testPatternModes.push_back(\n                                        ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY);\n                                break;\n                        case controls::draft::TestPatternModePn9:\n                                testPatternModes.push_back(\n                                        ANDROID_SENSOR_TEST_PATTERN_MODE_PN9);\n                                break;\n                        case controls::draft::TestPatternModeCustom1:\n                                testPatternModes.push_back(\n                                        ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1);\n                                break;\n                        default:\n                                LOG(HAL, Error) << \"Unknown test pattern mode: \"\n                                                << value.get<int32_t>();\n                                continue;\n                        }\n                }\n        }\n\n\n>  \tstaticMetadata_->addEntry(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,\n> -\t\t\t\t  testPatterModes.data(),\n> -\t\t\t\t  testPatterModes.size());\n> +\t\t\t\t  testPatternModes.data(),\n> +\t\t\t\t  testPatternModes.size());\n\nYou should enlarge the byteSize in calculateStaticMetadataSize() to\nreserve space for all the available test pattern modes. Although\nPaul's \"android: camera_metadata: Auto-resize CameraMetadata\" went in\nalready, so probably this should just be rebased and that's it.\n\nThanks\n  j\n\n>\n>  \tuint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;\n>  \tstaticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,\n> --\n> 2.31.1.607.g51e8a6a459-goog\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 CD3B9C31FF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 18 May 2021 12:41:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 382256891C;\n\tTue, 18 May 2021 14:41:09 +0200 (CEST)","from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1053268918\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 18 May 2021 14:41:08 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 7620A60012;\n\tTue, 18 May 2021 12:41:07 +0000 (UTC)"],"Date":"Tue, 18 May 2021 14:41:52 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Hirokazu Honda <hiroh@chromium.org>","Message-ID":"<20210518124152.cj3lpg7xk7qg7n2i@uno.localdomain>","References":"<20210506075449.1761752-1-hiroh@chromium.org>\n\t<20210506075449.1761752-7-hiroh@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210506075449.1761752-7-hiroh@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v4 6/6] android: CameraDevice: Report\n\tqueried test pattern modes","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17012,"web_url":"https://patchwork.libcamera.org/comment/17012/","msgid":"<CAO5uPHPzEUxwj7Q3D_TaMao78d5+3U+AinosqE8Z7UFLq-bY4g@mail.gmail.com>","date":"2021-05-19T07:36:10","subject":"Re: [libcamera-devel] [PATCH v4 6/6] android: CameraDevice: Report\n\tqueried test pattern modes","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"content":"Hi Jacopo, thank you for reviewing.\n\nOn Tue, May 18, 2021 at 9:41 PM Jacopo Mondi <jacopo@jmondi.org> wrote:\n\n> Hi Hiro,\n>\n> On Thu, May 06, 2021 at 04:54:49PM +0900, Hirokazu Honda wrote:\n> > Report test pattern modes obtained by Camera::controls().\n>\n> Report to the Android camera stack the list of supported test\n> pattern modes constructed by inspecting the values reported\n> by libcamera through the controls::draft::TestPatternMode control.\n>\n> >\n> > Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> > ---\n> >  src/android/camera_device.cpp | 46 ++++++++++++++++++++++++++++++++---\n> >  1 file changed, 42 insertions(+), 4 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp\n> b/src/android/camera_device.cpp\n> > index 3d5b5f24..a96bc09b 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -1090,12 +1090,50 @@ const camera_metadata_t\n> *CameraDevice::getStaticMetadata()\n> >\n> >       staticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION,\n> &orientation_, 1);\n> >\n> > -     std::vector<int32_t> testPatterModes = {\n> > -             ANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n> > +     const auto &testPatternsInfo =\n> > +             controlsInfo.find(&controls::draft::TestPatternMode);\n> > +     std::vector<int32_t> testPatternModes = {\n> > +             ANDROID_SENSOR_TEST_PATTERN_MODE_OFF\n> >       };\n>\n> Should we report OFF if testPatternsInfo == controlsInfo.end() ? Or\n> should it be reported unconditionally, as if a driver reports any\n> test pattern mode, it supports disabling it as well...\n>\n\n> > +     if (testPatternsInfo != controlsInfo.end()) {\n> > +             const auto &values = testPatternsInfo->second.values();\n> > +             if (!values.empty()) {\n>\n> Do we need this ? If the control is reported, it should be populated,\n> right ?\n>\n>\nChanged to ASSERT.\n\n\n> > +                     testPatternModes.clear();\n> > +                     for (const auto &value : values) {\n> > +                             int aValue = -1;\n> > +                             switch (value.get<int32_t>()) {\n> > +                             case controls::draft::TestPatternModeOff:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_OFF;\n> > +                                     break;\n> > +                             case\n> controls::draft::TestPatternModeSolidColor:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR;\n> > +                                     break;\n> > +                             case\n> controls::draft::TestPatternModeColorBars:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS;\n> > +                                     break;\n> > +                             case\n> controls::draft::TestPatternModeColorBarsFadeToGray:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY;\n> > +                                     break;\n> > +                             case controls::draft::TestPatternModePn9:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_PN9;\n> > +                                     break;\n> > +                             case\n> controls::draft::TestPatternModeCustom1:\n> > +                                     aValue =\n> ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1;\n> > +                                     break;\n> > +                             default:\n> > +                                     LOG(HAL, Error)\n> > +                                             << \"Unknown test pattern\n> mode: \"\n> > +                                             << value.get<int32_t>();\n> > +                                     continue;\n> > +                             }\n> > +\n> > +                             testPatternModes.push_back(aValue);\n> > +                     }\n> > +             }\n> > +     }\n>\n> What about:\n>\n>         std::vector<int32_t> testPatternModes = {\n>                 ANDROID_SENSOR_TEST_PATTERN_MODE_OFF,\n>         };\n>         const auto &testPatternsInfo =\n> controlsInfo.find(&controls::draft::TestPatternMode);\n>         if (testPatternInfo == controlsInfo.end()) {\n>                 const auto &values = testPatternsInfo->second.values();\n>                 for (const auto &value : values) {\n>                         switch (value.get<int32_t>()) {\n>                         case controls::draft::TestPatternModeSolidColor:\n>                                 testPatternModes.push_back(\n>\n> ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR);\n>                                 break;\n>                         case controls::draft::TestPatternModeColorBars:\n>                                 testPatternModes.push_back(\n>\n> ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS);\n>                                 break;\n>                         case\n> controls::draft::TestPatternModeColorBarsFadeToGray:\n>                                 testPatternModes.push_back(\n>\n> ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY);\n>                                 break;\n>                         case controls::draft::TestPatternModePn9:\n>                                 testPatternModes.push_back(\n>\n> ANDROID_SENSOR_TEST_PATTERN_MODE_PN9);\n>                                 break;\n>                         case controls::draft::TestPatternModeCustom1:\n>                                 testPatternModes.push_back(\n>\n> ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1);\n>                                 break;\n>                         default:\n>                                 LOG(HAL, Error) << \"Unknown test pattern\n> mode: \"\n>                                                 << value.get<int32_t>();\n>                                 continue;\n>                         }\n>                 }\n>         }\n>\n>\n> >\n>  staticMetadata_->addEntry(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,\n> > -                               testPatterModes.data(),\n> > -                               testPatterModes.size());\n> > +                               testPatternModes.data(),\n> > +                               testPatternModes.size());\n>\n> You should enlarge the byteSize in calculateStaticMetadataSize() to\n> reserve space for all the available test pattern modes. Although\n> Paul's \"android: camera_metadata: Auto-resize CameraMetadata\" went in\n> already, so probably this should just be rebased and that's it.\n\nThanks\n>   j\n>\n> >\n> >       uint8_t timestampSource =\n> ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;\n> >       staticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,\n> > --\n> > 2.31.1.607.g51e8a6a459-goog\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel\n>","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 B29E5C31FB\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 19 May 2021 07:36:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 036796891D;\n\tWed, 19 May 2021 09:36:23 +0200 (CEST)","from mail-ej1-x635.google.com (mail-ej1-x635.google.com\n\t[IPv6:2a00:1450:4864:20::635])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BB9ED68911\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 May 2021 09:36:21 +0200 (CEST)","by mail-ej1-x635.google.com with SMTP id c20so18540648ejm.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 May 2021 00:36:21 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"clOVhcUA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=Kn76aXL5O+nn2HW5BiRdC7Zji0T7fvSgOQvbV1HHcck=;\n\tb=clOVhcUAi0XmZmq1mtjPkX5ZpaT7g4Sc9sR3EXViRQkF5D6leiKwxedOF/KLP322Ai\n\t6MMo/JhfPZq8HVi3gg/U0Hg3MBq60eEjZ58ufUvVKZD+CpCWAy0kZMDoeGL/pG5te9N4\n\tMUuUxjP3/3jWviahM/E7o1qh43FrqMTvRXGRY=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=Kn76aXL5O+nn2HW5BiRdC7Zji0T7fvSgOQvbV1HHcck=;\n\tb=K8gesIQBcAXtXhuTJq1c2K7Mwm73Qq5aUh5y5xiw/c7xJCHTks5PBmPKt4qp4zP+rN\n\tEZdTHRUJEuhhnh9D8CQkIobX9ZgZ2ouOcHKzbgcTxL86GwNNDPHoD0Tpivi2SUZHLkLC\n\tVzbKRJKPxM39av0pk+09H3VxTqz9TwBiKukhCkVkndv1lCqFa/HWwuthX3nQaypXuNOq\n\tSVb6pDzgAJgSbJBbWjXHnlIyUbigMa8eS/xLtBvzfwD7276JJFhDdGLwedSh+oHmVJQw\n\tvq1xcmnq+4Qf3x2NWDrMnOCcDHt76K7hv0eGLFrRoPqed+ubUaUTZlTbrX857l+aAA98\n\t6ueQ==","X-Gm-Message-State":"AOAM531Q51TMWRTyAYLNnC0Yby2Pzd5n7tnYC7rm5xt9bGit3MF6WbDR\n\tHFcaGiISNKdJ4omVuM9ME9MpQegfsJi2Q9lxtORp5A==","X-Google-Smtp-Source":"ABdhPJzjEL1vACEiZwIyMtTkSdXuteJOzVjw5aErvFRN6ia8tw8C9rFYUwwwCx//qITjT9AjWHjQoH0o7GHjsXB10vU=","X-Received":"by 2002:a17:907:1b06:: with SMTP id\n\tmp6mr11208344ejc.292.1621409781272; \n\tWed, 19 May 2021 00:36:21 -0700 (PDT)","MIME-Version":"1.0","References":"<20210506075449.1761752-1-hiroh@chromium.org>\n\t<20210506075449.1761752-7-hiroh@chromium.org>\n\t<20210518124152.cj3lpg7xk7qg7n2i@uno.localdomain>","In-Reply-To":"<20210518124152.cj3lpg7xk7qg7n2i@uno.localdomain>","From":"Hirokazu Honda <hiroh@chromium.org>","Date":"Wed, 19 May 2021 16:36:10 +0900","Message-ID":"<CAO5uPHPzEUxwj7Q3D_TaMao78d5+3U+AinosqE8Z7UFLq-bY4g@mail.gmail.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Content-Type":"multipart/alternative; boundary=\"0000000000000c6a1005c2a9e262\"","Subject":"Re: [libcamera-devel] [PATCH v4 6/6] android: CameraDevice: Report\n\tqueried test pattern modes","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>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]