[{"id":13133,"web_url":"https://patchwork.libcamera.org/comment/13133/","msgid":"<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>","date":"2020-10-09T12:44:19","subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 09/10/2020 13:20, Jacopo Mondi wrote:\n> Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property\n> inspecting what the value returned by the pipeline handler\n> through the properties::draft::PipelineMaxDepth libcamera property.\n> \n> Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that\n> reports the processing stage a frame went through by inspecting the\n> controls::draft::PipelineDepth libcamera control reported in the\n> completed Request.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------\n>  src/android/camera_device.h   |  3 ++-\n>  2 files changed, 24 insertions(+), 7 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 0a94c1ae17ac..bccec358ea13 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -12,6 +12,7 @@\n>  #include <tuple>\n>  #include <vector>\n>  \n> +#include <libcamera/control_ids.h>\n>  #include <libcamera/controls.h>\n>  #include <libcamera/formats.h>\n>  #include <libcamera/property_ids.h>\n> @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\treturn nullptr;\n>  \t}\n>  \n> +\tconst ControlList &cameraProperties = camera_->properties();\n> +\n>  \t/* Color correction static metadata. */\n>  \tstd::vector<uint8_t> aberrationModes = {\n>  \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n>  \t\t\t\t  &partialResultCount, 1);\n>  \n> -\tuint8_t maxPipelineDepth = 2;\n> -\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> -\t\t\t\t  &maxPipelineDepth, 1);\n> +\tif (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {\n> +\t\tuint8_t maxPipelineDepth =\n> +\t\t\tcameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);\n> +\t\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> +\t\t\t\t\t  &maxPipelineDepth, 1);\n> +\t}\n\nI assume if the pipeline handler doesn't specify a max depth, and one\ndoesn't get added here, that's not a problem for android.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>  \n>  \t/* LIMITED does not support reprocessing. */\n>  \tuint32_t maxNumInputStreams = 0;\n> @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)\n>  \t * pipeline handlers) timestamp in the Request itself.\n>  \t */\n>  \tFrameBuffer *buffer = buffers.begin()->second;\n> -\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n> +\tresultMetadata = getResultMetadata(request->metadata(),\n> +\t\t\t\t\t   descriptor->frameNumber,\n>  \t\t\t\t\t   buffer->metadata().timestamp);\n>  \n>  \t/* Handle any JPEG compression. */\n> @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n>   * Produce a set of fixed result metadata.\n>   */\n>  std::unique_ptr<CameraMetadata>\n> -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> +CameraDevice::getResultMetadata(ControlList &metadata,\n> +\t\t\t\t[[maybe_unused]] int frame_number,\n>  \t\t\t\tint64_t timestamp)\n>  {\n>  \t/*\n> @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n>  \t * Currently: 18 entries, 62 bytes\n>  \t */\n>  \tstd::unique_ptr<CameraMetadata> resultMetadata =\n> -\t\tstd::make_unique<CameraMetadata>(18, 62);\n> +\t\tstd::make_unique<CameraMetadata>(19, 63);\n>  \tif (!resultMetadata->isValid()) {\n>  \t\tLOG(HAL, Error) << \"Failed to allocate static metadata\";\n>  \t\treturn nullptr;\n> @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n>  \tresultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,\n>  \t\t\t\t &scene_flicker, 1);\n>  \n> +\t/* Add metadata tags reported by libcamera. */\n> +\tif (metadata.contains(controls::draft::PipelineDepth)) {\n> +\t\tuint8_t pipeline_depth =\n> +\t\t\tmetadata.get<int32_t>(controls::draft::PipelineDepth);\n> +\t\tresultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,\n> +\t\t\t\t\t &pipeline_depth, 1);\n> +\t}\n> +\n>  \t/*\n>  \t * Return the result metadata pack even is not valid: get() will return\n>  \t * nullptr.\n> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> index 777d1a35e801..8cf1006c0840 100644\n> --- a/src/android/camera_device.h\n> +++ b/src/android/camera_device.h\n> @@ -102,7 +102,8 @@ private:\n>  \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n>  \tCameraMetadata *requestTemplatePreview();\n>  \tlibcamera::PixelFormat toPixelFormat(int format);\n> -\tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n> +\tstd::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,\n> +\t\t\t\t\t\t\t  int frame_number,\n>  \t\t\t\t\t\t\t  int64_t timestamp);\n>  \n>  \tunsigned int id_;\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 EB805BEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  9 Oct 2020 12:44:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B690E60725;\n\tFri,  9 Oct 2020 14:44:23 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3C8C660358\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  9 Oct 2020 14:44:23 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C2B55539;\n\tFri,  9 Oct 2020 14:44:22 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"TyeUE0QM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1602247462;\n\tbh=D2XSkedydyr5WEgrZBNgzHcg6ECEz91LWOgBH90oChk=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=TyeUE0QMWsBvjxvzWa2Fzqh9v8ap8RePSEFHuRHE00nQZV2sOJiTVe55Dvhar0OrM\n\tvkqdP2hvPn/Vs/bVKo+tatKzL4zzZMVBQakrmCwSGjQouQw+bFBbMQ+TmRGvyBbvQe\n\t2uy5bM1GwFSp9ir/yP4DiUlyhBJHMPD5vLg7BvFE=","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20201009122101.73858-1-jacopo@jmondi.org>\n\t<20201009122101.73858-8-jacopo@jmondi.org>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>","Date":"Fri, 9 Oct 2020 13:44:19 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201009122101.73858-8-jacopo@jmondi.org>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","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>","Reply-To":"kieran.bingham@ideasonboard.com","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13141,"web_url":"https://patchwork.libcamera.org/comment/13141/","msgid":"<20201009131924.aj32sjondeghxxtm@uno.localdomain>","date":"2020-10-09T13:19:24","subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran,\n\nOn Fri, Oct 09, 2020 at 01:44:19PM +0100, Kieran Bingham wrote:\n> Hi Jacopo,\n>\n> On 09/10/2020 13:20, Jacopo Mondi wrote:\n> > Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property\n> > inspecting what the value returned by the pipeline handler\n> > through the properties::draft::PipelineMaxDepth libcamera property.\n> >\n> > Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that\n> > reports the processing stage a frame went through by inspecting the\n> > controls::draft::PipelineDepth libcamera control reported in the\n> > completed Request.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------\n> >  src/android/camera_device.h   |  3 ++-\n> >  2 files changed, 24 insertions(+), 7 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 0a94c1ae17ac..bccec358ea13 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -12,6 +12,7 @@\n> >  #include <tuple>\n> >  #include <vector>\n> >\n> > +#include <libcamera/control_ids.h>\n> >  #include <libcamera/controls.h>\n> >  #include <libcamera/formats.h>\n> >  #include <libcamera/property_ids.h>\n> > @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> >  \t\treturn nullptr;\n> >  \t}\n> >\n> > +\tconst ControlList &cameraProperties = camera_->properties();\n> > +\n> >  \t/* Color correction static metadata. */\n> >  \tstd::vector<uint8_t> aberrationModes = {\n> >  \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> > @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> >  \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n> >  \t\t\t\t  &partialResultCount, 1);\n> >\n> > -\tuint8_t maxPipelineDepth = 2;\n> > -\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> > -\t\t\t\t  &maxPipelineDepth, 1);\n> > +\tif (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {\n> > +\t\tuint8_t maxPipelineDepth =\n> > +\t\t\tcameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);\n> > +\t\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> > +\t\t\t\t\t  &maxPipelineDepth, 1);\n> > +\t}\n>\n> I assume if the pipeline handler doesn't specify a max depth, and one\n> doesn't get added here, that's not a problem for android.\n\nThat's the right question to ask!\n\nBy points:\n1) Is this is problem for Android: it depends, Do you want to be\ncompliant with the Android requirements for the reported Android HW\nlevel ? Yes, that might be a problem, depending on which\nproperty/control the pipeline handler does not report.\n\n2) What policy do we want ? It boils down to the concept of\n\"android-aware\" pipeline handler. The Android HAL cannot, in my\nopinion, be fully Android-compliant without support in the pipeline\nhandler. It cannot produce 'default' values for properties, controls\nand metadata without breaking compliance with CTS and other tests.\nThe pipeline handler needs to report and handle the values required\nby Android, I don't see many ways around it :)\n\n>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n> >\n> >  \t/* LIMITED does not support reprocessing. */\n> >  \tuint32_t maxNumInputStreams = 0;\n> > @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)\n> >  \t * pipeline handlers) timestamp in the Request itself.\n> >  \t */\n> >  \tFrameBuffer *buffer = buffers.begin()->second;\n> > -\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n> > +\tresultMetadata = getResultMetadata(request->metadata(),\n> > +\t\t\t\t\t   descriptor->frameNumber,\n> >  \t\t\t\t\t   buffer->metadata().timestamp);\n> >\n> >  \t/* Handle any JPEG compression. */\n> > @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n> >   * Produce a set of fixed result metadata.\n> >   */\n> >  std::unique_ptr<CameraMetadata>\n> > -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> > +CameraDevice::getResultMetadata(ControlList &metadata,\n> > +\t\t\t\t[[maybe_unused]] int frame_number,\n> >  \t\t\t\tint64_t timestamp)\n> >  {\n> >  \t/*\n> > @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> >  \t * Currently: 18 entries, 62 bytes\n> >  \t */\n> >  \tstd::unique_ptr<CameraMetadata> resultMetadata =\n> > -\t\tstd::make_unique<CameraMetadata>(18, 62);\n> > +\t\tstd::make_unique<CameraMetadata>(19, 63);\n> >  \tif (!resultMetadata->isValid()) {\n> >  \t\tLOG(HAL, Error) << \"Failed to allocate static metadata\";\n> >  \t\treturn nullptr;\n> > @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> >  \tresultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,\n> >  \t\t\t\t &scene_flicker, 1);\n> >\n> > +\t/* Add metadata tags reported by libcamera. */\n> > +\tif (metadata.contains(controls::draft::PipelineDepth)) {\n> > +\t\tuint8_t pipeline_depth =\n> > +\t\t\tmetadata.get<int32_t>(controls::draft::PipelineDepth);\n> > +\t\tresultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,\n> > +\t\t\t\t\t &pipeline_depth, 1);\n> > +\t}\n> > +\n> >  \t/*\n> >  \t * Return the result metadata pack even is not valid: get() will return\n> >  \t * nullptr.\n> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > index 777d1a35e801..8cf1006c0840 100644\n> > --- a/src/android/camera_device.h\n> > +++ b/src/android/camera_device.h\n> > @@ -102,7 +102,8 @@ private:\n> >  \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n> >  \tCameraMetadata *requestTemplatePreview();\n> >  \tlibcamera::PixelFormat toPixelFormat(int format);\n> > -\tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n> > +\tstd::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,\n> > +\t\t\t\t\t\t\t  int frame_number,\n> >  \t\t\t\t\t\t\t  int64_t timestamp);\n> >\n> >  \tunsigned int id_;\n> >\n>\n> --\n> Regards\n> --\n> Kieran","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 E6CA9BEEDF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  9 Oct 2020 13:15:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7921860725;\n\tFri,  9 Oct 2020 15:15:26 +0200 (CEST)","from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net\n\t[217.70.183.201])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EAC6A60358\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  9 Oct 2020 15:15:24 +0200 (CEST)","from uno.localdomain (93-34-118-233.ip49.fastwebnet.it\n\t[93.34.118.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 635F21BF20A;\n\tFri,  9 Oct 2020 13:15:24 +0000 (UTC)"],"X-Originating-IP":"93.34.118.233","Date":"Fri, 9 Oct 2020 15:19:24 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201009131924.aj32sjondeghxxtm@uno.localdomain>","References":"<20201009122101.73858-1-jacopo@jmondi.org>\n\t<20201009122101.73858-8-jacopo@jmondi.org>\n\t<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","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","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13142,"web_url":"https://patchwork.libcamera.org/comment/13142/","msgid":"<aecb7eeb-b153-3f5d-e6b5-62f9c0d45967@ideasonboard.com>","date":"2020-10-09T13:17:56","subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 09/10/2020 14:19, Jacopo Mondi wrote:\n> Hi Kieran,\n> \n> On Fri, Oct 09, 2020 at 01:44:19PM +0100, Kieran Bingham wrote:\n>> Hi Jacopo,\n>>\n>> On 09/10/2020 13:20, Jacopo Mondi wrote:\n>>> Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property\n>>> inspecting what the value returned by the pipeline handler\n>>> through the properties::draft::PipelineMaxDepth libcamera property.\n>>>\n>>> Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that\n>>> reports the processing stage a frame went through by inspecting the\n>>> controls::draft::PipelineDepth libcamera control reported in the\n>>> completed Request.\n>>>\n>>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>>> ---\n>>>  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------\n>>>  src/android/camera_device.h   |  3 ++-\n>>>  2 files changed, 24 insertions(+), 7 deletions(-)\n>>>\n>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>>> index 0a94c1ae17ac..bccec358ea13 100644\n>>> --- a/src/android/camera_device.cpp\n>>> +++ b/src/android/camera_device.cpp\n>>> @@ -12,6 +12,7 @@\n>>>  #include <tuple>\n>>>  #include <vector>\n>>>\n>>> +#include <libcamera/control_ids.h>\n>>>  #include <libcamera/controls.h>\n>>>  #include <libcamera/formats.h>\n>>>  #include <libcamera/property_ids.h>\n>>> @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>>>  \t\treturn nullptr;\n>>>  \t}\n>>>\n>>> +\tconst ControlList &cameraProperties = camera_->properties();\n>>> +\n>>>  \t/* Color correction static metadata. */\n>>>  \tstd::vector<uint8_t> aberrationModes = {\n>>>  \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n>>> @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>>>  \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n>>>  \t\t\t\t  &partialResultCount, 1);\n>>>\n>>> -\tuint8_t maxPipelineDepth = 2;\n>>> -\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n>>> -\t\t\t\t  &maxPipelineDepth, 1);\n>>> +\tif (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {\n>>> +\t\tuint8_t maxPipelineDepth =\n>>> +\t\t\tcameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);\n>>> +\t\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n>>> +\t\t\t\t\t  &maxPipelineDepth, 1);\n>>> +\t}\n>>\n>> I assume if the pipeline handler doesn't specify a max depth, and one\n>> doesn't get added here, that's not a problem for android.\n> \n> That's the right question to ask!\n> \n> By points:\n> 1) Is this is problem for Android: it depends, Do you want to be\n> compliant with the Android requirements for the reported Android HW\n> level ? Yes, that might be a problem, depending on which\n> property/control the pipeline handler does not report.\n> \n> 2) What policy do we want ? It boils down to the concept of\n> \"android-aware\" pipeline handler. The Android HAL cannot, in my\n> opinion, be fully Android-compliant without support in the pipeline\n> handler. It cannot produce 'default' values for properties, controls\n> and metadata without breaking compliance with CTS and other tests.\n> The pipeline handler needs to report and handle the values required\n> by Android, I don't see many ways around it :)\n\nTo me, I see that we would handle this with the\n \"Pipeline Validation Tool\" *1\n\nWe can simply add tests there for any android specific requirements.\n\nthen a pipeline can be 'passed' as android capabable if it implements\nand passes those tests, and - simply not otherwise.\n\n\n*1 - ah yes the fabled tool that we really should start ...\n- Lets discuss next week, and see if we can get at least a small one\nstarted!, then it's easier to continue if it exists ;-)\n\n--\nKieran\n\n\n> \n>>\n>> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>>\n>>>\n>>>  \t/* LIMITED does not support reprocessing. */\n>>>  \tuint32_t maxNumInputStreams = 0;\n>>> @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)\n>>>  \t * pipeline handlers) timestamp in the Request itself.\n>>>  \t */\n>>>  \tFrameBuffer *buffer = buffers.begin()->second;\n>>> -\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n>>> +\tresultMetadata = getResultMetadata(request->metadata(),\n>>> +\t\t\t\t\t   descriptor->frameNumber,\n>>>  \t\t\t\t\t   buffer->metadata().timestamp);\n>>>\n>>>  \t/* Handle any JPEG compression. */\n>>> @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n>>>   * Produce a set of fixed result metadata.\n>>>   */\n>>>  std::unique_ptr<CameraMetadata>\n>>> -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n>>> +CameraDevice::getResultMetadata(ControlList &metadata,\n>>> +\t\t\t\t[[maybe_unused]] int frame_number,\n>>>  \t\t\t\tint64_t timestamp)\n>>>  {\n>>>  \t/*\n>>> @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n>>>  \t * Currently: 18 entries, 62 bytes\n>>>  \t */\n>>>  \tstd::unique_ptr<CameraMetadata> resultMetadata =\n>>> -\t\tstd::make_unique<CameraMetadata>(18, 62);\n>>> +\t\tstd::make_unique<CameraMetadata>(19, 63);\n>>>  \tif (!resultMetadata->isValid()) {\n>>>  \t\tLOG(HAL, Error) << \"Failed to allocate static metadata\";\n>>>  \t\treturn nullptr;\n>>> @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n>>>  \tresultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,\n>>>  \t\t\t\t &scene_flicker, 1);\n>>>\n>>> +\t/* Add metadata tags reported by libcamera. */\n>>> +\tif (metadata.contains(controls::draft::PipelineDepth)) {\n>>> +\t\tuint8_t pipeline_depth =\n>>> +\t\t\tmetadata.get<int32_t>(controls::draft::PipelineDepth);\n>>> +\t\tresultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,\n>>> +\t\t\t\t\t &pipeline_depth, 1);\n>>> +\t}\n>>> +\n>>>  \t/*\n>>>  \t * Return the result metadata pack even is not valid: get() will return\n>>>  \t * nullptr.\n>>> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n>>> index 777d1a35e801..8cf1006c0840 100644\n>>> --- a/src/android/camera_device.h\n>>> +++ b/src/android/camera_device.h\n>>> @@ -102,7 +102,8 @@ private:\n>>>  \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n>>>  \tCameraMetadata *requestTemplatePreview();\n>>>  \tlibcamera::PixelFormat toPixelFormat(int format);\n>>> -\tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n>>> +\tstd::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,\n>>> +\t\t\t\t\t\t\t  int frame_number,\n>>>  \t\t\t\t\t\t\t  int64_t timestamp);\n>>>\n>>>  \tunsigned int id_;\n>>>\n>>\n>> --\n>> Regards\n>> --\n>> Kieran","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 46E08BEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  9 Oct 2020 13:18:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D399C6073B;\n\tFri,  9 Oct 2020 15:18:00 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CEBE460358\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  9 Oct 2020 15:17:59 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4DAEA539;\n\tFri,  9 Oct 2020 15:17:59 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ZNNhcoKP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1602249479;\n\tbh=jpjx4LyKvtvX0Olqrz5/Pd7QfhjYjpwKcKSBIseqB3U=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=ZNNhcoKPLXhAfL755k9TqPiK9j59/YRL276rMLyyu5hFWecLoPfwBsQAcSL46HxBH\n\tJXvjFJy1354jFehKJzIOcD6qCuftUZciRCN5GnPB2feak79fI9U745dVV4MSDZulBO\n\tNKpCjliSf5BfXhvp2bqd3X4TqdAJtZTVN6COrgfA=","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20201009122101.73858-1-jacopo@jmondi.org>\n\t<20201009122101.73858-8-jacopo@jmondi.org>\n\t<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>\n\t<20201009131924.aj32sjondeghxxtm@uno.localdomain>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<aecb7eeb-b153-3f5d-e6b5-62f9c0d45967@ideasonboard.com>","Date":"Fri, 9 Oct 2020 14:17:56 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.10.0","MIME-Version":"1.0","In-Reply-To":"<20201009131924.aj32sjondeghxxtm@uno.localdomain>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13144,"web_url":"https://patchwork.libcamera.org/comment/13144/","msgid":"<20201009133228.d6dnwjespl7townr@uno.localdomain>","date":"2020-10-09T13:32:28","subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran\n\nOn Fri, Oct 09, 2020 at 02:17:56PM +0100, Kieran Bingham wrote:\n> Hi Jacopo,\n>\n> On 09/10/2020 14:19, Jacopo Mondi wrote:\n> > Hi Kieran,\n> >\n> > On Fri, Oct 09, 2020 at 01:44:19PM +0100, Kieran Bingham wrote:\n> >> Hi Jacopo,\n> >>\n> >> On 09/10/2020 13:20, Jacopo Mondi wrote:\n> >>> Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property\n> >>> inspecting what the value returned by the pipeline handler\n> >>> through the properties::draft::PipelineMaxDepth libcamera property.\n> >>>\n> >>> Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that\n> >>> reports the processing stage a frame went through by inspecting the\n> >>> controls::draft::PipelineDepth libcamera control reported in the\n> >>> completed Request.\n> >>>\n> >>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> >>> ---\n> >>>  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------\n> >>>  src/android/camera_device.h   |  3 ++-\n> >>>  2 files changed, 24 insertions(+), 7 deletions(-)\n> >>>\n> >>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> >>> index 0a94c1ae17ac..bccec358ea13 100644\n> >>> --- a/src/android/camera_device.cpp\n> >>> +++ b/src/android/camera_device.cpp\n> >>> @@ -12,6 +12,7 @@\n> >>>  #include <tuple>\n> >>>  #include <vector>\n> >>>\n> >>> +#include <libcamera/control_ids.h>\n> >>>  #include <libcamera/controls.h>\n> >>>  #include <libcamera/formats.h>\n> >>>  #include <libcamera/property_ids.h>\n> >>> @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> >>>  \t\treturn nullptr;\n> >>>  \t}\n> >>>\n> >>> +\tconst ControlList &cameraProperties = camera_->properties();\n> >>> +\n> >>>  \t/* Color correction static metadata. */\n> >>>  \tstd::vector<uint8_t> aberrationModes = {\n> >>>  \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> >>> @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> >>>  \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n> >>>  \t\t\t\t  &partialResultCount, 1);\n> >>>\n> >>> -\tuint8_t maxPipelineDepth = 2;\n> >>> -\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> >>> -\t\t\t\t  &maxPipelineDepth, 1);\n> >>> +\tif (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {\n> >>> +\t\tuint8_t maxPipelineDepth =\n> >>> +\t\t\tcameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);\n> >>> +\t\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> >>> +\t\t\t\t\t  &maxPipelineDepth, 1);\n> >>> +\t}\n> >>\n> >> I assume if the pipeline handler doesn't specify a max depth, and one\n> >> doesn't get added here, that's not a problem for android.\n> >\n> > That's the right question to ask!\n> >\n> > By points:\n> > 1) Is this is problem for Android: it depends, Do you want to be\n> > compliant with the Android requirements for the reported Android HW\n> > level ? Yes, that might be a problem, depending on which\n> > property/control the pipeline handler does not report.\n> >\n> > 2) What policy do we want ? It boils down to the concept of\n> > \"android-aware\" pipeline handler. The Android HAL cannot, in my\n> > opinion, be fully Android-compliant without support in the pipeline\n> > handler. It cannot produce 'default' values for properties, controls\n> > and metadata without breaking compliance with CTS and other tests.\n> > The pipeline handler needs to report and handle the values required\n> > by Android, I don't see many ways around it :)\n>\n> To me, I see that we would handle this with the\n>  \"Pipeline Validation Tool\" *1\n\nWithout digressing for too long, compliance with Android is not\nsomething we should try to verify ourselves imho. Versioning would be\nhell, just to name one issue that comes to mind.\n\nThere's plenty of tools provided by Android for verify compliance. We\nshould better focus on libcamera features :)\n\n>\n> We can simply add tests there for any android specific requirements.\n>\n\nIf only they were 'simple' to express, version and update. It's just\ntoo complex imho. Look at the CTS CameraTest size in example\n\n> then a pipeline can be 'passed' as android capabable if it implements\n> and passes those tests, and - simply not otherwise.\n>\n>\n> *1 - ah yes the fabled tool that we really should start ...\n> - Lets discuss next week, and see if we can get at least a small one\n> started!, then it's easier to continue if it exists ;-)\n>\n> --\n> Kieran\n>\n>\n> >\n> >>\n> >> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >>\n> >>>\n> >>>  \t/* LIMITED does not support reprocessing. */\n> >>>  \tuint32_t maxNumInputStreams = 0;\n> >>> @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)\n> >>>  \t * pipeline handlers) timestamp in the Request itself.\n> >>>  \t */\n> >>>  \tFrameBuffer *buffer = buffers.begin()->second;\n> >>> -\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n> >>> +\tresultMetadata = getResultMetadata(request->metadata(),\n> >>> +\t\t\t\t\t   descriptor->frameNumber,\n> >>>  \t\t\t\t\t   buffer->metadata().timestamp);\n> >>>\n> >>>  \t/* Handle any JPEG compression. */\n> >>> @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n> >>>   * Produce a set of fixed result metadata.\n> >>>   */\n> >>>  std::unique_ptr<CameraMetadata>\n> >>> -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> >>> +CameraDevice::getResultMetadata(ControlList &metadata,\n> >>> +\t\t\t\t[[maybe_unused]] int frame_number,\n> >>>  \t\t\t\tint64_t timestamp)\n> >>>  {\n> >>>  \t/*\n> >>> @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> >>>  \t * Currently: 18 entries, 62 bytes\n> >>>  \t */\n> >>>  \tstd::unique_ptr<CameraMetadata> resultMetadata =\n> >>> -\t\tstd::make_unique<CameraMetadata>(18, 62);\n> >>> +\t\tstd::make_unique<CameraMetadata>(19, 63);\n> >>>  \tif (!resultMetadata->isValid()) {\n> >>>  \t\tLOG(HAL, Error) << \"Failed to allocate static metadata\";\n> >>>  \t\treturn nullptr;\n> >>> @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> >>>  \tresultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,\n> >>>  \t\t\t\t &scene_flicker, 1);\n> >>>\n> >>> +\t/* Add metadata tags reported by libcamera. */\n> >>> +\tif (metadata.contains(controls::draft::PipelineDepth)) {\n> >>> +\t\tuint8_t pipeline_depth =\n> >>> +\t\t\tmetadata.get<int32_t>(controls::draft::PipelineDepth);\n> >>> +\t\tresultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,\n> >>> +\t\t\t\t\t &pipeline_depth, 1);\n> >>> +\t}\n> >>> +\n> >>>  \t/*\n> >>>  \t * Return the result metadata pack even is not valid: get() will return\n> >>>  \t * nullptr.\n> >>> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> >>> index 777d1a35e801..8cf1006c0840 100644\n> >>> --- a/src/android/camera_device.h\n> >>> +++ b/src/android/camera_device.h\n> >>> @@ -102,7 +102,8 @@ private:\n> >>>  \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n> >>>  \tCameraMetadata *requestTemplatePreview();\n> >>>  \tlibcamera::PixelFormat toPixelFormat(int format);\n> >>> -\tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n> >>> +\tstd::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,\n> >>> +\t\t\t\t\t\t\t  int frame_number,\n> >>>  \t\t\t\t\t\t\t  int64_t timestamp);\n> >>>\n> >>>  \tunsigned int id_;\n> >>>\n> >>\n> >> --\n> >> Regards\n> >> --\n> >> Kieran\n>\n> --\n> Regards\n> --\n> Kieran","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 ACDF4BEEDF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  9 Oct 2020 13:28:30 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3F44460725;\n\tFri,  9 Oct 2020 15:28:30 +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 5712960358\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  9 Oct 2020 15:28:29 +0200 (CEST)","from uno.localdomain (93-34-118-233.ip49.fastwebnet.it\n\t[93.34.118.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay3-d.mail.gandi.net (Postfix) with ESMTPSA id DF52660005;\n\tFri,  9 Oct 2020 13:28:28 +0000 (UTC)"],"X-Originating-IP":"93.34.118.233","Date":"Fri, 9 Oct 2020 15:32:28 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201009133228.d6dnwjespl7townr@uno.localdomain>","References":"<20201009122101.73858-1-jacopo@jmondi.org>\n\t<20201009122101.73858-8-jacopo@jmondi.org>\n\t<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>\n\t<20201009131924.aj32sjondeghxxtm@uno.localdomain>\n\t<aecb7eeb-b153-3f5d-e6b5-62f9c0d45967@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<aecb7eeb-b153-3f5d-e6b5-62f9c0d45967@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","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","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13174,"web_url":"https://patchwork.libcamera.org/comment/13174/","msgid":"<20201012011933.GQ3944@pendragon.ideasonboard.com>","date":"2020-10-12T01:19:33","subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Fri, Oct 09, 2020 at 03:32:28PM +0200, Jacopo Mondi wrote:\n> On Fri, Oct 09, 2020 at 02:17:56PM +0100, Kieran Bingham wrote:\n> > On 09/10/2020 14:19, Jacopo Mondi wrote:\n> > > On Fri, Oct 09, 2020 at 01:44:19PM +0100, Kieran Bingham wrote:\n> > >> On 09/10/2020 13:20, Jacopo Mondi wrote:\n> > >>> Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property\n> > >>> inspecting what the value returned by the pipeline handler\n> > >>> through the properties::draft::PipelineMaxDepth libcamera property.\n> > >>>\n> > >>> Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that\n> > >>> reports the processing stage a frame went through by inspecting the\n> > >>> controls::draft::PipelineDepth libcamera control reported in the\n> > >>> completed Request.\n> > >>>\n> > >>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > >>> ---\n> > >>>  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------\n> > >>>  src/android/camera_device.h   |  3 ++-\n> > >>>  2 files changed, 24 insertions(+), 7 deletions(-)\n> > >>>\n> > >>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > >>> index 0a94c1ae17ac..bccec358ea13 100644\n> > >>> --- a/src/android/camera_device.cpp\n> > >>> +++ b/src/android/camera_device.cpp\n> > >>> @@ -12,6 +12,7 @@\n> > >>>  #include <tuple>\n> > >>>  #include <vector>\n> > >>>\n> > >>> +#include <libcamera/control_ids.h>\n> > >>>  #include <libcamera/controls.h>\n> > >>>  #include <libcamera/formats.h>\n> > >>>  #include <libcamera/property_ids.h>\n> > >>> @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> > >>>  \t\treturn nullptr;\n> > >>>  \t}\n> > >>>\n> > >>> +\tconst ControlList &cameraProperties = camera_->properties();\n> > >>> +\n> > >>>  \t/* Color correction static metadata. */\n> > >>>  \tstd::vector<uint8_t> aberrationModes = {\n> > >>>  \t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,\n> > >>> @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> > >>>  \tstaticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,\n> > >>>  \t\t\t\t  &partialResultCount, 1);\n> > >>>\n> > >>> -\tuint8_t maxPipelineDepth = 2;\n> > >>> -\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> > >>> -\t\t\t\t  &maxPipelineDepth, 1);\n> > >>> +\tif (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {\n> > >>> +\t\tuint8_t maxPipelineDepth =\n> > >>> +\t\t\tcameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);\n> > >>> +\t\tstaticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,\n> > >>> +\t\t\t\t\t  &maxPipelineDepth, 1);\n> > >>> +\t}\n> > >>\n> > >> I assume if the pipeline handler doesn't specify a max depth, and one\n> > >> doesn't get added here, that's not a problem for android.\n> > >\n> > > That's the right question to ask!\n> > >\n> > > By points:\n> > > 1) Is this is problem for Android: it depends, Do you want to be\n> > > compliant with the Android requirements for the reported Android HW\n> > > level ? Yes, that might be a problem, depending on which\n> > > property/control the pipeline handler does not report.\n> > >\n> > > 2) What policy do we want ? It boils down to the concept of\n> > > \"android-aware\" pipeline handler. The Android HAL cannot, in my\n> > > opinion, be fully Android-compliant without support in the pipeline\n> > > handler. It cannot produce 'default' values for properties, controls\n> > > and metadata without breaking compliance with CTS and other tests.\n> > > The pipeline handler needs to report and handle the values required\n> > > by Android, I don't see many ways around it :)\n\nI don't think you'll be surprised that I disagree :-)\n\nFirst of all, there are features that libcamera doesn't provide today\n(quite a few), and that it will not provide in a foreseable future. When\nthose features are not mandatory to support for Android (for instance\nthe example that comes directly to my mind - and maybe not the best one\n- is that auto-focus isn't mandatory for fixed-lens cameras, so we could\npretend they're all fixed-lens for now :-)), we can hardcode the related\nmetadata in the HAL (for the same example, that would be hardcoding the\nlist of supported auto-focus modes to OFF). I don't see this as an\nissue, and from an Android compliance point of view, the static metadata\nentries need to be present to report the featuer is absent, but that's\nit.\n\nThen, we have features we plan to support in a relatively near future,\nwhich are exposed using draft properties and controls in this series (on\na side note I think some of the draft properties and controls fall in\nthe previous category, so we don't necessarily need to introduce them\nright now). For those, we're taking a shortcut of making the IPU3\npipeline handler Android-aware, in order to test an end-to-end\nimplementation. That's not the final goal, what we're aiming for is\ncreating libcamera properties and controls that will support those\nfeatures, to replace the draft ones. The pipeline handlers will then not\nbe Android-aware, and the Android camera HAL will translate between the\ntwo.\n\nFinally, we have features that we already support, for which translation\ncan already be implemented in the Android camera HAL (and it already is\nfor some of those features, if not all of them).\n\nI don't see why a pipeline handler would need to be Android-aware in the\nlong run.\n\n> > To me, I see that we would handle this with the\n> >  \"Pipeline Validation Tool\" *1\n> \n> Without digressing for too long, compliance with Android is not\n> something we should try to verify ourselves imho. Versioning would be\n> hell, just to name one issue that comes to mind.\n> \n> There's plenty of tools provided by Android for verify compliance. We\n> should better focus on libcamera features :)\n\nI fully agree, but we'll still need a pipeline validation tool that will\nbe the libcamera equivalent of CTS.\n\n> > We can simply add tests there for any android specific requirements.\n> \n> If only they were 'simple' to express, version and update. It's just\n> too complex imho. Look at the CTS CameraTest size in example\n> \n> > then a pipeline can be 'passed' as android capabable if it implements\n> > and passes those tests, and - simply not otherwise.\n> >\n> > *1 - ah yes the fabled tool that we really should start ...\n> > - Lets discuss next week, and see if we can get at least a small one\n> > started!, then it's easier to continue if it exists ;-)\n> >\n> > >> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > >>\n> > >>>  \t/* LIMITED does not support reprocessing. */\n> > >>>  \tuint32_t maxNumInputStreams = 0;\n> > >>> @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)\n> > >>>  \t * pipeline handlers) timestamp in the Request itself.\n> > >>>  \t */\n> > >>>  \tFrameBuffer *buffer = buffers.begin()->second;\n> > >>> -\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n> > >>> +\tresultMetadata = getResultMetadata(request->metadata(),\n> > >>> +\t\t\t\t\t   descriptor->frameNumber,\n> > >>>  \t\t\t\t\t   buffer->metadata().timestamp);\n> > >>>\n> > >>>  \t/* Handle any JPEG compression. */\n> > >>> @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)\n> > >>>   * Produce a set of fixed result metadata.\n> > >>>   */\n> > >>>  std::unique_ptr<CameraMetadata>\n> > >>> -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> > >>> +CameraDevice::getResultMetadata(ControlList &metadata,\n> > >>> +\t\t\t\t[[maybe_unused]] int frame_number,\n> > >>>  \t\t\t\tint64_t timestamp)\n> > >>>  {\n> > >>>  \t/*\n> > >>> @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> > >>>  \t * Currently: 18 entries, 62 bytes\n> > >>>  \t */\n> > >>>  \tstd::unique_ptr<CameraMetadata> resultMetadata =\n> > >>> -\t\tstd::make_unique<CameraMetadata>(18, 62);\n> > >>> +\t\tstd::make_unique<CameraMetadata>(19, 63);\n> > >>>  \tif (!resultMetadata->isValid()) {\n> > >>>  \t\tLOG(HAL, Error) << \"Failed to allocate static metadata\";\n> > >>>  \t\treturn nullptr;\n> > >>> @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,\n> > >>>  \tresultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,\n> > >>>  \t\t\t\t &scene_flicker, 1);\n> > >>>\n> > >>> +\t/* Add metadata tags reported by libcamera. */\n> > >>> +\tif (metadata.contains(controls::draft::PipelineDepth)) {\n> > >>> +\t\tuint8_t pipeline_depth =\n> > >>> +\t\t\tmetadata.get<int32_t>(controls::draft::PipelineDepth);\n> > >>> +\t\tresultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,\n> > >>> +\t\t\t\t\t &pipeline_depth, 1);\n> > >>> +\t}\n> > >>> +\n> > >>>  \t/*\n> > >>>  \t * Return the result metadata pack even is not valid: get() will return\n> > >>>  \t * nullptr.\n> > >>> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > >>> index 777d1a35e801..8cf1006c0840 100644\n> > >>> --- a/src/android/camera_device.h\n> > >>> +++ b/src/android/camera_device.h\n> > >>> @@ -102,7 +102,8 @@ private:\n> > >>>  \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n> > >>>  \tCameraMetadata *requestTemplatePreview();\n> > >>>  \tlibcamera::PixelFormat toPixelFormat(int format);\n> > >>> -\tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n> > >>> +\tstd::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,\n> > >>> +\t\t\t\t\t\t\t  int frame_number,\n> > >>>  \t\t\t\t\t\t\t  int64_t timestamp);\n> > >>>\n> > >>>  \tunsigned int id_;\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 43A01BEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 12 Oct 2020 01:20:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D442F60D49;\n\tMon, 12 Oct 2020 03:20:19 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C0FE760CE0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 12 Oct 2020 03:20:18 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 24076308;\n\tMon, 12 Oct 2020 03:20:18 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"fEDk/lkm\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1602465618;\n\tbh=oHncq31hTNjvtee/qYp/Sw9e2DJ73bqPBBdGvFE3XwI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=fEDk/lkmwdOHfa+wRqU1vzxoRxxKxpXQs+igNjR0Zogn3gBRQpz0Hx8crDbuTcG8t\n\tB8nMTOsowxpl2Y8riqN+JANszP7L2Um3pFMSmWTNHZM5H7OYMXo3O5EslSwRf8PwpD\n\txo+lTDZJqnFw6T/oudXYxJeAFMGCjKgt4eehs9rs=","Date":"Mon, 12 Oct 2020 04:19:33 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20201012011933.GQ3944@pendragon.ideasonboard.com>","References":"<20201009122101.73858-1-jacopo@jmondi.org>\n\t<20201009122101.73858-8-jacopo@jmondi.org>\n\t<cb34ce44-802a-1293-a6e8-d042328a6152@ideasonboard.com>\n\t<20201009131924.aj32sjondeghxxtm@uno.localdomain>\n\t<aecb7eeb-b153-3f5d-e6b5-62f9c0d45967@ideasonboard.com>\n\t<20201009133228.d6dnwjespl7townr@uno.localdomain>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201009133228.d6dnwjespl7townr@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH 07/10] android: camera_device: Handle\n\tPIPELINE_MAX_DEPTH","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","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]