[{"id":12973,"web_url":"https://patchwork.libcamera.org/comment/12973/","msgid":"<20201005112649.GF3931@pendragon.ideasonboard.com>","date":"2020-10-05T11:26:49","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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 Mon, Oct 05, 2020 at 01:46:37PM +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n> \n> Delegate the construction of the encoder to the CameraStream class\n> for streams that need post-processing.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/android/camera_device.cpp | 23 ++++++++++-------------\n>  src/android/camera_stream.cpp | 17 ++++++++++++++---\n>  src/android/camera_stream.h   |  4 +++-\n>  3 files changed, 27 insertions(+), 17 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 0600ebc81c64..9c9a5cfa3c2f 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>  \n>  \t\tStreamConfiguration &cfg = config_->at(index);\n>  \n> -\t\t/*\n> -\t\t * Construct a software encoder for the MJPEG streams from the\n> -\t\t * chosen libcamera source stream.\n> -\t\t */\n> -\t\tEncoder *encoder = new EncoderLibJpeg();\n> -\t\tint ret = encoder->configure(cfg);\n> -\t\tif (ret) {\n> -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n> -\t\t\tdelete encoder;\n> -\t\t\treturn ret;\n> -\t\t}\n> -\n> -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n> +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n>  \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n>  \t}\n>  \n> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> +\t/*\n> +\t * Configure the HAL CameraStream instances using the associated\n> +\t * StreamConfiguration and set the number of required buffers in\n> +\t * the Android camera3_stream_t.\n> +\t */\n>  \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n>  \t\tcamera3_stream_t *stream = stream_list->streams[i];\n>  \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n>  \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n>  \n> +\t\tint ret = cameraStream->configure(cfg);\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n> +\n>  \t\t/* Use the bufferCount confirmed by the validation process. */\n>  \t\tstream->max_buffers = cfg.bufferCount;\n>  \t}\n> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> index 585bf2b68f4f..5b2b625c563b 100644\n> --- a/src/android/camera_stream.cpp\n> +++ b/src/android/camera_stream.cpp\n> @@ -7,10 +7,21 @@\n>  \n>  #include \"camera_stream.h\"\n>  \n> +#include \"jpeg/encoder_libjpeg.h\"\n> +\n>  using namespace libcamera;\n>  \n> -CameraStream::CameraStream(PixelFormat format, Size size,\n> -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n> -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n> +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\n>  {\n> +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n> +\t\tencoder_.reset(new EncoderLibJpeg);\n\n\t\tencoder_ = std::make_unique<EncoderLibJpeg>();\n\nThis is functionally equivalent but more \"C++\".\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +}\n> +\n> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n> +{\n> +\tif (encoder_)\n> +\t\treturn encoder_->configure(cfg);\n> +\n> +\treturn 0;\n>  }\n> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> index 07c714e3a365..d0dc40d81151 100644\n> --- a/src/android/camera_stream.h\n> +++ b/src/android/camera_stream.h\n> @@ -100,7 +100,7 @@ public:\n>  \t\tMapped,\n>  \t};\n>  \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n> -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n> +\t\t     Type type, unsigned int index);\n>  \n>  \tconst libcamera::PixelFormat &format() const { return format_; }\n>  \tconst libcamera::Size &size() const { return size_; }\n> @@ -108,6 +108,8 @@ public:\n>  \tunsigned int index() const { return index_; }\n>  \tEncoder *encoder() const { return encoder_.get(); }\n>  \n> +\tint configure(const libcamera::StreamConfiguration &cfg);\n> +\n>  private:\n>  \tlibcamera::PixelFormat format_;\n>  \tlibcamera::Size size_;","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 10AA6C3B5D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  5 Oct 2020 11:27:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 91E2F63BD5;\n\tMon,  5 Oct 2020 13:27:30 +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 288E063BBF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Oct 2020 13:27:29 +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 A211C3B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Oct 2020 13:27:28 +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=\"Muw3uA0Y\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1601897248;\n\tbh=6HWfvmDAtDoDQyZIv9TNvkgf4+4LY16+l5mrWr1KLi0=;\n\th=Date:From:To:Subject:References:In-Reply-To:From;\n\tb=Muw3uA0YLsM4wOtlMaJJ0rpiqiNfvTljeKXVyyR9I4yzY51F+1CNUuDLDUTcm0CD4\n\t9wcNUV0KcGnoXwWiu4ZhAF+wy7kgbkIB/wN5gpSL7VLHltN+jlYXxDEUgZgYljRh+Y\n\t88vWzsemIi4CDXT7vPN/fZJEWKCAb5rS4w9g5zxs=","Date":"Mon, 5 Oct 2020 14:26:49 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Message-ID":"<20201005112649.GF3931@pendragon.ideasonboard.com>","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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-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":12988,"web_url":"https://patchwork.libcamera.org/comment/12988/","msgid":"<4fa0cbef-959a-c1a3-3639-4cb847f5ad22@ideasonboard.com>","date":"2020-10-05T16:18:31","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo\n\nOn 05/10/2020 12:26, Laurent Pinchart wrote:\n> Hi Jacopo,\n> \n> Thank you for the patch.\n> \n> On Mon, Oct 05, 2020 at 01:46:37PM +0300, Laurent Pinchart wrote:\n>> From: Jacopo Mondi <jacopo@jmondi.org>\n>>\n>> Delegate the construction of the encoder to the CameraStream class\n>> for streams that need post-processing.\n>>\n\nVery happy to see this get pushed down to CameraStream ...\nThis series is getting me far too excited - and I'm only on patch 3!\n\n:-)\n\n\n>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>> ---\n>>  src/android/camera_device.cpp | 23 ++++++++++-------------\n>>  src/android/camera_stream.cpp | 17 ++++++++++++++---\n>>  src/android/camera_stream.h   |  4 +++-\n>>  3 files changed, 27 insertions(+), 17 deletions(-)\n>>\n>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>> index 0600ebc81c64..9c9a5cfa3c2f 100644\n>> --- a/src/android/camera_device.cpp\n>> +++ b/src/android/camera_device.cpp\n>> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>>  \n>>  \t\tStreamConfiguration &cfg = config_->at(index);\n>>  \n>> -\t\t/*\n>> -\t\t * Construct a software encoder for the MJPEG streams from the\n>> -\t\t * chosen libcamera source stream.\n>> -\t\t */\n>> -\t\tEncoder *encoder = new EncoderLibJpeg();\n>> -\t\tint ret = encoder->configure(cfg);\n>> -\t\tif (ret) {\n>> -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n>> -\t\t\tdelete encoder;\n>> -\t\t\treturn ret;\n>> -\t\t}\n>> -\n>> -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n>> +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n>>  \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n>>  \t}\n>>  \n>> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>>  \t\treturn -EINVAL;\n>>  \t}\n>>  \n>> +\t/*\n>> +\t * Configure the HAL CameraStream instances using the associated\n>> +\t * StreamConfiguration and set the number of required buffers in\n>> +\t * the Android camera3_stream_t.\n>> +\t */\n>>  \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n>>  \t\tcamera3_stream_t *stream = stream_list->streams[i];\n>>  \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n>>  \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n>>  \n>> +\t\tint ret = cameraStream->configure(cfg);\n>> +\t\tif (ret)\n>> +\t\t\treturn ret;\n>> +\n>>  \t\t/* Use the bufferCount confirmed by the validation process. */\n>>  \t\tstream->max_buffers = cfg.bufferCount;\n>>  \t}\n>> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n>> index 585bf2b68f4f..5b2b625c563b 100644\n>> --- a/src/android/camera_stream.cpp\n>> +++ b/src/android/camera_stream.cpp\n>> @@ -7,10 +7,21 @@\n>>  \n>>  #include \"camera_stream.h\"\n>>  \n>> +#include \"jpeg/encoder_libjpeg.h\"\n>> +\n>>  using namespace libcamera;\n>>  \n>> -CameraStream::CameraStream(PixelFormat format, Size size,\n>> -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n>> -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n>> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n>> +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\n>>  {\n>> +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n>> +\t\tencoder_.reset(new EncoderLibJpeg);\n> \n> \t\tencoder_ = std::make_unique<EncoderLibJpeg>();\n> \n> This is functionally equivalent but more \"C++\".\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n>> +}\n>> +\n>> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n>> +{\n>> +\tif (encoder_)\n>> +\t\treturn encoder_->configure(cfg);\n\nI wonder if in the near future, the creation of the Encoder might happen\non demand here depending on what is needed to fulfil the\nstreamConfiguration, rather than being in the constructor.\n\nBut I'm not worried about that now, and I'm very pleased to see the\nCameraStream specific code moving into here, so lets proceed!\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n>> +\n>> +\treturn 0;\n>>  }\n>> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n>> index 07c714e3a365..d0dc40d81151 100644\n>> --- a/src/android/camera_stream.h\n>> +++ b/src/android/camera_stream.h\n>> @@ -100,7 +100,7 @@ public:\n>>  \t\tMapped,\n>>  \t};\n>>  \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n>> -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n>> +\t\t     Type type, unsigned int index);\n>>  \n>>  \tconst libcamera::PixelFormat &format() const { return format_; }\n>>  \tconst libcamera::Size &size() const { return size_; }\n>> @@ -108,6 +108,8 @@ public:\n>>  \tunsigned int index() const { return index_; }\n>>  \tEncoder *encoder() const { return encoder_.get(); }\n>>  \n>> +\tint configure(const libcamera::StreamConfiguration &cfg);\n>> +\n>>  private:\n>>  \tlibcamera::PixelFormat format_;\n>>  \tlibcamera::Size size_;\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 B8383C3B5C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  5 Oct 2020 16:18:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4C2C563BED;\n\tMon,  5 Oct 2020 18:18:36 +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 2B84163BE4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  5 Oct 2020 18:18:34 +0200 (CEST)","from [192.168.0.217]\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 972873B;\n\tMon,  5 Oct 2020 18:18:33 +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=\"Bn0jmsCX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1601914713;\n\tbh=QcckbD74FI5JLniFPx8gpAlLRhjWpV4h5pzMN6PqOto=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=Bn0jmsCX//Gpzyxnt/9rZF6cVI2BYktFRoK9mKwpiUHGzL6i6YLaOnTID9VaRrMjK\n\tlWm75Cab5v8ty9YzWimNAYAXJr3iTJDPh/V/Hoi27vrlkBcxUAO41zaeq3McNcOMUn\n\tAn3w/k11ttWudpjgE51LKlk0CvmVnAMkqgTc3e+Q=","To":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>\n\t<20201005112649.GF3931@pendragon.ideasonboard.com>","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":"<4fa0cbef-959a-c1a3-3639-4cb847f5ad22@ideasonboard.com>","Date":"Mon, 5 Oct 2020 17:18:31 +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":"<20201005112649.GF3931@pendragon.ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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":13004,"web_url":"https://patchwork.libcamera.org/comment/13004/","msgid":"<8ae116a9-ac74-ed6e-ea79-976fedb7b273@uajain.com>","date":"2020-10-06T11:07:45","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/","name":"Umang Jain","email":"email@uajain.com"},"content":"Hi Jacopo,\n\nOn 10/5/20 4:16 PM, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n>\n> Delegate the construction of the encoder to the CameraStream class\n> for streams that need post-processing.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>   src/android/camera_device.cpp | 23 ++++++++++-------------\n>   src/android/camera_stream.cpp | 17 ++++++++++++++---\n>   src/android/camera_stream.h   |  4 +++-\n>   3 files changed, 27 insertions(+), 17 deletions(-)\n>\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 0600ebc81c64..9c9a5cfa3c2f 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>   \n>   \t\tStreamConfiguration &cfg = config_->at(index);\n>   \n> -\t\t/*\n> -\t\t * Construct a software encoder for the MJPEG streams from the\n> -\t\t * chosen libcamera source stream.\n> -\t\t */\n> -\t\tEncoder *encoder = new EncoderLibJpeg();\n> -\t\tint ret = encoder->configure(cfg);\n> -\t\tif (ret) {\n> -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n> -\t\t\tdelete encoder;\n> -\t\t\treturn ret;\n> -\t\t}\n> -\n> -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n> +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n>   \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n>   \t}\n>   \n> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>   \t\treturn -EINVAL;\n>   \t}\n>   \n> +\t/*\n> +\t * Configure the HAL CameraStream instances using the associated\n> +\t * StreamConfiguration and set the number of required buffers in\n> +\t * the Android camera3_stream_t.\n> +\t */\n>   \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n>   \t\tcamera3_stream_t *stream = stream_list->streams[i];\n>   \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n>   \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n>   \n> +\t\tint ret = cameraStream->configure(cfg);\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n> +\n>   \t\t/* Use the bufferCount confirmed by the validation process. */\n>   \t\tstream->max_buffers = cfg.bufferCount;\n>   \t}\n> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> index 585bf2b68f4f..5b2b625c563b 100644\n> --- a/src/android/camera_stream.cpp\n> +++ b/src/android/camera_stream.cpp\n> @@ -7,10 +7,21 @@\n>   \n>   #include \"camera_stream.h\"\n>   \n> +#include \"jpeg/encoder_libjpeg.h\"\n> +\n>   using namespace libcamera;\n>   \n> -CameraStream::CameraStream(PixelFormat format, Size size,\n> -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n> -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n> +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\nI think this should be s/encoder(nullptr)/encoder_(nullptr)/\n\nReviewed-by: Umang Jain <email@uajain.com>\n>   {\n> +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n> +\t\tencoder_.reset(new EncoderLibJpeg);\n> +}\n> +\n> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n> +{\n> +\tif (encoder_)\n> +\t\treturn encoder_->configure(cfg);\n> +\n> +\treturn 0;\n>   }\n> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> index 07c714e3a365..d0dc40d81151 100644\n> --- a/src/android/camera_stream.h\n> +++ b/src/android/camera_stream.h\n> @@ -100,7 +100,7 @@ public:\n>   \t\tMapped,\n>   \t};\n>   \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n> -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n> +\t\t     Type type, unsigned int index);\n>   \n>   \tconst libcamera::PixelFormat &format() const { return format_; }\n>   \tconst libcamera::Size &size() const { return size_; }\n> @@ -108,6 +108,8 @@ public:\n>   \tunsigned int index() const { return index_; }\n>   \tEncoder *encoder() const { return encoder_.get(); }\n>   \n> +\tint configure(const libcamera::StreamConfiguration &cfg);\n> +\n>   private:\n>   \tlibcamera::PixelFormat format_;\n>   \tlibcamera::Size size_;","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 DFE81BEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Oct 2020 11:07:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7DC6E63BFE;\n\tTue,  6 Oct 2020 13:07:51 +0200 (CEST)","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 209956035D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Oct 2020 13:07:50 +0200 (CEST)"],"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=\"VsNfXn/G\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=uajain.com; s=mail;\n\tt=1601982469; bh=gtiHr8/qasNlFWQ4/PWm/fNZAwm9k0EBCiSfmII0IFk=;\n\th=Subject:To:References:From:In-Reply-To;\n\tb=VsNfXn/GPdsQLX8tsJ9oq2C1rwa49bNQGRbIXKW5KO48lD7jx5+QbdwlHGYINNndv\n\tnei5uP1Avo6JPo0+PIXfEQ2H6UI/Y36Kwh0+vpQUg5tLiwoF+JobLdxs5+P2wdTYyo\n\tiv9VWBxymkFRdsZym8E0AXklQEdyYbatbe02INNqsBFKWA8Q84VGllTHbEd+l7uuz/\n\tGu+6L7p6k/taAIi73lqNola3p/RsUzVkIgiFlAdkcVMQJAnax0VmTEP2h/HQx9utnY\n\tDt8iKCTfnRYEJLwbPjiGNb6svuvCt4QidEEJyy/hkZJ1D2w43I9USHrZcg1G2/Yd3r\n\tOD2z6N4kMcN+g==","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>","From":"Umang Jain <email@uajain.com>","Message-ID":"<8ae116a9-ac74-ed6e-ea79-976fedb7b273@uajain.com>","Date":"Tue, 6 Oct 2020 16:37:45 +0530","Mime-Version":"1.0","In-Reply-To":"<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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":13007,"web_url":"https://patchwork.libcamera.org/comment/13007/","msgid":"<20201006112102.2gekqvumaogeknul@uno.localdomain>","date":"2020-10-06T11:21:02","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Umang,\n\nOn Tue, Oct 06, 2020 at 04:37:45PM +0530, Umang Jain wrote:\n> Hi Jacopo,\n>\n> On 10/5/20 4:16 PM, Laurent Pinchart wrote:\n> > From: Jacopo Mondi <jacopo@jmondi.org>\n> >\n> > Delegate the construction of the encoder to the CameraStream class\n> > for streams that need post-processing.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >   src/android/camera_device.cpp | 23 ++++++++++-------------\n> >   src/android/camera_stream.cpp | 17 ++++++++++++++---\n> >   src/android/camera_stream.h   |  4 +++-\n> >   3 files changed, 27 insertions(+), 17 deletions(-)\n> >\n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 0600ebc81c64..9c9a5cfa3c2f 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n> >   \t\tStreamConfiguration &cfg = config_->at(index);\n> > -\t\t/*\n> > -\t\t * Construct a software encoder for the MJPEG streams from the\n> > -\t\t * chosen libcamera source stream.\n> > -\t\t */\n> > -\t\tEncoder *encoder = new EncoderLibJpeg();\n> > -\t\tint ret = encoder->configure(cfg);\n> > -\t\tif (ret) {\n> > -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n> > -\t\t\tdelete encoder;\n> > -\t\t\treturn ret;\n> > -\t\t}\n> > -\n> > -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n> > +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n> >   \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n> >   \t}\n> > @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n> >   \t\treturn -EINVAL;\n> >   \t}\n> > +\t/*\n> > +\t * Configure the HAL CameraStream instances using the associated\n> > +\t * StreamConfiguration and set the number of required buffers in\n> > +\t * the Android camera3_stream_t.\n> > +\t */\n> >   \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n> >   \t\tcamera3_stream_t *stream = stream_list->streams[i];\n> >   \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n> >   \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n> > +\t\tint ret = cameraStream->configure(cfg);\n> > +\t\tif (ret)\n> > +\t\t\treturn ret;\n> > +\n> >   \t\t/* Use the bufferCount confirmed by the validation process. */\n> >   \t\tstream->max_buffers = cfg.bufferCount;\n> >   \t}\n> > diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> > index 585bf2b68f4f..5b2b625c563b 100644\n> > --- a/src/android/camera_stream.cpp\n> > +++ b/src/android/camera_stream.cpp\n> > @@ -7,10 +7,21 @@\n> >   #include \"camera_stream.h\"\n> > +#include \"jpeg/encoder_libjpeg.h\"\n> > +\n> >   using namespace libcamera;\n> > -CameraStream::CameraStream(PixelFormat format, Size size,\n> > -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n> > -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n> > +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n> > +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\n> I think this should be s/encoder(nullptr)/encoder_(nullptr)/\n>\n\nVery very correct indeed!\nin V2 encoder_ stays wrapped in a unique_ptr<> so this will be gone,\nbut thanks for spotting this!\n\n> Reviewed-by: Umang Jain <email@uajain.com>\n\nThanks\n  j\n\n> >   {\n> > +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n> > +\t\tencoder_.reset(new EncoderLibJpeg);\n> > +}\n> > +\n> > +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n> > +{\n> > +\tif (encoder_)\n> > +\t\treturn encoder_->configure(cfg);\n> > +\n> > +\treturn 0;\n> >   }\n> > diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> > index 07c714e3a365..d0dc40d81151 100644\n> > --- a/src/android/camera_stream.h\n> > +++ b/src/android/camera_stream.h\n> > @@ -100,7 +100,7 @@ public:\n> >   \t\tMapped,\n> >   \t};\n> >   \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n> > -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n> > +\t\t     Type type, unsigned int index);\n> >   \tconst libcamera::PixelFormat &format() const { return format_; }\n> >   \tconst libcamera::Size &size() const { return size_; }\n> > @@ -108,6 +108,8 @@ public:\n> >   \tunsigned int index() const { return index_; }\n> >   \tEncoder *encoder() const { return encoder_.get(); }\n> > +\tint configure(const libcamera::StreamConfiguration &cfg);\n> > +\n> >   private:\n> >   \tlibcamera::PixelFormat format_;\n> >   \tlibcamera::Size size_;\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 1F6EABEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Oct 2020 11:17:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F1C2063C57;\n\tTue,  6 Oct 2020 13:17:04 +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 85D6360363\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Oct 2020 13:17:03 +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 E52351BF20A;\n\tTue,  6 Oct 2020 11:17:02 +0000 (UTC)"],"X-Originating-IP":"93.34.118.233","Date":"Tue, 6 Oct 2020 13:21:02 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Umang Jain <email@uajain.com>","Message-ID":"<20201006112102.2gekqvumaogeknul@uno.localdomain>","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>\n\t<8ae116a9-ac74-ed6e-ea79-976fedb7b273@uajain.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<8ae116a9-ac74-ed6e-ea79-976fedb7b273@uajain.com>","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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":13014,"web_url":"https://patchwork.libcamera.org/comment/13014/","msgid":"<20201006124433.nwwzsms2cpe7zbmi@uno.localdomain>","date":"2020-10-06T12:44:33","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Kieran,\n\nOn Mon, Oct 05, 2020 at 05:18:31PM +0100, Kieran Bingham wrote:\n> Hi Jacopo\n>\n> On 05/10/2020 12:26, Laurent Pinchart wrote:\n> > Hi Jacopo,\n> >\n> > Thank you for the patch.\n> >\n> > On Mon, Oct 05, 2020 at 01:46:37PM +0300, Laurent Pinchart wrote:\n> >> From: Jacopo Mondi <jacopo@jmondi.org>\n> >>\n> >> Delegate the construction of the encoder to the CameraStream class\n> >> for streams that need post-processing.\n> >>\n>\n> Very happy to see this get pushed down to CameraStream ...\n> This series is getting me far too excited - and I'm only on patch 3!\n>\n> :-)\n>\n>\n> >> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> >> ---\n> >>  src/android/camera_device.cpp | 23 ++++++++++-------------\n> >>  src/android/camera_stream.cpp | 17 ++++++++++++++---\n> >>  src/android/camera_stream.h   |  4 +++-\n> >>  3 files changed, 27 insertions(+), 17 deletions(-)\n> >>\n> >> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> >> index 0600ebc81c64..9c9a5cfa3c2f 100644\n> >> --- a/src/android/camera_device.cpp\n> >> +++ b/src/android/camera_device.cpp\n> >> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n> >>\n> >>  \t\tStreamConfiguration &cfg = config_->at(index);\n> >>\n> >> -\t\t/*\n> >> -\t\t * Construct a software encoder for the MJPEG streams from the\n> >> -\t\t * chosen libcamera source stream.\n> >> -\t\t */\n> >> -\t\tEncoder *encoder = new EncoderLibJpeg();\n> >> -\t\tint ret = encoder->configure(cfg);\n> >> -\t\tif (ret) {\n> >> -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n> >> -\t\t\tdelete encoder;\n> >> -\t\t\treturn ret;\n> >> -\t\t}\n> >> -\n> >> -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n> >> +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n> >>  \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n> >>  \t}\n> >>\n> >> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n> >>  \t\treturn -EINVAL;\n> >>  \t}\n> >>\n> >> +\t/*\n> >> +\t * Configure the HAL CameraStream instances using the associated\n> >> +\t * StreamConfiguration and set the number of required buffers in\n> >> +\t * the Android camera3_stream_t.\n> >> +\t */\n> >>  \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n> >>  \t\tcamera3_stream_t *stream = stream_list->streams[i];\n> >>  \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n> >>  \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n> >>\n> >> +\t\tint ret = cameraStream->configure(cfg);\n> >> +\t\tif (ret)\n> >> +\t\t\treturn ret;\n> >> +\n> >>  \t\t/* Use the bufferCount confirmed by the validation process. */\n> >>  \t\tstream->max_buffers = cfg.bufferCount;\n> >>  \t}\n> >> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n> >> index 585bf2b68f4f..5b2b625c563b 100644\n> >> --- a/src/android/camera_stream.cpp\n> >> +++ b/src/android/camera_stream.cpp\n> >> @@ -7,10 +7,21 @@\n> >>\n> >>  #include \"camera_stream.h\"\n> >>\n> >> +#include \"jpeg/encoder_libjpeg.h\"\n> >> +\n> >>  using namespace libcamera;\n> >>\n> >> -CameraStream::CameraStream(PixelFormat format, Size size,\n> >> -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n> >> -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n> >> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n> >> +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\n> >>  {\n> >> +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n> >> +\t\tencoder_.reset(new EncoderLibJpeg);\n> >\n> > \t\tencoder_ = std::make_unique<EncoderLibJpeg>();\n> >\n> > This is functionally equivalent but more \"C++\".\n> >\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> >\n> >> +}\n> >> +\n> >> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n> >> +{\n> >> +\tif (encoder_)\n> >> +\t\treturn encoder_->configure(cfg);\n>\n> I wonder if in the near future, the creation of the Encoder might happen\n> on demand here depending on what is needed to fulfil the\n> streamConfiguration, rather than being in the constructor.\n>\n> But I'm not worried about that now, and I'm very pleased to see the\n> CameraStream specific code moving into here, so lets proceed!\n\nRight now the Encoder is constructed only for Type::Internal which is\nassigned by the CameraDevice. It's a bit clunky, and my preference\nwould be a CameraStream subclass (maybe two, one that does encoding\nand one that does allocation ?) Anyway, it's a bit over-engineerd for\nthe current status I think.\n\nThanks\n  j\n\n>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>\n> >> +\n> >> +\treturn 0;\n> >>  }\n> >> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n> >> index 07c714e3a365..d0dc40d81151 100644\n> >> --- a/src/android/camera_stream.h\n> >> +++ b/src/android/camera_stream.h\n> >> @@ -100,7 +100,7 @@ public:\n> >>  \t\tMapped,\n> >>  \t};\n> >>  \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n> >> -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n> >> +\t\t     Type type, unsigned int index);\n> >>\n> >>  \tconst libcamera::PixelFormat &format() const { return format_; }\n> >>  \tconst libcamera::Size &size() const { return size_; }\n> >> @@ -108,6 +108,8 @@ public:\n> >>  \tunsigned int index() const { return index_; }\n> >>  \tEncoder *encoder() const { return encoder_.get(); }\n> >>\n> >> +\tint configure(const libcamera::StreamConfiguration &cfg);\n> >> +\n> >>  private:\n> >>  \tlibcamera::PixelFormat format_;\n> >>  \tlibcamera::Size size_;\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 3F9BABEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Oct 2020 12:40:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9B6E063C8F;\n\tTue,  6 Oct 2020 14:40:36 +0200 (CEST)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[217.70.178.232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 09BD760363\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Oct 2020 14:40:35 +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 relay12.mail.gandi.net (Postfix) with ESMTPSA id 77AF4200008;\n\tTue,  6 Oct 2020 12:40:34 +0000 (UTC)"],"Date":"Tue, 6 Oct 2020 14:44:33 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20201006124433.nwwzsms2cpe7zbmi@uno.localdomain>","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>\n\t<20201005112649.GF3931@pendragon.ideasonboard.com>\n\t<4fa0cbef-959a-c1a3-3639-4cb847f5ad22@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<4fa0cbef-959a-c1a3-3639-4cb847f5ad22@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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":13016,"web_url":"https://patchwork.libcamera.org/comment/13016/","msgid":"<95e65f90-219f-88be-0c29-031f4bc003d1@ideasonboard.com>","date":"2020-10-06T12:53:36","subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn 06/10/2020 13:44, Jacopo Mondi wrote:\n> Hi Kieran,\n> \n> On Mon, Oct 05, 2020 at 05:18:31PM +0100, Kieran Bingham wrote:\n>> Hi Jacopo\n>>\n>> On 05/10/2020 12:26, Laurent Pinchart wrote:\n>>> Hi Jacopo,\n>>>\n>>> Thank you for the patch.\n>>>\n>>> On Mon, Oct 05, 2020 at 01:46:37PM +0300, Laurent Pinchart wrote:\n>>>> From: Jacopo Mondi <jacopo@jmondi.org>\n>>>>\n>>>> Delegate the construction of the encoder to the CameraStream class\n>>>> for streams that need post-processing.\n>>>>\n>>\n>> Very happy to see this get pushed down to CameraStream ...\n>> This series is getting me far too excited - and I'm only on patch 3!\n>>\n>> :-)\n>>\n>>\n>>>> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n>>>> ---\n>>>>  src/android/camera_device.cpp | 23 ++++++++++-------------\n>>>>  src/android/camera_stream.cpp | 17 ++++++++++++++---\n>>>>  src/android/camera_stream.h   |  4 +++-\n>>>>  3 files changed, 27 insertions(+), 17 deletions(-)\n>>>>\n>>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n>>>> index 0600ebc81c64..9c9a5cfa3c2f 100644\n>>>> --- a/src/android/camera_device.cpp\n>>>> +++ b/src/android/camera_device.cpp\n>>>> @@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>>>>\n>>>>  \t\tStreamConfiguration &cfg = config_->at(index);\n>>>>\n>>>> -\t\t/*\n>>>> -\t\t * Construct a software encoder for the MJPEG streams from the\n>>>> -\t\t * chosen libcamera source stream.\n>>>> -\t\t */\n>>>> -\t\tEncoder *encoder = new EncoderLibJpeg();\n>>>> -\t\tint ret = encoder->configure(cfg);\n>>>> -\t\tif (ret) {\n>>>> -\t\t\tLOG(HAL, Error) << \"Failed to configure encoder\";\n>>>> -\t\t\tdelete encoder;\n>>>> -\t\t\treturn ret;\n>>>> -\t\t}\n>>>> -\n>>>> -\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);\n>>>> +\t\tstreams_.emplace_back(formats::MJPEG, cfg.size, type, index);\n>>>>  \t\tjpegStream->priv = static_cast<void *>(&streams_.back());\n>>>>  \t}\n>>>>\n>>>> @@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)\n>>>>  \t\treturn -EINVAL;\n>>>>  \t}\n>>>>\n>>>> +\t/*\n>>>> +\t * Configure the HAL CameraStream instances using the associated\n>>>> +\t * StreamConfiguration and set the number of required buffers in\n>>>> +\t * the Android camera3_stream_t.\n>>>> +\t */\n>>>>  \tfor (unsigned int i = 0; i < stream_list->num_streams; ++i) {\n>>>>  \t\tcamera3_stream_t *stream = stream_list->streams[i];\n>>>>  \t\tCameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);\n>>>>  \t\tStreamConfiguration &cfg = config_->at(cameraStream->index());\n>>>>\n>>>> +\t\tint ret = cameraStream->configure(cfg);\n>>>> +\t\tif (ret)\n>>>> +\t\t\treturn ret;\n>>>> +\n>>>>  \t\t/* Use the bufferCount confirmed by the validation process. */\n>>>>  \t\tstream->max_buffers = cfg.bufferCount;\n>>>>  \t}\n>>>> diff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\n>>>> index 585bf2b68f4f..5b2b625c563b 100644\n>>>> --- a/src/android/camera_stream.cpp\n>>>> +++ b/src/android/camera_stream.cpp\n>>>> @@ -7,10 +7,21 @@\n>>>>\n>>>>  #include \"camera_stream.h\"\n>>>>\n>>>> +#include \"jpeg/encoder_libjpeg.h\"\n>>>> +\n>>>>  using namespace libcamera;\n>>>>\n>>>> -CameraStream::CameraStream(PixelFormat format, Size size,\n>>>> -\t\t\t   Type type, unsigned int index, Encoder *encoder)\n>>>> -\t: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)\n>>>> +CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)\n>>>> +\t: format_(format), size_(size), type_(type), index_(index), encoder(nullptr)\n>>>>  {\n>>>> +\tif (type_ == Type::Internal || type_ == Type::Mapped)\n>>>> +\t\tencoder_.reset(new EncoderLibJpeg);\n>>>\n>>> \t\tencoder_ = std::make_unique<EncoderLibJpeg>();\n>>>\n>>> This is functionally equivalent but more \"C++\".\n>>>\n>>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>>\n>>>> +}\n>>>> +\n>>>> +int CameraStream::configure(const libcamera::StreamConfiguration &cfg)\n>>>> +{\n>>>> +\tif (encoder_)\n>>>> +\t\treturn encoder_->configure(cfg);\n>>\n>> I wonder if in the near future, the creation of the Encoder might happen\n>> on demand here depending on what is needed to fulfil the\n>> streamConfiguration, rather than being in the constructor.\n>>\n>> But I'm not worried about that now, and I'm very pleased to see the\n>> CameraStream specific code moving into here, so lets proceed!\n> \n> Right now the Encoder is constructed only for Type::Internal which is\n> assigned by the CameraDevice. It's a bit clunky, and my preference\n> would be a CameraStream subclass (maybe two, one that does encoding\n> and one that does allocation ?) Anyway, it's a bit over-engineerd for\n> the current status I think.\n\nI disagree to 'over-engineered' ... it's laying foundations for what we\nneed to do next (supporting YUVY->NV12, Rescaling, Encoding, Decoding...)\n\nBut no blockers here ;-) Moving on ...\n\n> \n> Thanks\n>   j\n> \n>>\n>> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n>>\n>>>> +\n>>>> +\treturn 0;\n>>>>  }\n>>>> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h\n>>>> index 07c714e3a365..d0dc40d81151 100644\n>>>> --- a/src/android/camera_stream.h\n>>>> +++ b/src/android/camera_stream.h\n>>>> @@ -100,7 +100,7 @@ public:\n>>>>  \t\tMapped,\n>>>>  \t};\n>>>>  \tCameraStream(libcamera::PixelFormat format, libcamera::Size size,\n>>>> -\t\t     Type type, unsigned int index, Encoder *encoder = nullptr);\n>>>> +\t\t     Type type, unsigned int index);\n>>>>\n>>>>  \tconst libcamera::PixelFormat &format() const { return format_; }\n>>>>  \tconst libcamera::Size &size() const { return size_; }\n>>>> @@ -108,6 +108,8 @@ public:\n>>>>  \tunsigned int index() const { return index_; }\n>>>>  \tEncoder *encoder() const { return encoder_.get(); }\n>>>>\n>>>> +\tint configure(const libcamera::StreamConfiguration &cfg);\n>>>> +\n>>>>  private:\n>>>>  \tlibcamera::PixelFormat format_;\n>>>>  \tlibcamera::Size size_;\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 0422DBEEE0\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Oct 2020 12:53:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9676963BBF;\n\tTue,  6 Oct 2020 14:53:41 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BCFCC63BBF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Oct 2020 14:53:39 +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 3360D3B;\n\tTue,  6 Oct 2020 14:53:39 +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=\"nvvvsFLA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1601988819;\n\tbh=5CcoYdOI00pBZqB8XfrBP6g9qEyp6dM2mb0uXuZPCw0=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=nvvvsFLAkGe+VcXXzSidCjXKYN5jz0CvOowf2IVScuphI9GpKSc8XPaIqq3h0MROK\n\tbwmBMDybUYWetQN70US9bIfJ0uwcY3d9qsRwAe3Z5YP53ucCc29yadb+UVgVMneQgK\n\tQyuh51kdBiTwAGbxCYnkvYgpIvvNgPV4ag2vsQnY=","To":"Jacopo Mondi <jacopo@jmondi.org>","References":"<20201005104649.10812-1-laurent.pinchart@ideasonboard.com>\n\t<20201005104649.10812-4-laurent.pinchart@ideasonboard.com>\n\t<20201005112649.GF3931@pendragon.ideasonboard.com>\n\t<4fa0cbef-959a-c1a3-3639-4cb847f5ad22@ideasonboard.com>\n\t<20201006124433.nwwzsms2cpe7zbmi@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":"<95e65f90-219f-88be-0c29-031f4bc003d1@ideasonboard.com>","Date":"Tue, 6 Oct 2020 13:53:36 +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":"<20201006124433.nwwzsms2cpe7zbmi@uno.localdomain>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 03/15] android: camera_stream:\n\tDelegate Encoder construction","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>"}}]