[{"id":19195,"web_url":"https://patchwork.libcamera.org/comment/19195/","msgid":"<20210831021339.GE20879@jade.amanokami.net>","date":"2021-08-31T02:13:39","subject":"Re: [libcamera-devel] [PATCH 04/16] android: capabilities: Collect\n\tper-stream frame durations","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Fri, Aug 27, 2021 at 02:07:45PM +0200, Jacopo Mondi wrote:\n> Collect the per-stream frame durations while building the list\n> of supported stream formats and resolutions.\n> \n> In order to get an updated list of controls it is necessary to apply\n> to the Camera the configuration we're testing, which was so far only\n> validated.\n> \n> The per-configuration durations will be used to populate the Android\n> ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS static metadata.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  src/android/camera_capabilities.cpp | 36 ++++++++++++++++++++++++++---\n>  src/android/camera_capabilities.h   |  2 ++\n>  2 files changed, 35 insertions(+), 3 deletions(-)\n> \n> diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\n> index c16e755f4695..fdda90379ce2 100644\n> --- a/src/android/camera_capabilities.cpp\n> +++ b/src/android/camera_capabilities.cpp\n> @@ -608,7 +608,29 @@ int CameraCapabilities::initializeStreamConfigurations()\n>  \t\t}\n>  \n>  \t\tfor (const Size &res : resolutions) {\n> -\t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n> +\t\t\t/*\n> +\t\t\t * Configure the Camera with the collected format and\n> +\t\t\t * resolution to get an updated list of controls.\n> +\t\t\t */\n> +\t\t\tcfg.size = res;\n> +\t\t\tint ret = camera_->configure(cameraConfig.get());\n> +\t\t\tif (ret)\n> +\t\t\t\treturn ret;\n> +\n> +\t\t\tconst ControlInfoMap &controls = camera_->controls();\n> +\t\t\tconst auto frameDurations = controls.find(\n> +\t\t\t\t&controls::FrameDurationLimits);\n> +\t\t\tif (frameDurations == controls.end()) {\n> +\t\t\t\tLOG(HAL, Error)\n> +\t\t\t\t\t<< \"Camera does not report frame durations\";\n> +\t\t\t\treturn -EINVAL;\n> +\t\t\t}\n> +\n> +\t\t\tint64_t minFrameDuration = frameDurations->second.min().get<int64_t>() * 1000;\n> +\t\t\tint64_t maxFrameDuration = frameDurations->second.max().get<int64_t>() * 1000;\n> +\t\t\tstreamConfigurations_.push_back({\n> +\t\t\t\tres, androidFormat, minFrameDuration, maxFrameDuration,\n> +\t\t\t});\n>  \n>  \t\t\t/*\n>  \t\t\t * If the format is HAL_PIXEL_FORMAT_YCbCr_420_888\n> @@ -620,10 +642,18 @@ int CameraCapabilities::initializeStreamConfigurations()\n>  \t\t\t *\n>  \t\t\t * \\todo Support JPEG streams produced by the camera\n>  \t\t\t * natively.\n> +\t\t\t *\n> +\t\t\t * \\todo HAL_PIXEL_FORMAT_BLOB is a 'stalling' format,\n> +\t\t\t * its duration should take into account the time\n> +\t\t\t * required for the YUV to JPEG encoding. For now\n> +\t\t\t * use the same frame durations as collected for\n> +\t\t\t * the YUV/RGB streams.\n>  \t\t\t */\n>  \t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888) {\n> -\t\t\t\tstreamConfigurations_.push_back(\n> -\t\t\t\t\t{ res, HAL_PIXEL_FORMAT_BLOB });\n> +\t\t\t\tstreamConfigurations_.push_back({\n> +\t\t\t\t\tres, HAL_PIXEL_FORMAT_BLOB,\n> +\t\t\t\t\tminFrameDuration, maxFrameDuration,\n> +\t\t\t\t});\n>  \t\t\t\tmaxJpegSize = std::max(maxJpegSize, res);\n>  \t\t\t}\n>  \t\t}\n> diff --git a/src/android/camera_capabilities.h b/src/android/camera_capabilities.h\n> index a12596993ee5..6e55ddab445e 100644\n> --- a/src/android/camera_capabilities.h\n> +++ b/src/android/camera_capabilities.h\n> @@ -43,6 +43,8 @@ private:\n>  \tstruct Camera3StreamConfiguration {\n>  \t\tlibcamera::Size resolution;\n>  \t\tint androidFormat;\n> +\t\tint64_t minFrameDurationNsec;\n> +\t\tint64_t maxFrameDurationNsec;\n>  \t};\n>  \n>  \tbool validateManualSensorCapability();\n> -- \n> 2.32.0\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 5EA21BD87D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 31 Aug 2021 02:13:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BBFBD6916A;\n\tTue, 31 Aug 2021 04:13:50 +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 7272D68891\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 Aug 2021 04:13:49 +0200 (CEST)","from jade.amanokami.net (KD027085206055.au-net.ne.jp\n\t[27.85.206.55])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 28704323;\n\tTue, 31 Aug 2021 04:13:46 +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=\"bN3cdO5/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1630376029;\n\tbh=105ONmzlFF1bV1xsSs5+OiqMqJAdHc/8TBcqOQ7rjlQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=bN3cdO5/MXc38LYR6BpLzUv8NZfor3I+mhU/L0FeRzT++1RjvT9ArYNHNZNNUuhcC\n\t2WdxVByi8JqD+uYoJh0VZq4vnWVPbh4XlJStISd05wCaExBrnZttbYom/tOaoPXo66\n\teUo2x/TAsC7uAoJbMArlxQUFUh9oc8VlavpmUPOQ=","Date":"Tue, 31 Aug 2021 11:13:39 +0900","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20210831021339.GE20879@jade.amanokami.net>","References":"<20210827120757.110615-1-jacopo@jmondi.org>\n\t<20210827120757.110615-5-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20210827120757.110615-5-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH 04/16] android: capabilities: Collect\n\tper-stream frame durations","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":19241,"web_url":"https://patchwork.libcamera.org/comment/19241/","msgid":"<40fadf3b-2237-bc61-1b53-e5173e339f18@ideasonboard.com>","date":"2021-09-01T06:41:19","subject":"Re: [libcamera-devel] [PATCH 04/16] android: capabilities: Collect\n\tper-stream frame durations","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 8/27/21 5:37 PM, Jacopo Mondi wrote:\n> Collect the per-stream frame durations while building the list\n> of supported stream formats and resolutions.\n>\n> In order to get an updated list of controls it is necessary to apply\n> to the Camera the configuration we're testing, which was so far only\n> validated.\n>\n> The per-configuration durations will be used to populate the Android\n> ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS static metadata.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n>   src/android/camera_capabilities.cpp | 36 ++++++++++++++++++++++++++---\n>   src/android/camera_capabilities.h   |  2 ++\n>   2 files changed, 35 insertions(+), 3 deletions(-)\n>\n> diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\n> index c16e755f4695..fdda90379ce2 100644\n> --- a/src/android/camera_capabilities.cpp\n> +++ b/src/android/camera_capabilities.cpp\n> @@ -608,7 +608,29 @@ int CameraCapabilities::initializeStreamConfigurations()\n>   \t\t}\n>   \n>   \t\tfor (const Size &res : resolutions) {\n> -\t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n> +\t\t\t/*\n> +\t\t\t * Configure the Camera with the collected format and\n> +\t\t\t * resolution to get an updated list of controls.\n> +\t\t\t */\n> +\t\t\tcfg.size = res;\n> +\t\t\tint ret = camera_->configure(cameraConfig.get());\n> +\t\t\tif (ret)\n> +\t\t\t\treturn ret;\n> +\n> +\t\t\tconst ControlInfoMap &controls = camera_->controls();\n> +\t\t\tconst auto frameDurations = controls.find(\n> +\t\t\t\t&controls::FrameDurationLimits);\n> +\t\t\tif (frameDurations == controls.end()) {\n> +\t\t\t\tLOG(HAL, Error)\n> +\t\t\t\t\t<< \"Camera does not report frame durations\";\n> +\t\t\t\treturn -EINVAL;\n> +\t\t\t}\n> +\n> +\t\t\tint64_t minFrameDuration = frameDurations->second.min().get<int64_t>() * 1000;\n> +\t\t\tint64_t maxFrameDuration = frameDurations->second.max().get<int64_t>() * 1000;\n> +\t\t\tstreamConfigurations_.push_back({\n> +\t\t\t\tres, androidFormat, minFrameDuration, maxFrameDuration,\n> +\t\t\t});\n>   \n>   \t\t\t/*\n>   \t\t\t * If the format is HAL_PIXEL_FORMAT_YCbCr_420_888\n> @@ -620,10 +642,18 @@ int CameraCapabilities::initializeStreamConfigurations()\n>   \t\t\t *\n>   \t\t\t * \\todo Support JPEG streams produced by the camera\n>   \t\t\t * natively.\n> +\t\t\t *\n> +\t\t\t * \\todo HAL_PIXEL_FORMAT_BLOB is a 'stalling' format,\n> +\t\t\t * its duration should take into account the time\n> +\t\t\t * required for the YUV to JPEG encoding. For now\n> +\t\t\t * use the same frame durations as collected for\n> +\t\t\t * the YUV/RGB streams.\n>   \t\t\t */\n>   \t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888) {\n> -\t\t\t\tstreamConfigurations_.push_back(\n> -\t\t\t\t\t{ res, HAL_PIXEL_FORMAT_BLOB });\n> +\t\t\t\tstreamConfigurations_.push_back({\n> +\t\t\t\t\tres, HAL_PIXEL_FORMAT_BLOB,\n> +\t\t\t\t\tminFrameDuration, maxFrameDuration,\n> +\t\t\t\t});\n>   \t\t\t\tmaxJpegSize = std::max(maxJpegSize, res);\n>   \t\t\t}\n>   \t\t}\n> diff --git a/src/android/camera_capabilities.h b/src/android/camera_capabilities.h\n> index a12596993ee5..6e55ddab445e 100644\n> --- a/src/android/camera_capabilities.h\n> +++ b/src/android/camera_capabilities.h\n> @@ -43,6 +43,8 @@ private:\n>   \tstruct Camera3StreamConfiguration {\n>   \t\tlibcamera::Size resolution;\n>   \t\tint androidFormat;\n> +\t\tint64_t minFrameDurationNsec;\n> +\t\tint64_t maxFrameDurationNsec;\n>   \t};\n>   \n>   \tbool validateManualSensorCapability();","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 EBD7EBD87D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  1 Sep 2021 06:41:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6FF4E69166;\n\tWed,  1 Sep 2021 08:41:25 +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 AA59860252\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  1 Sep 2021 08:41:24 +0200 (CEST)","from [192.168.1.104] (unknown [103.251.226.107])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B2BC23D7;\n\tWed,  1 Sep 2021 08:41:23 +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=\"Uh3MU8K/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1630478484;\n\tbh=rWbGKI3V+uU7d3G2WhiUcx9m71AGO+2Fn3M4QFhrgr0=;\n\th=Subject:To:References:From:Date:In-Reply-To:From;\n\tb=Uh3MU8K/t8B7vHgFJe9fdzLBq8M+SoLw9ar5wy1h4HJuDNtpfEhYJjXCZA0O6C1V1\n\tM8aaahs7udrOKxgPalRp3CTTRDiXqSTks5YKqAMg5pw5qhXHWu7ixmykYD+WrSv5Ja\n\tVSEu04bBLE3Imr0Jqn6BHviYx7b3p3WdPaGW38dE=","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20210827120757.110615-1-jacopo@jmondi.org>\n\t<20210827120757.110615-5-jacopo@jmondi.org>","From":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<40fadf3b-2237-bc61-1b53-e5173e339f18@ideasonboard.com>","Date":"Wed, 1 Sep 2021 12:11:19 +0530","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.10.2","MIME-Version":"1.0","In-Reply-To":"<20210827120757.110615-5-jacopo@jmondi.org>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"7bit","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 04/16] android: capabilities: Collect\n\tper-stream frame durations","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>"}}]