[{"id":19743,"web_url":"https://patchwork.libcamera.org/comment/19743/","msgid":"<4d14b45e-723e-712d-1b7c-8ff6294a2890@ideasonboard.com>","date":"2021-09-21T14:59:31","subject":"Re: [libcamera-devel] [PATCH v2 2/5] qcam: format_converter: Add\n\tconfigurable stride support","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"On 07/09/2021 01:20, Laurent Pinchart wrote:\n> Make the stride configurable to support convertion of images with\n\ns/convertion/conversion/\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> padding at the end of lines.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes since v1:\n> \n> - Fix bad rebase\n> ---\n>  src/qcam/format_converter.cpp | 11 ++++++-----\n>  src/qcam/format_converter.h   |  4 +++-\n>  src/qcam/viewfinder_qt.cpp    |  5 ++---\n>  3 files changed, 11 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> index 673ad33e141d..b4c7b0ca0edf 100644\n> --- a/src/qcam/format_converter.cpp\n> +++ b/src/qcam/format_converter.cpp\n> @@ -30,7 +30,7 @@\n>  #endif\n>  \n>  int FormatConverter::configure(const libcamera::PixelFormat &format,\n> -\t\t\t       const QSize &size)\n> +\t\t\t       const QSize &size, unsigned int stride)\n>  {\n>  \tswitch (format) {\n>  \tcase libcamera::formats::NV12:\n> @@ -152,6 +152,7 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n>  \tformat_ = format;\n>  \twidth_ = size.width();\n>  \theight_ = size.height();\n> +\tstride_ = stride;\n>  \n>  \treturn 0;\n>  }\n> @@ -186,7 +187,7 @@ static void yuv_to_rgb(int y, int u, int v, int *r, int *g, int *b)\n>  \n>  void FormatConverter::convertNV(const Image *srcImage, unsigned char *dst)\n>  {\n> -\tunsigned int c_stride = width_ * (2 / horzSubSample_);\n> +\tunsigned int c_stride = stride_ * (2 / horzSubSample_);\n>  \tunsigned int c_inc = horzSubSample_ == 1 ? 2 : 0;\n>  \tunsigned int cb_pos = nvSwap_ ? 1 : 0;\n>  \tunsigned int cr_pos = nvSwap_ ? 0 : 1;\n> @@ -195,7 +196,7 @@ void FormatConverter::convertNV(const Image *srcImage, unsigned char *dst)\n>  \tint r, g, b;\n>  \n>  \tfor (unsigned int y = 0; y < height_; y++) {\n> -\t\tconst unsigned char *src_y = src + y * width_;\n> +\t\tconst unsigned char *src_y = src + y * stride_;\n>  \t\tconst unsigned char *src_cb = src_c + (y / vertSubSample_) *\n>  \t\t\t\t\t      c_stride + cb_pos;\n>  \t\tconst unsigned char *src_cr = src_c + (y / vertSubSample_) *\n> @@ -243,7 +244,7 @@ void FormatConverter::convertRGB(const Image *srcImage, unsigned char *dst)\n>  \t\t\tdst[4 * x + 3] = 0xff;\n>  \t\t}\n>  \n> -\t\tsrc += width_ * bpp_;\n> +\t\tsrc += stride_;\n>  \t\tdst += width_ * 4;\n>  \t}\n>  }\n> @@ -258,7 +259,7 @@ void FormatConverter::convertYUV(const Image *srcImage, unsigned char *dst)\n>  \tint r, g, b, y, cr, cb;\n>  \n>  \tcr_pos = (cb_pos_ + 2) % 4;\n> -\tsrc_stride = width_ * 2;\n> +\tsrc_stride = stride_;\n>  \tdst_stride = width_ * 4;\n>  \n>  \tfor (src_y = 0, dst_y = 0; dst_y < height_; src_y++, dst_y++) {\n> diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> index 2220a62b5f11..bb04aa959a1a 100644\n> --- a/src/qcam/format_converter.h\n> +++ b/src/qcam/format_converter.h\n> @@ -19,7 +19,8 @@ class QImage;\n>  class FormatConverter\n>  {\n>  public:\n> -\tint configure(const libcamera::PixelFormat &format, const QSize &size);\n> +\tint configure(const libcamera::PixelFormat &format, const QSize &size,\n> +\t\t      unsigned int stride);\n>  \n>  \tvoid convert(const Image *src, size_t size, QImage *dst);\n>  \n> @@ -38,6 +39,7 @@ private:\n>  \tlibcamera::PixelFormat format_;\n>  \tunsigned int width_;\n>  \tunsigned int height_;\n> +\tunsigned int stride_;\n>  \n>  \tenum FormatFamily formatFamily_;\n>  \n> diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp\n> index cd051760160c..a05c75ed9e12 100644\n> --- a/src/qcam/viewfinder_qt.cpp\n> +++ b/src/qcam/viewfinder_qt.cpp\n> @@ -52,8 +52,7 @@ const QList<libcamera::PixelFormat> &ViewFinderQt::nativeFormats() const\n>  }\n>  \n>  int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n> -\t\t\t    const QSize &size,\n> -\t\t\t    [[maybe_unused]] unsigned int stride)\n> +\t\t\t    const QSize &size, unsigned int stride)\n>  {\n>  \timage_ = QImage();\n>  \n> @@ -62,7 +61,7 @@ int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n>  \t * the destination image.\n>  \t */\n>  \tif (!::nativeFormats.contains(format)) {\n> -\t\tint ret = converter_.configure(format, size);\n> +\t\tint ret = converter_.configure(format, size, stride);\n>  \t\tif (ret < 0)\n>  \t\t\treturn ret;\n>  \n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D07A5BF01C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Sep 2021 14:59:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 05FEC6918A;\n\tTue, 21 Sep 2021 16:59:37 +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 C9CFD60247\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Sep 2021 16:59:35 +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 4488A2BA;\n\tTue, 21 Sep 2021 16:59:35 +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=\"swqi30oN\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1632236375;\n\tbh=JFfqnUWMp7P0HWA2VofSt0lpuizPUS1XPrETsyg4mQU=;\n\th=Subject:To:References:From:Date:In-Reply-To:From;\n\tb=swqi30oNrKpcJr/pD5HXluiUPzTgBmbNHJc1pgNaLIgmZDpMmlZZL2tQfcpITY+mY\n\te4/WFG6RsdoJ9uHB51CaHG3H72n+MqWXSec1yviY+P4ko18va8ByUJ47s/QwztQDkK\n\tHN3r7/54r5DCfeK9IoZyWadg+K8s89+/9MEjGzHM=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20210907002044.7319-1-laurent.pinchart@ideasonboard.com>\n\t<20210907002044.7319-3-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<4d14b45e-723e-712d-1b7c-8ff6294a2890@ideasonboard.com>","Date":"Tue, 21 Sep 2021 15:59:31 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.11.0","MIME-Version":"1.0","In-Reply-To":"<20210907002044.7319-3-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2 2/5] qcam: format_converter: Add\n\tconfigurable stride support","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":19773,"web_url":"https://patchwork.libcamera.org/comment/19773/","msgid":"<20210922065932.GH4382@pyrite.rasen.tech>","date":"2021-09-22T06:59:32","subject":"Re: [libcamera-devel] [PATCH v2 2/5] qcam: format_converter: Add\n\tconfigurable stride support","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Laurent,\n\nOn Tue, Sep 07, 2021 at 03:20:41AM +0300, Laurent Pinchart wrote:\n> Make the stride configurable to support convertion of images with\n> padding at the end of lines.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n> Changes since v1:\n> \n> - Fix bad rebase\n> ---\n>  src/qcam/format_converter.cpp | 11 ++++++-----\n>  src/qcam/format_converter.h   |  4 +++-\n>  src/qcam/viewfinder_qt.cpp    |  5 ++---\n>  3 files changed, 11 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/qcam/format_converter.cpp b/src/qcam/format_converter.cpp\n> index 673ad33e141d..b4c7b0ca0edf 100644\n> --- a/src/qcam/format_converter.cpp\n> +++ b/src/qcam/format_converter.cpp\n> @@ -30,7 +30,7 @@\n>  #endif\n>  \n>  int FormatConverter::configure(const libcamera::PixelFormat &format,\n> -\t\t\t       const QSize &size)\n> +\t\t\t       const QSize &size, unsigned int stride)\n>  {\n>  \tswitch (format) {\n>  \tcase libcamera::formats::NV12:\n> @@ -152,6 +152,7 @@ int FormatConverter::configure(const libcamera::PixelFormat &format,\n>  \tformat_ = format;\n>  \twidth_ = size.width();\n>  \theight_ = size.height();\n> +\tstride_ = stride;\n>  \n>  \treturn 0;\n>  }\n> @@ -186,7 +187,7 @@ static void yuv_to_rgb(int y, int u, int v, int *r, int *g, int *b)\n>  \n>  void FormatConverter::convertNV(const Image *srcImage, unsigned char *dst)\n>  {\n> -\tunsigned int c_stride = width_ * (2 / horzSubSample_);\n> +\tunsigned int c_stride = stride_ * (2 / horzSubSample_);\n>  \tunsigned int c_inc = horzSubSample_ == 1 ? 2 : 0;\n>  \tunsigned int cb_pos = nvSwap_ ? 1 : 0;\n>  \tunsigned int cr_pos = nvSwap_ ? 0 : 1;\n> @@ -195,7 +196,7 @@ void FormatConverter::convertNV(const Image *srcImage, unsigned char *dst)\n>  \tint r, g, b;\n>  \n>  \tfor (unsigned int y = 0; y < height_; y++) {\n> -\t\tconst unsigned char *src_y = src + y * width_;\n> +\t\tconst unsigned char *src_y = src + y * stride_;\n>  \t\tconst unsigned char *src_cb = src_c + (y / vertSubSample_) *\n>  \t\t\t\t\t      c_stride + cb_pos;\n>  \t\tconst unsigned char *src_cr = src_c + (y / vertSubSample_) *\n> @@ -243,7 +244,7 @@ void FormatConverter::convertRGB(const Image *srcImage, unsigned char *dst)\n>  \t\t\tdst[4 * x + 3] = 0xff;\n>  \t\t}\n>  \n> -\t\tsrc += width_ * bpp_;\n> +\t\tsrc += stride_;\n>  \t\tdst += width_ * 4;\n>  \t}\n>  }\n> @@ -258,7 +259,7 @@ void FormatConverter::convertYUV(const Image *srcImage, unsigned char *dst)\n>  \tint r, g, b, y, cr, cb;\n>  \n>  \tcr_pos = (cb_pos_ + 2) % 4;\n> -\tsrc_stride = width_ * 2;\n> +\tsrc_stride = stride_;\n>  \tdst_stride = width_ * 4;\n>  \n>  \tfor (src_y = 0, dst_y = 0; dst_y < height_; src_y++, dst_y++) {\n> diff --git a/src/qcam/format_converter.h b/src/qcam/format_converter.h\n> index 2220a62b5f11..bb04aa959a1a 100644\n> --- a/src/qcam/format_converter.h\n> +++ b/src/qcam/format_converter.h\n> @@ -19,7 +19,8 @@ class QImage;\n>  class FormatConverter\n>  {\n>  public:\n> -\tint configure(const libcamera::PixelFormat &format, const QSize &size);\n> +\tint configure(const libcamera::PixelFormat &format, const QSize &size,\n> +\t\t      unsigned int stride);\n>  \n>  \tvoid convert(const Image *src, size_t size, QImage *dst);\n>  \n> @@ -38,6 +39,7 @@ private:\n>  \tlibcamera::PixelFormat format_;\n>  \tunsigned int width_;\n>  \tunsigned int height_;\n> +\tunsigned int stride_;\n>  \n>  \tenum FormatFamily formatFamily_;\n>  \n> diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp\n> index cd051760160c..a05c75ed9e12 100644\n> --- a/src/qcam/viewfinder_qt.cpp\n> +++ b/src/qcam/viewfinder_qt.cpp\n> @@ -52,8 +52,7 @@ const QList<libcamera::PixelFormat> &ViewFinderQt::nativeFormats() const\n>  }\n>  \n>  int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n> -\t\t\t    const QSize &size,\n> -\t\t\t    [[maybe_unused]] unsigned int stride)\n> +\t\t\t    const QSize &size, unsigned int stride)\n>  {\n>  \timage_ = QImage();\n>  \n> @@ -62,7 +61,7 @@ int ViewFinderQt::setFormat(const libcamera::PixelFormat &format,\n>  \t * the destination image.\n>  \t */\n>  \tif (!::nativeFormats.contains(format)) {\n> -\t\tint ret = converter_.configure(format, size);\n> +\t\tint ret = converter_.configure(format, size, stride);\n>  \t\tif (ret < 0)\n>  \t\t\treturn ret;\n>  \n> -- \n> Regards,\n> \n> Laurent Pinchart\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 62A22BF01C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 22 Sep 2021 06:59:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7AE0D6918C;\n\tWed, 22 Sep 2021 08:59:41 +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 CC1D86012C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 22 Sep 2021 08:59:39 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 619E4F1;\n\tWed, 22 Sep 2021 08:59:38 +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=\"U65WhxK8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1632293979;\n\tbh=OOq6dmzFYVyiVAC6jh8oaSn3xJfVKPHA3opqyl7v0yc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=U65WhxK85sqPGhQRSqOCNHm8cS0nps62LG/s1CzZ30D5VOemra8H0blkhj+29cyXk\n\tSaTx0APbtbjzrceShOb/xi68e3HAZR3xMN5562UGcijzBV7FERu/IoRYsg+7rYtGEl\n\tGVlFgI3grydxoTiCEismU2OxNkg5HLmaEf5aYfQw=","Date":"Wed, 22 Sep 2021 15:59:32 +0900","From":"paul.elder@ideasonboard.com","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20210922065932.GH4382@pyrite.rasen.tech>","References":"<20210907002044.7319-1-laurent.pinchart@ideasonboard.com>\n\t<20210907002044.7319-3-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20210907002044.7319-3-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 2/5] qcam: format_converter: Add\n\tconfigurable stride support","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>"}}]