[{"id":14906,"web_url":"https://patchwork.libcamera.org/comment/14906/","msgid":"<0ec37cd7-19f8-fad2-b608-e0686b1d342b@ideasonboard.com>","date":"2021-02-02T15:23:22","subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 02/02/2021 12:36, Jacopo Mondi wrote:\n> Calculate the JPEG maximum size using the maximum preview format size\n> multiplied by a 1.5 factor.\n> \n> The same multiplication factor is used in the existing HAL\n> implementation in ChromeOS.\n\nThis is definitely better than the somewhat arbitrary fixed value I\npicked from another HAL.\n\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/android/camera_device.cpp | 21 ++++++++++-----------\n>  1 file changed, 10 insertions(+), 11 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index a50b0ebfe60e..cb87d97888ed 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer\n>  {\n>  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n>  \n> -\t/*\n> -\t * \\todo Determine a more accurate value for this during\n> -\t *  streamConfiguration.\n> -\t */\n> -\tmaxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */\n> -\n>  \tmaker_ = \"libcamera\";\n>  \tmodel_ = \"cameraModel\";\n>  \n> @@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()\n>  \t\t\t\t\t\t\tmappedFormat,\n>  \t\t\t\t\t\t\tcameraResolutions);\n>  \n> +\t\tSize maxJpegSize;\n>  \t\tfor (const Size &res : resolutions) {\n>  \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n>  \n> @@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()\n>  \t\t\t * \\todo Support JPEG streams produced by the Camera\n>  \t\t\t * natively.\n>  \t\t\t */\n> -\t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)\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> +\n> +\t\t\t\tif (res > maxJpegSize) {\n\nAha, so this runs over each of the supported stream configurations and\nthus only the max gets through ? is that right?\n\n(I think it is, so there's no issue)\n\n> +\t\t\t\t\tmaxJpegSize = res;\n> +\t\t\t\t\tmaxJpegBufferSize_ = maxJpegSize.width\n> +\t\t\t\t\t\t\t   * maxJpegSize.height\n> +\t\t\t\t\t\t\t   * 1.5;\n> +\t\t\t\t}\n> +\t\t\t}\n>  \t\t}\n>  \t}\n>  \n> @@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>  \t\t\t\t  availableThumbnailSizes.data(),\n>  \t\t\t\t  availableThumbnailSizes.size());\n>  \n> -\t/*\n> -\t * \\todo Calculate the maximum JPEG buffer size by asking the encoder\n> -\t * giving the maximum frame size required.\n> -\t */\n\nIs this no longer worth considering?\nI sort of agree at the moment. And if we decide we want to ask the\nencoders we can handle that later. I don't think we need to worry about\nthe todo.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n>  \tstaticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);\n>  \n>  \t/* Sensor static metadata. */\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 CE590BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  2 Feb 2021 15:23:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 619FA68429;\n\tTue,  2 Feb 2021 16:23:26 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A18960307\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  2 Feb 2021 16:23:25 +0100 (CET)","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 B547DD84;\n\tTue,  2 Feb 2021 16:23:24 +0100 (CET)"],"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=\"cgPYk9sP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1612279405;\n\tbh=4QpfIHX19JMUj96bNn2lANvucD62V7SrAnOZTXUJrqs=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=cgPYk9sPtcjsxPeufayvmr1vmptwm9tee5enzsTEESmlnidq22CXyhBkyFGeNrCm+\n\t25LHo7VIDEkFaoJlFjvMp8ptAEStgRHX63sN9vtPILEcP7hoDd7T/k9EHDys8EdQ11\n\tqYgdJqrjgttgekI74HMuPTUBjFSp6tawyLFUw+ew=","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20210202123620.45200-1-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":"<0ec37cd7-19f8-fad2-b608-e0686b1d342b@ideasonboard.com>","Date":"Tue, 2 Feb 2021 15:23:22 +0000","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":"<20210202123620.45200-1-jacopo@jmondi.org>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","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":14907,"web_url":"https://patchwork.libcamera.org/comment/14907/","msgid":"<20210202155046.wuqyajvxft2wujxj@uno.localdomain>","date":"2021-02-02T15:50:46","subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran,\n\nOn Tue, Feb 02, 2021 at 03:23:22PM +0000, Kieran Bingham wrote:\n> Hi Jacopo,\n>\n> On 02/02/2021 12:36, Jacopo Mondi wrote:\n> > Calculate the JPEG maximum size using the maximum preview format size\n> > multiplied by a 1.5 factor.\n> >\n> > The same multiplication factor is used in the existing HAL\n> > implementation in ChromeOS.\n>\n> This is definitely better than the somewhat arbitrary fixed value I\n> picked from another HAL.\n>\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/android/camera_device.cpp | 21 ++++++++++-----------\n> >  1 file changed, 10 insertions(+), 11 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index a50b0ebfe60e..cb87d97888ed 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer\n> >  {\n> >  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n> >\n> > -\t/*\n> > -\t * \\todo Determine a more accurate value for this during\n> > -\t *  streamConfiguration.\n> > -\t */\n> > -\tmaxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */\n> > -\n> >  \tmaker_ = \"libcamera\";\n> >  \tmodel_ = \"cameraModel\";\n> >\n> > @@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()\n> >  \t\t\t\t\t\t\tmappedFormat,\n> >  \t\t\t\t\t\t\tcameraResolutions);\n> >\n> > +\t\tSize maxJpegSize;\n> >  \t\tfor (const Size &res : resolutions) {\n> >  \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n> >\n> > @@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()\n> >  \t\t\t * \\todo Support JPEG streams produced by the Camera\n> >  \t\t\t * natively.\n> >  \t\t\t */\n> > -\t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)\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> > +\n> > +\t\t\t\tif (res > maxJpegSize) {\n>\n> Aha, so this runs over each of the supported stream configurations and\n> thus only the max gets through ? is that right?\n\nyes, this collects the maximum YUV size from which we encode JPEG\n\n>\n> (I think it is, so there's no issue)\n>\n> > +\t\t\t\t\tmaxJpegSize = res;\n> > +\t\t\t\t\tmaxJpegBufferSize_ = maxJpegSize.width\n> > +\t\t\t\t\t\t\t   * maxJpegSize.height\n> > +\t\t\t\t\t\t\t   * 1.5;\n> > +\t\t\t\t}\n> > +\t\t\t}\n> >  \t\t}\n> >  \t}\n> >\n> > @@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> >  \t\t\t\t  availableThumbnailSizes.data(),\n> >  \t\t\t\t  availableThumbnailSizes.size());\n> >\n> > -\t/*\n> > -\t * \\todo Calculate the maximum JPEG buffer size by asking the encoder\n> > -\t * giving the maximum frame size required.\n> > -\t */\n>\n> Is this no longer worth considering?\n> I sort of agree at the moment. And if we decide we want to ask the\n> encoders we can handle that later. I don't think we need to worry about\n> the todo.\n\nI don't know for sure :/\nAlso the 1.5 ratio is a copy&paste from the existing HALs\n\n>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n>\n> >  \tstaticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);\n> >\n> >  \t/* Sensor static metadata. */\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 13522BD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  2 Feb 2021 15:50:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AC1CD6842A;\n\tTue,  2 Feb 2021 16:50:26 +0100 (CET)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3FFEB60307\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  2 Feb 2021 16:50:25 +0100 (CET)","from uno.localdomain (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id BFC63C0010;\n\tTue,  2 Feb 2021 15:50:24 +0000 (UTC)"],"X-Originating-IP":"93.61.96.190","Date":"Tue, 2 Feb 2021 16:50:46 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20210202155046.wuqyajvxft2wujxj@uno.localdomain>","References":"<20210202123620.45200-1-jacopo@jmondi.org>\n\t<0ec37cd7-19f8-fad2-b608-e0686b1d342b@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<0ec37cd7-19f8-fad2-b608-e0686b1d342b@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","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":15031,"web_url":"https://patchwork.libcamera.org/comment/15031/","msgid":"<811eac7e-f739-4713-72dd-c6d520946a01@uajain.com>","date":"2021-02-05T16:01:52","subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/","name":"Umang Jain","email":"email@uajain.com"},"content":"Hi Jacopo\n\nOn 2/2/21 6:06 PM, Jacopo Mondi wrote:\n> Calculate the JPEG maximum size using the maximum preview format size\n> multiplied by a 1.5 factor.\n>\n> The same multiplication factor is used in the existing HAL\n> implementation in ChromeOS.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>   src/android/camera_device.cpp | 21 ++++++++++-----------\n>   1 file changed, 10 insertions(+), 11 deletions(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index a50b0ebfe60e..cb87d97888ed 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer\n>   {\n>   \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n>   \n> -\t/*\n> -\t * \\todo Determine a more accurate value for this during\n> -\t *  streamConfiguration.\n> -\t */\n> -\tmaxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */\n> -\nSince we are removing from constructor, I would add a initialize value \nto 0, in constructor initializer list above, since this is (now) used \ninside a conditional block in initializeStreamConfigurations()\n\nOther than that;\n\nReviewed-by: Umang Jain <email@uajain.com>\n>   \tmaker_ = \"libcamera\";\n>   \tmodel_ = \"cameraModel\";\n>   \n> @@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()\n>   \t\t\t\t\t\t\tmappedFormat,\n>   \t\t\t\t\t\t\tcameraResolutions);\n>   \n> +\t\tSize maxJpegSize;\n>   \t\tfor (const Size &res : resolutions) {\n>   \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n>   \n> @@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()\n>   \t\t\t * \\todo Support JPEG streams produced by the Camera\n>   \t\t\t * natively.\n>   \t\t\t */\n> -\t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)\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> +\n> +\t\t\t\tif (res > maxJpegSize) {\n> +\t\t\t\t\tmaxJpegSize = res;\n> +\t\t\t\t\tmaxJpegBufferSize_ = maxJpegSize.width\n> +\t\t\t\t\t\t\t   * maxJpegSize.height\n> +\t\t\t\t\t\t\t   * 1.5;\n> +\t\t\t\t}\n> +\t\t\t}\n>   \t\t}\n>   \t}\n>   \n> @@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n>   \t\t\t\t  availableThumbnailSizes.data(),\n>   \t\t\t\t  availableThumbnailSizes.size());\n>   \n> -\t/*\n> -\t * \\todo Calculate the maximum JPEG buffer size by asking the encoder\n> -\t * giving the maximum frame size required.\n> -\t */\n>   \tstaticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);\n>   \n>   \t/* Sensor static metadata. */","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 DAE76BD162\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  5 Feb 2021 16:02:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 646DA614BA;\n\tFri,  5 Feb 2021 17:02:00 +0100 (CET)","from mail.uajain.com (static.126.159.217.95.clients.your-server.de\n\t[95.217.159.126])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 16385614B0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  5 Feb 2021 17:01:57 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=uajain.com header.i=@uajain.com\n\theader.b=\"daVRnHpU\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=uajain.com; s=mail;\n\tt=1612540916; bh=76KrxxnR/qQDbQUQe16x8mvNtzF5A4vbJBLWrO5jXGM=;\n\th=Subject:To:References:From:In-Reply-To;\n\tb=daVRnHpUsK+dh3hR66IjpIljDmym3aVk/bAfBism+FVFW8i2iF8au+KxuweBdzbRS\n\tJFzhIF5CBWdpw16/Y6GiBxXJiL6G8vLZH/2MGBWHL/MTjQBhfR1fEzmCNWAPQ4Fpqd\n\tvz8djizQ0LgqQf+twaqR5892uCgN/k9sK/G1TFZaGK3f2mlAumqD66tMHNHHBBuoYy\n\tREKwzB26SVi2/VIU/wjqOW7iUDC5yTMJWS+ID/eSfTxbZFHQMJrOcs4c8MwpLeZnDI\n\thJv3da55Yk9U+gO+a43qA9AWeLPvBnvHRnidHOnchpMR75cu4mIO5rC5MHwTd6NPRh\n\tgqaDpuf2iwioQ==","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20210202123620.45200-1-jacopo@jmondi.org>","From":"Umang Jain <email@uajain.com>","Message-ID":"<811eac7e-f739-4713-72dd-c6d520946a01@uajain.com>","Date":"Fri, 5 Feb 2021 21:31:52 +0530","Mime-Version":"1.0","In-Reply-To":"<20210202123620.45200-1-jacopo@jmondi.org>","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","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>","Content-Transfer-Encoding":"7bit","Content-Type":"text/plain; charset=\"us-ascii\"; Format=\"flowed\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":15034,"web_url":"https://patchwork.libcamera.org/comment/15034/","msgid":"<YB/cwPkjzd4lhXhP@pendragon.ideasonboard.com>","date":"2021-02-07T12:27:44","subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Tue, Feb 02, 2021 at 04:50:46PM +0100, Jacopo Mondi wrote:\n> On Tue, Feb 02, 2021 at 03:23:22PM +0000, Kieran Bingham wrote:\n> > On 02/02/2021 12:36, Jacopo Mondi wrote:\n> > > Calculate the JPEG maximum size using the maximum preview format size\n> > > multiplied by a 1.5 factor.\n> > >\n> > > The same multiplication factor is used in the existing HAL\n> > > implementation in ChromeOS.\n> >\n> > This is definitely better than the somewhat arbitrary fixed value I\n> > picked from another HAL.\n> >\n> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > > ---\n> > >  src/android/camera_device.cpp | 21 ++++++++++-----------\n> > >  1 file changed, 10 insertions(+), 11 deletions(-)\n> > >\n> > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > > index a50b0ebfe60e..cb87d97888ed 100644\n> > > --- a/src/android/camera_device.cpp\n> > > +++ b/src/android/camera_device.cpp\n> > > @@ -347,12 +347,6 @@ CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camer\n> > >  {\n> > >  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n> > >\n> > > -\t/*\n> > > -\t * \\todo Determine a more accurate value for this during\n> > > -\t *  streamConfiguration.\n> > > -\t */\n> > > -\tmaxJpegBufferSize_ = 13 << 20; /* 13631488 from USB HAL */\n> > > -\n> > >  \tmaker_ = \"libcamera\";\n> > >  \tmodel_ = \"cameraModel\";\n> > >\n> > > @@ -629,6 +623,7 @@ int CameraDevice::initializeStreamConfigurations()\n> > >  \t\t\t\t\t\t\tmappedFormat,\n> > >  \t\t\t\t\t\t\tcameraResolutions);\n> > >\n> > > +\t\tSize maxJpegSize;\n> > >  \t\tfor (const Size &res : resolutions) {\n> > >  \t\t\tstreamConfigurations_.push_back({ res, androidFormat });\n> > >\n> > > @@ -643,9 +638,17 @@ int CameraDevice::initializeStreamConfigurations()\n> > >  \t\t\t * \\todo Support JPEG streams produced by the Camera\n> > >  \t\t\t * natively.\n> > >  \t\t\t */\n> > > -\t\t\tif (androidFormat == HAL_PIXEL_FORMAT_YCbCr_420_888)\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> > > +\n> > > +\t\t\t\tif (res > maxJpegSize) {\n> >\n> > Aha, so this runs over each of the supported stream configurations and\n> > thus only the max gets through ? is that right?\n> \n> yes, this collects the maximum YUV size from which we encode JPEG\n> \n> > (I think it is, so there's no issue)\n> >\n> > > +\t\t\t\t\tmaxJpegSize = res;\n> > > +\t\t\t\t\tmaxJpegBufferSize_ = maxJpegSize.width\n> > > +\t\t\t\t\t\t\t   * maxJpegSize.height\n> > > +\t\t\t\t\t\t\t   * 1.5;\n\nYou could move the calculation of maxJpegBufferSize_ after the loop.\nYoul could also write the maxJpegSize calculation as\n\n\t\t\t\tmaxJpegSize = std::max(maxJpegSize, res);\n\nI'd do at least the former to make sure maxJpegBufferSize_ gets\ninitialized in all code paths. Up to you for the latter.\n\n> > > +\t\t\t\t}\n> > > +\t\t\t}\n> > >  \t\t}\n> > >  \t}\n> > >\n> > > @@ -878,10 +881,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n> > >  \t\t\t\t  availableThumbnailSizes.data(),\n> > >  \t\t\t\t  availableThumbnailSizes.size());\n> > >\n> > > -\t/*\n> > > -\t * \\todo Calculate the maximum JPEG buffer size by asking the encoder\n> > > -\t * giving the maximum frame size required.\n> > > -\t */\n> >\n> > Is this no longer worth considering?\n> > I sort of agree at the moment. And if we decide we want to ask the\n> > encoders we can handle that later. I don't think we need to worry about\n> > the todo.\n> \n> I don't know for sure :/\n> Also the 1.5 ratio is a copy&paste from the existing HALs\n\nI think it's worth keeping the todo. You could move it to\nCameraDevice::initializeStreamConfigurations() right before setting\nmaxJpegBufferSize_. We're one step closer to addressing this as we now\ncalculate the maximum frame size, the last remaining matter will be to\nmove the maxJpegBufferSize calculation to the encoder class.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> >\n> > >  \tstaticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);\n> > >\n> > >  \t/* Sensor static metadata. */","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 46905BD162\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun,  7 Feb 2021 12:28:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 94768614C1;\n\tSun,  7 Feb 2021 13:28:10 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 89C6161402\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  7 Feb 2021 13:28:08 +0100 (CET)","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 E0994240;\n\tSun,  7 Feb 2021 13:28:07 +0100 (CET)"],"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=\"eJKONYps\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1612700888;\n\tbh=2BrUlt2vUCejDdani4XKkOo0vkEB3YRezQSw9w4RRN0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=eJKONYpsFgXYNFpivkkKImNpZ9iXz0D68HQKUxDR0OBaW2crVylnCmNrfnRlGgYKg\n\tQ58VVza1gBZ5TdIZlGNF5WKeYYSPCHwZVla3PKboKZOjJG3VoMvWMbrqLaDHYaXV+x\n\tujXR6bLDW1xD3SlQOWOaTdM83jjB3tYIHCCMw8ts=","Date":"Sun, 7 Feb 2021 14:27:44 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YB/cwPkjzd4lhXhP@pendragon.ideasonboard.com>","References":"<20210202123620.45200-1-jacopo@jmondi.org>\n\t<0ec37cd7-19f8-fad2-b608-e0686b1d342b@ideasonboard.com>\n\t<20210202155046.wuqyajvxft2wujxj@uno.localdomain>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210202155046.wuqyajvxft2wujxj@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH] android: camera_device: Calculate\n\tMAX_JPEG_SIZE","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>"}}]