[{"id":30947,"web_url":"https://patchwork.libcamera.org/comment/30947/","msgid":"<qbegelxkmmpl5nd3y2amvzq3dsm7hvrc3k2uklpkahwaabwo2x@7a7qspv45z3y>","date":"2024-08-28T12:38:54","subject":"Re: [PATCH v2 2/3] libcamera: Add face detection controls","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hello\n\nOn Fri, Aug 23, 2024 at 02:29:09PM GMT, Harvey Yang wrote:\n> From: Yudhistira Erlandinata <yerlandinata@chromium.org>\n>\n> Add FaceDetectMode, FaceDetectFaceRectangles, FaceDetectFaceScores,\n> and FaceDetectFaceLandmark. Also add ControlTypePoint for supporting\n> FaceDetectFaceLandmark.\n>\n> BUG=b:308713855\n> TEST=emerge-geralt libcamera-mtkisp7\n\nPlease drop these\n\n>\n> Signed-off-by: Yudhistira Erlandinata <yerlandinata@chromium.org>\n> Co-developed-by: becker hsieh <beckerh@chromium.org>\n> Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> ---\n>  include/libcamera/controls.h        |  6 +++++\n>  src/libcamera/control_ids_core.yaml | 42 +++++++++++++++++++++++++++++\n>  src/libcamera/controls.cpp          |  6 +++++\n>  3 files changed, 54 insertions(+)\n>\n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index 7c2bb2872..bf1b8609c 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -34,6 +34,7 @@ enum ControlType {\n>  \tControlTypeString,\n>  \tControlTypeRectangle,\n>  \tControlTypeSize,\n> +\tControlTypePoint,\n>  };\n>\n>  namespace details {\n> @@ -87,6 +88,11 @@ struct control_type<Size> {\n>  \tstatic constexpr ControlType value = ControlTypeSize;\n>  };\n>\n> +template<>\n> +struct control_type<Point> {\n> +\tstatic constexpr ControlType value = ControlTypePoint;\n> +};\n> +\n>  template<typename T, std::size_t N>\n>  struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> {\n>  };\n> diff --git a/src/libcamera/control_ids_core.yaml b/src/libcamera/control_ids_core.yaml\n> index 6381970b4..5ff46c71e 100644\n> --- a/src/libcamera/control_ids_core.yaml\n> +++ b/src/libcamera/control_ids_core.yaml\n\nI wonder if we can already made these core controls or as long as we\ndon't have more users they should in control_ids_draft\n\n> @@ -860,6 +860,48 @@ controls:\n>              No further state changes or lens movements will occur until the\n>              AfPauseResume control is sent.\n>\n> +  - FaceDetectMode:\n> +      type: uint8_t\n> +      description: |\n> +        Reporting mode of face detection.\n\nI presume this is a metadata only control (iow can only be reported by\nthe library to the application). If that's the case this should be\nmade explicit.\n\nWe don't do so consistently in our controls definition unfortunately,\nbut some controls already specify that, like, in example,\nColorTemperature:\n\n        The ColourTemperature control can only be returned in metadata.\n\nI would do the same here if that's the case.\n\nHowever, reading your next patch, this control doesn't seem to be for\nreporting only, but can also be set by applications to control how the\npipeline behaves. That's not what the description says.\n\n\n> +\n> +      enum:\n> +        - name: FaceDetectModeOff\n> +          value: 0\n> +          description: |\n> +            Pipeline should not report face detection result.\n> +        - name: FaceDetectModeSimple\n> +          value: 1\n> +          description: |\n> +            Pipeline should at least report faces boundary rectangles and\n\nWhy \"at least\" ?\n\n> +            confidence score for each of them.\n\nHow ? Please describe here how these information are reported,\nmentioning explicitly\n\n                \\sa FaceDetectFaceRectangles\n                \\sa FaceDetectFaceScores\n\nI presume it is expected from the pipline handlers to report two lists\nof the same sizes of rectangles and scores.\n\nPlease keep in mind this documentation should be usable for other\npipeline handler implementers to implement face detection and from\napplication to understand how to interpret the results.\n\n> +\n> +  - FaceDetectFaceRectangles:\n> +      type: Rectangle\n> +      description: |\n> +        Boundary rectangle of the detected faces.\n\nThis is reported only when FaceDetectMode is set to\nFaceDetectModeSimple I presume. It has to be specified. If it's a\nmetadata only control the above suggestion of saying that explicitly\napplies.\n\n> +\n> +      size: [n]\n> +\n> +  - FaceDetectFaceScores:\n> +      type: uint8_t\n> +      description: |\n> +        Confidence score of each of the detected faces by face detector.\n> +        The range of score is [0, 100], but usually those with low confidence\n> +        scores will not be included.\n\nI think you should eitehr clarify what determines what \"low confidence\" is\nor drop that part, as it's a pipeline handler specific decision.\n\nI presume a score needs a rectangle assigned, please mention that.\n\n> +        Currently identical to ANDROID_STATISTICS_FACE_SCORES.\n\nThis makes me think all of this should go in draft controls, where we\nhave collected controls whose definition comes from the Android ones.\n\n> +\n> +      size: [n]\n> +\n> +  - FaceDetectFaceLandmark:\n> +      type: Point\n> +      description: |\n> +        Array of human face landmark coordinates in format:\n> +        [..., left_eye_i, right_eye_i, mouth_i, left_eye_i+1, ...],\n> +        with i = index of face.\n\nThis is quite vague I'm afraid.\n\nWhich are the face landmarks ? eyes and mouth ? Why not the nose ? A more\nsophisticated mechanism is required to support this and have it usable\nfor multiple platforms I'm afraid. If this is only useful for Android and\nits description comes from an Android control, move it to draf where\nwe can be slighly more liberal in defining things, as draf controls\nare by definition not expected to be stable.\n\n> +\n> +      size: [n]\n> +\n>    - HdrMode:\n>        type: int32_t\n>        description: |\n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index 11d35321c..ce73ae9d7 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -61,6 +61,7 @@ static constexpr size_t ControlValueSize[] = {\n>  \t[ControlTypeString]\t\t= sizeof(char),\n>  \t[ControlTypeRectangle]\t\t= sizeof(Rectangle),\n>  \t[ControlTypeSize]\t\t= sizeof(Size),\n> +\t[ControlTypePoint]\t\t= sizeof(Point),\n>  };\n>\n>  } /* namespace */\n> @@ -255,6 +256,11 @@ std::string ControlValue::toString() const\n>  \t\t\tstr += value->toString();\n>  \t\t\tbreak;\n>  \t\t}\n> +\t\tcase ControlTypePoint: {\n> +\t\t\tconst Point *value = reinterpret_cast<const Point *>(data);\n> +\t\t\tstr += value->toString();\n> +\t\t\tbreak;\n> +\t\t}\n>  \t\tcase ControlTypeNone:\n>  \t\tcase ControlTypeString:\n>  \t\t\tbreak;\n> --\n> 2.46.0.295.g3b9ea8a38a-goog\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 7E294C324C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 28 Aug 2024 12:39:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8430E633CD;\n\tWed, 28 Aug 2024 14:39:02 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9231F61903\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 28 Aug 2024 14:39:00 +0200 (CEST)","from ideasonboard.com (mob-5-90-141-165.net.vodafone.it\n\t[5.90.141.165])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B1AF9220;\n\tWed, 28 Aug 2024 14:37:50 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"j/Ghx9fM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1724848670;\n\tbh=IStj1WgdxoqGT657jNPyDQl18d5Qn9Pm60xAFs5lmCY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=j/Ghx9fM0R4MM49MF/LIBgjZK48nbFh28cCmhrJHMxUYMTJglN03uMdC/YCbvAQGj\n\td+mkjcCwKtrI/SpTEoksYLYe81OYqCx1yzCcoGVVUHJ+AlD5ZJlqaGNPGRlQsSpd6e\n\tudkHw9rLTGy6dCBbJDoDEj0LYGMxXbuZpSkVAQ7o=","Date":"Wed, 28 Aug 2024 14:38:54 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Harvey Yang <chenghaoyang@chromium.org>","Cc":"libcamera-devel@lists.libcamera.org, \n\tYudhistira Erlandinata <yerlandinata@chromium.org>,\n\tbecker hsieh <beckerh@chromium.org>","Subject":"Re: [PATCH v2 2/3] libcamera: Add face detection controls","Message-ID":"<qbegelxkmmpl5nd3y2amvzq3dsm7hvrc3k2uklpkahwaabwo2x@7a7qspv45z3y>","References":"<20240823143205.2668765-1-chenghaoyang@google.com>\n\t<20240823143205.2668765-3-chenghaoyang@google.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240823143205.2668765-3-chenghaoyang@google.com>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":30996,"web_url":"https://patchwork.libcamera.org/comment/30996/","msgid":"<CAEB1ahvwodvVyFsgyAJseqzTarSe-03Q5mwcDadjUF7u5gmJig@mail.gmail.com>","date":"2024-08-30T21:03:57","subject":"Re: [PATCH v2 2/3] libcamera: Add face detection controls","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Thanks Jacopo,\n\nOn Wed, Aug 28, 2024 at 2:39 PM Jacopo Mondi <jacopo.mondi@ideasonboard.com>\nwrote:\n\n> Hello\n>\n> On Fri, Aug 23, 2024 at 02:29:09PM GMT, Harvey Yang wrote:\n> > From: Yudhistira Erlandinata <yerlandinata@chromium.org>\n> >\n> > Add FaceDetectMode, FaceDetectFaceRectangles, FaceDetectFaceScores,\n> > and FaceDetectFaceLandmark. Also add ControlTypePoint for supporting\n> > FaceDetectFaceLandmark.\n> >\n> > BUG=b:308713855\n> > TEST=emerge-geralt libcamera-mtkisp7\n>\n> Please drop these\n>\nRemoved.\n\n\n>\n> >\n> > Signed-off-by: Yudhistira Erlandinata <yerlandinata@chromium.org>\n> > Co-developed-by: becker hsieh <beckerh@chromium.org>\n> > Co-developed-by: Harvey Yang <chenghaoyang@chromium.org>\n> > ---\n> >  include/libcamera/controls.h        |  6 +++++\n> >  src/libcamera/control_ids_core.yaml | 42 +++++++++++++++++++++++++++++\n> >  src/libcamera/controls.cpp          |  6 +++++\n> >  3 files changed, 54 insertions(+)\n> >\n> > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> > index 7c2bb2872..bf1b8609c 100644\n> > --- a/include/libcamera/controls.h\n> > +++ b/include/libcamera/controls.h\n> > @@ -34,6 +34,7 @@ enum ControlType {\n> >       ControlTypeString,\n> >       ControlTypeRectangle,\n> >       ControlTypeSize,\n> > +     ControlTypePoint,\n> >  };\n> >\n> >  namespace details {\n> > @@ -87,6 +88,11 @@ struct control_type<Size> {\n> >       static constexpr ControlType value = ControlTypeSize;\n> >  };\n> >\n> > +template<>\n> > +struct control_type<Point> {\n> > +     static constexpr ControlType value = ControlTypePoint;\n> > +};\n> > +\n> >  template<typename T, std::size_t N>\n> >  struct control_type<Span<T, N>> : public\n> control_type<std::remove_cv_t<T>> {\n> >  };\n> > diff --git a/src/libcamera/control_ids_core.yaml\n> b/src/libcamera/control_ids_core.yaml\n> > index 6381970b4..5ff46c71e 100644\n> > --- a/src/libcamera/control_ids_core.yaml\n> > +++ b/src/libcamera/control_ids_core.yaml\n>\n> I wonder if we can already made these core controls or as long as we\n> don't have more users they should in control_ids_draft\n>\n> > @@ -860,6 +860,48 @@ controls:\n> >              No further state changes or lens movements will occur until\n> the\n> >              AfPauseResume control is sent.\n> >\n> > +  - FaceDetectMode:\n> > +      type: uint8_t\n> > +      description: |\n> > +        Reporting mode of face detection.\n>\n> I presume this is a metadata only control (iow can only be reported by\n> the library to the application). If that's the case this should be\n> made explicit.\n>\n> We don't do so consistently in our controls definition unfortunately,\n> but some controls already specify that, like, in example,\n> ColorTemperature:\n>\n>         The ColourTemperature control can only be returned in metadata.\n>\n> I would do the same here if that's the case.\n>\n> However, reading your next patch, this control doesn't seem to be for\n> reporting only, but can also be set by applications to control how the\n> pipeline behaves. That's not what the description says.\n>\n\nRight, in Android adapter, HAL returns a list of available\nFaceDetectMode in static metadata. Application then sets a mode it\ndesires per-framely in controls. HAL returns the final mode that it\nsupports per-framely in the result metadata.\n\nTherefore, I'll keep it this way :)\n\n\n>\n>\n> > +\n> > +      enum:\n> > +        - name: FaceDetectModeOff\n> > +          value: 0\n> > +          description: |\n> > +            Pipeline should not report face detection result.\n> > +        - name: FaceDetectModeSimple\n> > +          value: 1\n> > +          description: |\n> > +            Pipeline should at least report faces boundary rectangles\n> and\n>\n> Why \"at least\" ?\n>\n\nIn Android, there's another Full mode [1] that includes face landmarks and\nface IDs. I think Yudhis didn't list Full mode here because mtkisp7 doesn't\nsupport face IDs in their face detector lib/hardware...\n\nAndroid CTS doesn't seem to care if more metadata is returned, when not\nasked for though.\n\nWe can also list FULL mode here, and let mtkisp7 pipeline handler returns\nOff & Simple modes in the static metadata. WDYT?\n\n[1]:\nhttps://developer.android.com/reference/android/hardware/camera2/CameraMetadata#STATISTICS_FACE_DETECT_MODE_FULL\n\n\n>\n> > +            confidence score for each of them.\n>\n> How ? Please describe here how these information are reported,\n> mentioning explicitly\n>\n>                 \\sa FaceDetectFaceRectangles\n>                 \\sa FaceDetectFaceScores\n>\n> I presume it is expected from the pipline handlers to report two lists\n> of the same sizes of rectangles and scores.\n>\n\nExactly. Thanks! Updated, please check again.\n\n\n>\n> Please keep in mind this documentation should be usable for other\n> pipeline handler implementers to implement face detection and from\n> application to understand how to interpret the results.\n>\n\nRight, I'll keep that in mind.\n\n\n>\n> > +\n> > +  - FaceDetectFaceRectangles:\n> > +      type: Rectangle\n> > +      description: |\n> > +        Boundary rectangle of the detected faces.\n>\n> This is reported only when FaceDetectMode is set to\n> FaceDetectModeSimple I presume. It has to be specified. If it's a\n> metadata only control the above suggestion of saying that explicitly\n> applies.\n>\n\nActually, as I mentioned above, Android doesn't seem to complain\nabout extra metadata. Therefore, it's `when` instead of `only when`.\nUpdated.\n\n\n>\n> > +\n> > +      size: [n]\n> > +\n> > +  - FaceDetectFaceScores:\n> > +      type: uint8_t\n> > +      description: |\n> > +        Confidence score of each of the detected faces by face detector.\n> > +        The range of score is [0, 100], but usually those with low\n> confidence\n> > +        scores will not be included.\n>\n> I think you should eitehr clarify what determines what \"low confidence\" is\n> or drop that part, as it's a pipeline handler specific decision.\n>\nRight, dropped.\n\n\n>\n> I presume a score needs a rectangle assigned, please mention that.\n>\nDo we need to mention that the size of faces in each metadata should\nalign in every control id involved? How about just mentioning once in\nFaceDetectModeSimple?\n\n\n>\n> > +        Currently identical to ANDROID_STATISTICS_FACE_SCORES.\n>\n> This makes me think all of this should go in draft controls, where we\n> have collected controls whose definition comes from the Android ones.\n>\n\nRight, moved to the draft ids.\n\n\n>\n> > +\n> > +      size: [n]\n> > +\n> > +  - FaceDetectFaceLandmark:\n> > +      type: Point\n> > +      description: |\n> > +        Array of human face landmark coordinates in format:\n> > +        [..., left_eye_i, right_eye_i, mouth_i, left_eye_i+1, ...],\n> > +        with i = index of face.\n>\n> This is quite vague I'm afraid.\n>\n> Which are the face landmarks ? eyes and mouth ? Why not the nose ? A more\n> sophisticated mechanism is required to support this and have it usable\n> for multiple platforms I'm afraid. If this is only useful for Android and\n> its description comes from an Android control, move it to draf where\n> we can be slighly more liberal in defining things, as draf controls\n> are by definition not expected to be stable.\n>\n\nYes, it's to be aligned with Android control [2]. Moved to the draft ids.\n\n[2]:\nhttps://android.googlesource.com/platform/system/media/+/refs/heads/main/camera/docs/docs.html#32906\n\n\n>\n> > +\n> > +      size: [n]\n> > +\n> >    - HdrMode:\n> >        type: int32_t\n> >        description: |\n> > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> > index 11d35321c..ce73ae9d7 100644\n> > --- a/src/libcamera/controls.cpp\n> > +++ b/src/libcamera/controls.cpp\n> > @@ -61,6 +61,7 @@ static constexpr size_t ControlValueSize[] = {\n> >       [ControlTypeString]             = sizeof(char),\n> >       [ControlTypeRectangle]          = sizeof(Rectangle),\n> >       [ControlTypeSize]               = sizeof(Size),\n> > +     [ControlTypePoint]              = sizeof(Point),\n> >  };\n> >\n> >  } /* namespace */\n> > @@ -255,6 +256,11 @@ std::string ControlValue::toString() const\n> >                       str += value->toString();\n> >                       break;\n> >               }\n> > +             case ControlTypePoint: {\n> > +                     const Point *value = reinterpret_cast<const Point\n> *>(data);\n> > +                     str += value->toString();\n> > +                     break;\n> > +             }\n> >               case ControlTypeNone:\n> >               case ControlTypeString:\n> >                       break;\n> > --\n> > 2.46.0.295.g3b9ea8a38a-goog\n> >\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 979B3C323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 30 Aug 2024 21:04:12 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 43BF263469;\n\tFri, 30 Aug 2024 23:04:12 +0200 (CEST)","from mail-lj1-x22b.google.com (mail-lj1-x22b.google.com\n\t[IPv6:2a00:1450:4864:20::22b])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DD9ED61E4A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Aug 2024 23:04:09 +0200 (CEST)","by mail-lj1-x22b.google.com with SMTP id\n\t38308e7fff4ca-2f4f505118fso26278201fa.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Aug 2024 14:04:09 -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=\"CudWb7vs\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1725051849; x=1725656649;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=iHSZTrRWzpkg1KIebjxKUmUoeZdXgo8aLQse9n+7Vxk=;\n\tb=CudWb7vsCBV+wxkLuHihGuv+SNWzhw7Cd/JfMld45Cof7R+7SUTQRWHWFGAZRd86zg\n\tZjx2lzRHzjQEMfRHRWAH2Jl8griox6rMPCgQAh6aK5BmsVASes83Vd1kilO+yRxSEY1q\n\tJAc6iff7qJDJnUgtaCxa+PLekLLOPiH/iwmhs=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1725051849; x=1725656649;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=iHSZTrRWzpkg1KIebjxKUmUoeZdXgo8aLQse9n+7Vxk=;\n\tb=Dby+dQDMBEchTi7IG88jekK7Qo7OQQqUAhr5GqY8CUCNFu50qUGZVepV60I+kURy5N\n\tKTVnVqOxAKxML8UTXpSxBVPmx3k3p8d6j3iBnDtF+7xM1EHRBB6Gbtm6SaKOaocLp4gZ\n\t9V+dGARSM6qwNej5LstGrOGFLmb1S201XVgdKAQpf48P/d7KNStv/8mnH7JIFaD2cAq1\n\t4PEnCMX2kovp5XE/UQ7ifZJJN35NS0IS8WY/y35MeTTSwgGk9eZ/xbhoyULLmDeF3enl\n\tpyt7rwloFkmv+Pv3ymf1Y38r3Pq7UvVITigxwpoCGSkcrIWI6P02zBRO/Zxjmt/gWakM\n\t5HAg==","X-Gm-Message-State":"AOJu0Yy3qcuNZF2iHP8F2CuKysSgqNJVKKzkrUOOflujHpr0O/Mj7pZw\n\to4R/cZtGWP5CDiNexWDCDzEBJ0QgGkG+kVf9S11sYGPMQqQ5zz1lG9B1IL8okiXkB6/RSALGinV\n\tI//zr2tyznNR5pt4rNnfm+Y/6PgxDXN6sRyeb","X-Google-Smtp-Source":"AGHT+IHLMypq1yvt2cRbXNkZSFXJrDZMDuW+am2faI6+KOPKyU7cvtrI/CFRya75o5oyYGfbl7wfbQLom74nyG9Y2oM=","X-Received":"by 2002:a2e:4e0a:0:b0:2ef:2c86:4d45 with SMTP id\n\t38308e7fff4ca-2f626586e11mr3872811fa.27.1725051848813;\n\tFri, 30 Aug 2024 14:04:08 -0700 (PDT)","MIME-Version":"1.0","References":"<20240823143205.2668765-1-chenghaoyang@google.com>\n\t<20240823143205.2668765-3-chenghaoyang@google.com>\n\t<qbegelxkmmpl5nd3y2amvzq3dsm7hvrc3k2uklpkahwaabwo2x@7a7qspv45z3y>","In-Reply-To":"<qbegelxkmmpl5nd3y2amvzq3dsm7hvrc3k2uklpkahwaabwo2x@7a7qspv45z3y>","From":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Date":"Fri, 30 Aug 2024 23:03:57 +0200","Message-ID":"<CAEB1ahvwodvVyFsgyAJseqzTarSe-03Q5mwcDadjUF7u5gmJig@mail.gmail.com>","Subject":"Re: [PATCH v2 2/3] libcamera: Add face detection controls","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tYudhistira Erlandinata <yerlandinata@chromium.org>,\n\tbecker hsieh <beckerh@chromium.org>","Content-Type":"multipart/alternative; boundary=\"000000000000ab03f90620ecee32\"","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]