[{"id":24399,"web_url":"https://patchwork.libcamera.org/comment/24399/","msgid":"<165991119826.1706285.14803852933909133961@Monstersaurus>","date":"2022-08-07T22:26:38","subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart via libcamera-devel (2022-08-07 03:17:17)\n> In order to prepare for NV12 support, implement support for multi-planar\n> formats in the SDL sink. This mainly consists in passing a vector of\n> plane data to the SDLTexture::update() function instead of a single\n> value.\n> \n\nLooks ok here,\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/sdl_sink.cpp         | 21 +++++++++++++--------\n>  src/cam/sdl_texture.h        |  4 +++-\n>  src/cam/sdl_texture_mjpg.cpp |  4 ++--\n>  src/cam/sdl_texture_mjpg.h   |  2 +-\n>  src/cam/sdl_texture_yuv.cpp  |  4 ++--\n>  src/cam/sdl_texture_yuv.h    |  2 +-\n>  6 files changed, 22 insertions(+), 15 deletions(-)\n> \n> diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp\n> index 04350bd5365b..9675cf275186 100644\n> --- a/src/cam/sdl_sink.cpp\n> +++ b/src/cam/sdl_sink.cpp\n> @@ -185,16 +185,21 @@ void SDLSink::renderBuffer(FrameBuffer *buffer)\n>  {\n>         Image *image = mappedBuffers_[buffer].get();\n>  \n> -       /* \\todo Implement support for multi-planar formats. */\n> -       const FrameMetadata::Plane &meta = buffer->metadata().planes()[0];\n> +       std::vector<Span<const uint8_t>> planes;\n> +       unsigned int i = 0;\n>  \n> -       Span<uint8_t> data = image->data(0);\n> -       if (meta.bytesused > data.size())\n> -               std::cerr << \"payload size \" << meta.bytesused\n> -                         << \" larger than plane size \" << data.size()\n> -                         << std::endl;\n> +       for (const FrameMetadata::Plane &meta : buffer->metadata().planes()) {\n> +               Span<uint8_t> data = image->data(i);\n> +               if (meta.bytesused > data.size())\n> +                       std::cerr << \"payload size \" << meta.bytesused\n> +                                 << \" larger than plane size \" << data.size()\n> +                                 << std::endl;\n>  \n> -       texture_->update(data);\n> +               planes.push_back(data);\n> +               i++;\n> +       }\n> +\n> +       texture_->update(planes);\n>  \n>         SDL_RenderClear(renderer_);\n>         SDL_RenderCopy(renderer_, texture_->get(), nullptr, nullptr);\n> diff --git a/src/cam/sdl_texture.h b/src/cam/sdl_texture.h\n> index f523fa5ebf51..e4d3fb2bcf39 100644\n> --- a/src/cam/sdl_texture.h\n> +++ b/src/cam/sdl_texture.h\n> @@ -7,6 +7,8 @@\n>  \n>  #pragma once\n>  \n> +#include <vector>\n> +\n>  #include <SDL2/SDL.h>\n>  \n>  #include \"image.h\"\n> @@ -17,7 +19,7 @@ public:\n>         SDLTexture(const SDL_Rect &rect, uint32_t pixelFormat, const int pitch);\n>         virtual ~SDLTexture();\n>         int create(SDL_Renderer *renderer);\n> -       virtual void update(libcamera::Span<const uint8_t> data) = 0;\n> +       virtual void update(const std::vector<libcamera::Span<const uint8_t>> &data) = 0;\n>         SDL_Texture *get() const { return ptr_; }\n>  \n>  protected:\n> diff --git a/src/cam/sdl_texture_mjpg.cpp b/src/cam/sdl_texture_mjpg.cpp\n> index 7542efd75d96..8dd5ee3eb6bc 100644\n> --- a/src/cam/sdl_texture_mjpg.cpp\n> +++ b/src/cam/sdl_texture_mjpg.cpp\n> @@ -76,8 +76,8 @@ int SDLTextureMJPG::decompress(Span<const uint8_t> data)\n>         return 0;\n>  }\n>  \n> -void SDLTextureMJPG::update(Span<const uint8_t> data)\n> +void SDLTextureMJPG::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -       decompress(data);\n> +       decompress(data[0]);\n>         SDL_UpdateTexture(ptr_, nullptr, rgb_.get(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_mjpg.h b/src/cam/sdl_texture_mjpg.h\n> index 5141ed73bf70..814ca79ac193 100644\n> --- a/src/cam/sdl_texture_mjpg.h\n> +++ b/src/cam/sdl_texture_mjpg.h\n> @@ -14,7 +14,7 @@ class SDLTextureMJPG : public SDLTexture\n>  public:\n>         SDLTextureMJPG(const SDL_Rect &rect);\n>  \n> -       void update(libcamera::Span<const uint8_t> data) override;\n> +       void update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\n>  \n>  private:\n>         int decompress(libcamera::Span<const uint8_t> data);\n> diff --git a/src/cam/sdl_texture_yuv.cpp b/src/cam/sdl_texture_yuv.cpp\n> index 07df4961a1ab..a5721182a68b 100644\n> --- a/src/cam/sdl_texture_yuv.cpp\n> +++ b/src/cam/sdl_texture_yuv.cpp\n> @@ -14,7 +14,7 @@ SDLTextureYUYV::SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride)\n>  {\n>  }\n>  \n> -void SDLTextureYUYV::update(Span<const uint8_t> data)\n> +void SDLTextureYUYV::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -       SDL_UpdateTexture(ptr_, &rect_, data.data(), pitch_);\n> +       SDL_UpdateTexture(ptr_, &rect_, data[0].data(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_yuv.h b/src/cam/sdl_texture_yuv.h\n> index 81e51381ec62..c9130298b91d 100644\n> --- a/src/cam/sdl_texture_yuv.h\n> +++ b/src/cam/sdl_texture_yuv.h\n> @@ -13,5 +13,5 @@ class SDLTextureYUYV : public SDLTexture\n>  {\n>  public:\n>         SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride);\n> -       void update(libcamera::Span<const uint8_t> data) override;\n> +       void update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\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 67365C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun,  7 Aug 2022 22:26:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DA52E63327;\n\tMon,  8 Aug 2022 00:26:43 +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 7BA20603EF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Aug 2022 00:26:41 +0200 (CEST)","from pendragon.ideasonboard.com\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 1A6AD3F1;\n\tMon,  8 Aug 2022 00:26:41 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659911203;\n\tbh=m8TXP2YHOB5ULnIE9rEthItEoKAZAsDoeo277nqXIC4=;\n\th=In-Reply-To:References:To:Date:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=gd5hXmSWW8Q927x0CEDq76X5veRRyHc5FXnlP2QcPeRvzfwfU6eIhVlLKuOBi/ryw\n\tdbGyQJAzjQYWjN5lpNLdQOE1tN0j7rJguUmre7ccKDAEULN7KCdVN4fjv1eH6Tuot9\n\t3jyO0KKRknGC8nPHJqb91uKEvTPc3Di0YCsYO5MaTTL/BYxQbetnN3eEXu1Q90Oxq3\n\te47GXo55KYB8IKW+eBfr609lcrdb9rSSKSW0cIBnEXKITO1rI/Gou7CofMH07AcZVB\n\tT9ypzaEFSJRmvns/r4mUGBPHAOu+rcovyy8W8OlUdzoTr4v4D4ZsGU+R/uqrlmN33m\n\to+Fbb2xckF3KQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1659911201;\n\tbh=m8TXP2YHOB5ULnIE9rEthItEoKAZAsDoeo277nqXIC4=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=Rn6tVd5KGS7oawbTukN+WeOqopX9xFjt5/+EmI5S1HDrebcz1sJ+myUB6v0VAojl0\n\t1nSG8aK9HbAIoDWzE6xbZ8IWZJjU6d+cizqFncJJDsRCKDj9dsvV16M0YOYKKl9WYz\n\tOfrwgaXTjsJb3l18geDn6kL9kft87fVSziEUlZKk="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Rn6tVd5K\"; dkim-atps=neutral","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","References":"<20220807021718.9789-1-laurent.pinchart@ideasonboard.com>\n\t<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Sun, 07 Aug 2022 23:26:38 +0100","Message-ID":"<165991119826.1706285.14803852933909133961@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","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>","From":"Kieran Bingham via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24410,"web_url":"https://patchwork.libcamera.org/comment/24410/","msgid":"<20220808082829.ibm44ktdl3s5jyei@uno.localdomain>","date":"2022-08-08T08:28:29","subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent\n\nOn Sun, Aug 07, 2022 at 05:17:17AM +0300, Laurent Pinchart via libcamera-devel wrote:\n> In order to prepare for NV12 support, implement support for multi-planar\n> formats in the SDL sink. This mainly consists in passing a vector of\n> plane data to the SDLTexture::update() function instead of a single\n> value.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/sdl_sink.cpp         | 21 +++++++++++++--------\n>  src/cam/sdl_texture.h        |  4 +++-\n>  src/cam/sdl_texture_mjpg.cpp |  4 ++--\n>  src/cam/sdl_texture_mjpg.h   |  2 +-\n>  src/cam/sdl_texture_yuv.cpp  |  4 ++--\n>  src/cam/sdl_texture_yuv.h    |  2 +-\n>  6 files changed, 22 insertions(+), 15 deletions(-)\n>\n> diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp\n> index 04350bd5365b..9675cf275186 100644\n> --- a/src/cam/sdl_sink.cpp\n> +++ b/src/cam/sdl_sink.cpp\n> @@ -185,16 +185,21 @@ void SDLSink::renderBuffer(FrameBuffer *buffer)\n>  {\n>  \tImage *image = mappedBuffers_[buffer].get();\n>\n> -\t/* \\todo Implement support for multi-planar formats. */\n> -\tconst FrameMetadata::Plane &meta = buffer->metadata().planes()[0];\n> +\tstd::vector<Span<const uint8_t>> planes;\n\nYou could .reserve() but it's not a big deal\n\n> +\tunsigned int i = 0;\n>\n> -\tSpan<uint8_t> data = image->data(0);\n> -\tif (meta.bytesused > data.size())\n> -\t\tstd::cerr << \"payload size \" << meta.bytesused\n> -\t\t\t  << \" larger than plane size \" << data.size()\n> -\t\t\t  << std::endl;\n> +\tfor (const FrameMetadata::Plane &meta : buffer->metadata().planes()) {\n\nI was about to suggest\n\n        for (const auto &[i, meta] : utils::enumerate(buffer->metadata().planes())) {\n\nand to use utils::enumerate() I have to:\n\n#include <libcamera/base/utils.h>\n\nWhich gives me\n\nIn file included from ../include/libcamera/base/utils.h:23,\n                 from ../src/cam/image.h:17,\n                 from ../src/cam/image.cpp:8:\n../include/libcamera/base/private.h:21:2: error: #error \"Private headers must not be included in the libcamera API\"\n   21 | #error \"Private headers must not be included in the libcamera API\"\n\nWhich is a bit strange as the file includes several headers from the\n<libcamera/base/> inclusion path already :/\n\nThat apart\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n\n> +\t\tSpan<uint8_t> data = image->data(i);\n> +\t\tif (meta.bytesused > data.size())\n> +\t\t\tstd::cerr << \"payload size \" << meta.bytesused\n> +\t\t\t\t  << \" larger than plane size \" << data.size()\n> +\t\t\t\t  << std::endl;\n>\n> -\ttexture_->update(data);\n> +\t\tplanes.push_back(data);\n> +\t\ti++;\n> +\t}\n> +\n> +\ttexture_->update(planes);\n>\n>  \tSDL_RenderClear(renderer_);\n>  \tSDL_RenderCopy(renderer_, texture_->get(), nullptr, nullptr);\n> diff --git a/src/cam/sdl_texture.h b/src/cam/sdl_texture.h\n> index f523fa5ebf51..e4d3fb2bcf39 100644\n> --- a/src/cam/sdl_texture.h\n> +++ b/src/cam/sdl_texture.h\n> @@ -7,6 +7,8 @@\n>\n>  #pragma once\n>\n> +#include <vector>\n> +\n>  #include <SDL2/SDL.h>\n>\n>  #include \"image.h\"\n> @@ -17,7 +19,7 @@ public:\n>  \tSDLTexture(const SDL_Rect &rect, uint32_t pixelFormat, const int pitch);\n>  \tvirtual ~SDLTexture();\n>  \tint create(SDL_Renderer *renderer);\n> -\tvirtual void update(libcamera::Span<const uint8_t> data) = 0;\n> +\tvirtual void update(const std::vector<libcamera::Span<const uint8_t>> &data) = 0;\n>  \tSDL_Texture *get() const { return ptr_; }\n>\n>  protected:\n> diff --git a/src/cam/sdl_texture_mjpg.cpp b/src/cam/sdl_texture_mjpg.cpp\n> index 7542efd75d96..8dd5ee3eb6bc 100644\n> --- a/src/cam/sdl_texture_mjpg.cpp\n> +++ b/src/cam/sdl_texture_mjpg.cpp\n> @@ -76,8 +76,8 @@ int SDLTextureMJPG::decompress(Span<const uint8_t> data)\n>  \treturn 0;\n>  }\n>\n> -void SDLTextureMJPG::update(Span<const uint8_t> data)\n> +void SDLTextureMJPG::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -\tdecompress(data);\n> +\tdecompress(data[0]);\n>  \tSDL_UpdateTexture(ptr_, nullptr, rgb_.get(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_mjpg.h b/src/cam/sdl_texture_mjpg.h\n> index 5141ed73bf70..814ca79ac193 100644\n> --- a/src/cam/sdl_texture_mjpg.h\n> +++ b/src/cam/sdl_texture_mjpg.h\n> @@ -14,7 +14,7 @@ class SDLTextureMJPG : public SDLTexture\n>  public:\n>  \tSDLTextureMJPG(const SDL_Rect &rect);\n>\n> -\tvoid update(libcamera::Span<const uint8_t> data) override;\n> +\tvoid update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\n>\n>  private:\n>  \tint decompress(libcamera::Span<const uint8_t> data);\n> diff --git a/src/cam/sdl_texture_yuv.cpp b/src/cam/sdl_texture_yuv.cpp\n> index 07df4961a1ab..a5721182a68b 100644\n> --- a/src/cam/sdl_texture_yuv.cpp\n> +++ b/src/cam/sdl_texture_yuv.cpp\n> @@ -14,7 +14,7 @@ SDLTextureYUYV::SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride)\n>  {\n>  }\n>\n> -void SDLTextureYUYV::update(Span<const uint8_t> data)\n> +void SDLTextureYUYV::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -\tSDL_UpdateTexture(ptr_, &rect_, data.data(), pitch_);\n> +\tSDL_UpdateTexture(ptr_, &rect_, data[0].data(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_yuv.h b/src/cam/sdl_texture_yuv.h\n> index 81e51381ec62..c9130298b91d 100644\n> --- a/src/cam/sdl_texture_yuv.h\n> +++ b/src/cam/sdl_texture_yuv.h\n> @@ -13,5 +13,5 @@ class SDLTextureYUYV : public SDLTexture\n>  {\n>  public:\n>  \tSDLTextureYUYV(const SDL_Rect &rect, unsigned int stride);\n> -\tvoid update(libcamera::Span<const uint8_t> data) override;\n> +\tvoid update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\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 50CE6BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Aug 2022 08:28:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 961506332B;\n\tMon,  8 Aug 2022 10:28: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 0D34E63326\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Aug 2022 10:28:35 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id A3F5E20000D;\n\tMon,  8 Aug 2022 08:28:32 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659947316;\n\tbh=74vUbe7ey4hFWmraJ0T8lhLyKJkVdS1UNK88NUeaXFM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=DZb1p7LfHlPKizMZUiDEoM7CTvgBre9W/IzhaJ66C6FEpYdyaLZ/jf6DNA0eDevQv\n\tJrJX4BxgPs/0BUojAnM4S/kT3DVxnLQllhCU/+aACI4cffv+skHd02pzM9SoIc518w\n\taJlQXYqO60UXOXNXbtVVF473Uskuf9tReLfnSqIr8gm0h4JzWTd39UqO2HB6zBcZ+k\n\tojGNQZgRgxmo5caNE0AMJeevKmLzbKj9eAJ6vffHlnIdrNNT72wZaJkInrohRlgSho\n\tOEqz+hAy7R+rEJXehnPjYqUpX5zbiyvgsheLlKMwcyVj85/2BMHjgUllOtwHTk2s0t\n\tam4A70WfEAKjA==","Date":"Mon, 8 Aug 2022 10:28:29 +0200","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20220808082829.ibm44ktdl3s5jyei@uno.localdomain>","References":"<20220807021718.9789-1-laurent.pinchart@ideasonboard.com>\n\t<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24421,"web_url":"https://patchwork.libcamera.org/comment/24421/","msgid":"<CAOgh=Fy1Z5K2JmEmvEwAymHPJT2bNeWX-J5M3pWGfZHxiJqq_Q@mail.gmail.com>","date":"2022-08-08T09:21:16","subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","submitter":{"id":101,"url":"https://patchwork.libcamera.org/api/people/101/","name":"Eric Curtin","email":"ecurtin@redhat.com"},"content":"On Sun, 7 Aug 2022 at 03:17, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> In order to prepare for NV12 support, implement support for multi-planar\n> formats in the SDL sink. This mainly consists in passing a vector of\n> plane data to the SDLTexture::update() function instead of a single\n> value.\n>\n\nLGTM\n\nReviewed-by: Eric Curtin <ecurtin@redhat.com>\n\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/cam/sdl_sink.cpp         | 21 +++++++++++++--------\n>  src/cam/sdl_texture.h        |  4 +++-\n>  src/cam/sdl_texture_mjpg.cpp |  4 ++--\n>  src/cam/sdl_texture_mjpg.h   |  2 +-\n>  src/cam/sdl_texture_yuv.cpp  |  4 ++--\n>  src/cam/sdl_texture_yuv.h    |  2 +-\n>  6 files changed, 22 insertions(+), 15 deletions(-)\n>\n> diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp\n> index 04350bd5365b..9675cf275186 100644\n> --- a/src/cam/sdl_sink.cpp\n> +++ b/src/cam/sdl_sink.cpp\n> @@ -185,16 +185,21 @@ void SDLSink::renderBuffer(FrameBuffer *buffer)\n>  {\n>         Image *image = mappedBuffers_[buffer].get();\n>\n> -       /* \\todo Implement support for multi-planar formats. */\n> -       const FrameMetadata::Plane &meta = buffer->metadata().planes()[0];\n> +       std::vector<Span<const uint8_t>> planes;\n> +       unsigned int i = 0;\n>\n> -       Span<uint8_t> data = image->data(0);\n> -       if (meta.bytesused > data.size())\n> -               std::cerr << \"payload size \" << meta.bytesused\n> -                         << \" larger than plane size \" << data.size()\n> -                         << std::endl;\n> +       for (const FrameMetadata::Plane &meta : buffer->metadata().planes()) {\n> +               Span<uint8_t> data = image->data(i);\n> +               if (meta.bytesused > data.size())\n> +                       std::cerr << \"payload size \" << meta.bytesused\n> +                                 << \" larger than plane size \" << data.size()\n> +                                 << std::endl;\n>\n> -       texture_->update(data);\n> +               planes.push_back(data);\n> +               i++;\n> +       }\n> +\n> +       texture_->update(planes);\n>\n>         SDL_RenderClear(renderer_);\n>         SDL_RenderCopy(renderer_, texture_->get(), nullptr, nullptr);\n> diff --git a/src/cam/sdl_texture.h b/src/cam/sdl_texture.h\n> index f523fa5ebf51..e4d3fb2bcf39 100644\n> --- a/src/cam/sdl_texture.h\n> +++ b/src/cam/sdl_texture.h\n> @@ -7,6 +7,8 @@\n>\n>  #pragma once\n>\n> +#include <vector>\n> +\n>  #include <SDL2/SDL.h>\n>\n>  #include \"image.h\"\n> @@ -17,7 +19,7 @@ public:\n>         SDLTexture(const SDL_Rect &rect, uint32_t pixelFormat, const int pitch);\n>         virtual ~SDLTexture();\n>         int create(SDL_Renderer *renderer);\n> -       virtual void update(libcamera::Span<const uint8_t> data) = 0;\n> +       virtual void update(const std::vector<libcamera::Span<const uint8_t>> &data) = 0;\n>         SDL_Texture *get() const { return ptr_; }\n>\n>  protected:\n> diff --git a/src/cam/sdl_texture_mjpg.cpp b/src/cam/sdl_texture_mjpg.cpp\n> index 7542efd75d96..8dd5ee3eb6bc 100644\n> --- a/src/cam/sdl_texture_mjpg.cpp\n> +++ b/src/cam/sdl_texture_mjpg.cpp\n> @@ -76,8 +76,8 @@ int SDLTextureMJPG::decompress(Span<const uint8_t> data)\n>         return 0;\n>  }\n>\n> -void SDLTextureMJPG::update(Span<const uint8_t> data)\n> +void SDLTextureMJPG::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -       decompress(data);\n> +       decompress(data[0]);\n>         SDL_UpdateTexture(ptr_, nullptr, rgb_.get(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_mjpg.h b/src/cam/sdl_texture_mjpg.h\n> index 5141ed73bf70..814ca79ac193 100644\n> --- a/src/cam/sdl_texture_mjpg.h\n> +++ b/src/cam/sdl_texture_mjpg.h\n> @@ -14,7 +14,7 @@ class SDLTextureMJPG : public SDLTexture\n>  public:\n>         SDLTextureMJPG(const SDL_Rect &rect);\n>\n> -       void update(libcamera::Span<const uint8_t> data) override;\n> +       void update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\n>\n>  private:\n>         int decompress(libcamera::Span<const uint8_t> data);\n> diff --git a/src/cam/sdl_texture_yuv.cpp b/src/cam/sdl_texture_yuv.cpp\n> index 07df4961a1ab..a5721182a68b 100644\n> --- a/src/cam/sdl_texture_yuv.cpp\n> +++ b/src/cam/sdl_texture_yuv.cpp\n> @@ -14,7 +14,7 @@ SDLTextureYUYV::SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride)\n>  {\n>  }\n>\n> -void SDLTextureYUYV::update(Span<const uint8_t> data)\n> +void SDLTextureYUYV::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n>  {\n> -       SDL_UpdateTexture(ptr_, &rect_, data.data(), pitch_);\n> +       SDL_UpdateTexture(ptr_, &rect_, data[0].data(), pitch_);\n>  }\n> diff --git a/src/cam/sdl_texture_yuv.h b/src/cam/sdl_texture_yuv.h\n> index 81e51381ec62..c9130298b91d 100644\n> --- a/src/cam/sdl_texture_yuv.h\n> +++ b/src/cam/sdl_texture_yuv.h\n> @@ -13,5 +13,5 @@ class SDLTextureYUYV : public SDLTexture\n>  {\n>  public:\n>         SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride);\n> -       void update(libcamera::Span<const uint8_t> data) override;\n> +       void update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\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 469A2C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Aug 2022 09:21:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 027B46332B;\n\tMon,  8 Aug 2022 11:21:37 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 69F7463326\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Aug 2022 11:21:35 +0200 (CEST)","from mail-qt1-f197.google.com (mail-qt1-f197.google.com\n\t[209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\tus-mta-55-iYRlhhgHMImWhFPnhLUUYg-1; Mon, 08 Aug 2022 05:21:33 -0400","by mail-qt1-f197.google.com with SMTP id\n\thj2-20020a05622a620200b0034286e2a191so6098583qtb.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 08 Aug 2022 02:21:33 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659950497;\n\tbh=AsyrIfYhWvBXDyotlPmXms+caSylC47Fn8OKa8mUv50=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=gsEBfOUMNnTJxwbQujVRWq7dXsldpngjz9RwWVJpRC0A3zs77pxrDkxQ0eFvHnUSe\n\tLZtfmSFNh/xib8/0uCJlbJa6YvjuIR66M7O5tLUv6HiiUE5J6m8kvmlHo1xPoKqD9h\n\tQFTIUD5F67Yd+f2C+ck1KwDwccNlC7x28SQfbNP4vKIu0IlmWq+PXVnwnE9UG4maPq\n\tfybsMgMzS6dPBsIy1BMg0dL/1TWORDnNv/yNpaowqyCe4cWdKqiBMcVIH8IQXsaMzb\n\tLmO7dwS+e+46c7qGuCdJeeaX5IxGX6LkPK7etzmwsatZuBVyjvmXBLyet3N63Qaqyi\n\tAY1a5KuxRo8zg==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1659950494;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=6GBXgD3o3ySw3xCCKYLSt++hYJjhHvyodnt9q1vE7kM=;\n\tb=KLqfjPJJ6YattuQytOQNSzExNKYgsDhcyokN5LGDbwkqi9B3AL2IU7Wcff21NhFeicLUHH\n\tqvsDouyFhIpqLHalCW/yRnhm1nRs/5N7m3fUT4hNcPw5VgszQMbYJTPWJJzlSD3WD9CjJQ\n\tQeoNFYt/qwXinlG8E7wJraOCAQV+h/E="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=redhat.com\n\theader.i=@redhat.com header.b=\"KLqfjPJJ\"; \n\tdkim-atps=neutral","X-MC-Unique":"iYRlhhgHMImWhFPnhLUUYg-1","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=6GBXgD3o3ySw3xCCKYLSt++hYJjhHvyodnt9q1vE7kM=;\n\tb=RLz72/ejVHARMmzttQ4i6QqyjPMgIRKda7Gui8tjyFMlJC3jkqRKRcB0hHm63f0PA+\n\tZfLpQPRvtKZxS7kHMqzaQSpqxgEWH1vN2wsEt8WIQaC+Ba4fL5mFbko/sN2zta7pHKRi\n\thDdSEUQed6S+eaA86+oTXF/RD5Ipda8pyNOCI6GLT3DSRS3zEXBH0rS6xRHzVJenqIpS\n\tNx5Sd9C+bWfHwBjTp0XwpvcsNLIPFqA0gpMHicP0UfqzvNIn3iW8T/06CTrBSKzaXgVQ\n\tmDBFP3JCU8PzL554Q5oul/JNmMIl/oG5vbnIeyiJwWbfRs3zcY3rBkFYWfdtXPtvGbek\n\tyeqg==","X-Gm-Message-State":"ACgBeo0a2e+9UV7QS8npNiZ6BmPKeoI47t1M3dXfKGUPXRGZl9ucOv2l\n\t010qD5IRB9UKDTwtE8qH2ZwSOhXoHQdfROmpoxw8HR8ZiMidw7f389u0C9HIsGX+ZB8yUqjU5r0\n\t+FtdY0wAuImvdobPRurM8x8dkSd2O3RgqMYNGcg2915X0fIOspQ==","X-Received":["by 2002:a0c:b4c9:0:b0:476:591f:d8df with SMTP id\n\th9-20020a0cb4c9000000b00476591fd8dfmr15542299qvf.81.1659950492669; \n\tMon, 08 Aug 2022 02:21:32 -0700 (PDT)","by 2002:a0c:b4c9:0:b0:476:591f:d8df with SMTP id\n\th9-20020a0cb4c9000000b00476591fd8dfmr15542288qvf.81.1659950492452;\n\tMon, 08 Aug 2022 02:21:32 -0700 (PDT)"],"X-Google-Smtp-Source":"AA6agR4RfLERmBk/dSMtAjC6BjbRV+Pf17zk1rVB82X+D6k4IRm6LjeIKfSRjzqRkT/1GY4XzLYEVR8e53lFr0Mkyjw=","MIME-Version":"1.0","References":"<20220807021718.9789-1-laurent.pinchart@ideasonboard.com>\n\t<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>","Date":"Mon, 8 Aug 2022 10:21:16 +0100","Message-ID":"<CAOgh=Fy1Z5K2JmEmvEwAymHPJT2bNeWX-J5M3pWGfZHxiJqq_Q@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","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>","From":"Eric Curtin via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Eric Curtin <ecurtin@redhat.com>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":24431,"web_url":"https://patchwork.libcamera.org/comment/24431/","msgid":"<YvEeNLsV48K3quP6@pendragon.ideasonboard.com>","date":"2022-08-08T14:31:16","subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Mon, Aug 08, 2022 at 10:28:29AM +0200, Jacopo Mondi wrote:\n> On Sun, Aug 07, 2022 at 05:17:17AM +0300, Laurent Pinchart via libcamera-devel wrote:\n> > In order to prepare for NV12 support, implement support for multi-planar\n> > formats in the SDL sink. This mainly consists in passing a vector of\n> > plane data to the SDLTexture::update() function instead of a single\n> > value.\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/cam/sdl_sink.cpp         | 21 +++++++++++++--------\n> >  src/cam/sdl_texture.h        |  4 +++-\n> >  src/cam/sdl_texture_mjpg.cpp |  4 ++--\n> >  src/cam/sdl_texture_mjpg.h   |  2 +-\n> >  src/cam/sdl_texture_yuv.cpp  |  4 ++--\n> >  src/cam/sdl_texture_yuv.h    |  2 +-\n> >  6 files changed, 22 insertions(+), 15 deletions(-)\n> >\n> > diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp\n> > index 04350bd5365b..9675cf275186 100644\n> > --- a/src/cam/sdl_sink.cpp\n> > +++ b/src/cam/sdl_sink.cpp\n> > @@ -185,16 +185,21 @@ void SDLSink::renderBuffer(FrameBuffer *buffer)\n> >  {\n> >  \tImage *image = mappedBuffers_[buffer].get();\n> >\n> > -\t/* \\todo Implement support for multi-planar formats. */\n> > -\tconst FrameMetadata::Plane &meta = buffer->metadata().planes()[0];\n> > +\tstd::vector<Span<const uint8_t>> planes;\n> \n> You could .reserve() but it's not a big deal\n\nI'll add:\n\n\tplanes.reserve(buffer->metadata()->planes().size());\n\n> > +\tunsigned int i = 0;\n> >\n> > -\tSpan<uint8_t> data = image->data(0);\n> > -\tif (meta.bytesused > data.size())\n> > -\t\tstd::cerr << \"payload size \" << meta.bytesused\n> > -\t\t\t  << \" larger than plane size \" << data.size()\n> > -\t\t\t  << std::endl;\n> > +\tfor (const FrameMetadata::Plane &meta : buffer->metadata().planes()) {\n> \n> I was about to suggest\n> \n>         for (const auto &[i, meta] : utils::enumerate(buffer->metadata().planes())) {\n> \n> and to use utils::enumerate() I have to:\n> \n> #include <libcamera/base/utils.h>\n> \n> Which gives me\n> \n> In file included from ../include/libcamera/base/utils.h:23,\n>                  from ../src/cam/image.h:17,\n>                  from ../src/cam/image.cpp:8:\n> ../include/libcamera/base/private.h:21:2: error: #error \"Private headers must not be included in the libcamera API\"\n>    21 | #error \"Private headers must not be included in the libcamera API\"\n> \n> Which is a bit strange as the file includes several headers from the\n> <libcamera/base/> inclusion path already :/\n\nThat's because some of the base headers are considered private, to avoid\nhaving to maintain ABI compatibility. The headers we expose in the\npublic API are the ones used the libcamera public API:\n\n- bound_method.h\n- class.h\n- compiler.h\n- flags.h\n- message.h\n- mutex.h\n- object.h\n- shared_fd.h\n- signal.h\n- span.h\n- thread.h\n- unique_fd.h\n\nmessage.h, mutex.h and thread.h actually don't need to be exposed. I'll\nsend a patch to make them private.\n\n> That apart\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > +\t\tSpan<uint8_t> data = image->data(i);\n> > +\t\tif (meta.bytesused > data.size())\n> > +\t\t\tstd::cerr << \"payload size \" << meta.bytesused\n> > +\t\t\t\t  << \" larger than plane size \" << data.size()\n> > +\t\t\t\t  << std::endl;\n> >\n> > -\ttexture_->update(data);\n> > +\t\tplanes.push_back(data);\n> > +\t\ti++;\n> > +\t}\n> > +\n> > +\ttexture_->update(planes);\n> >\n> >  \tSDL_RenderClear(renderer_);\n> >  \tSDL_RenderCopy(renderer_, texture_->get(), nullptr, nullptr);\n> > diff --git a/src/cam/sdl_texture.h b/src/cam/sdl_texture.h\n> > index f523fa5ebf51..e4d3fb2bcf39 100644\n> > --- a/src/cam/sdl_texture.h\n> > +++ b/src/cam/sdl_texture.h\n> > @@ -7,6 +7,8 @@\n> >\n> >  #pragma once\n> >\n> > +#include <vector>\n> > +\n> >  #include <SDL2/SDL.h>\n> >\n> >  #include \"image.h\"\n> > @@ -17,7 +19,7 @@ public:\n> >  \tSDLTexture(const SDL_Rect &rect, uint32_t pixelFormat, const int pitch);\n> >  \tvirtual ~SDLTexture();\n> >  \tint create(SDL_Renderer *renderer);\n> > -\tvirtual void update(libcamera::Span<const uint8_t> data) = 0;\n> > +\tvirtual void update(const std::vector<libcamera::Span<const uint8_t>> &data) = 0;\n> >  \tSDL_Texture *get() const { return ptr_; }\n> >\n> >  protected:\n> > diff --git a/src/cam/sdl_texture_mjpg.cpp b/src/cam/sdl_texture_mjpg.cpp\n> > index 7542efd75d96..8dd5ee3eb6bc 100644\n> > --- a/src/cam/sdl_texture_mjpg.cpp\n> > +++ b/src/cam/sdl_texture_mjpg.cpp\n> > @@ -76,8 +76,8 @@ int SDLTextureMJPG::decompress(Span<const uint8_t> data)\n> >  \treturn 0;\n> >  }\n> >\n> > -void SDLTextureMJPG::update(Span<const uint8_t> data)\n> > +void SDLTextureMJPG::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n> >  {\n> > -\tdecompress(data);\n> > +\tdecompress(data[0]);\n> >  \tSDL_UpdateTexture(ptr_, nullptr, rgb_.get(), pitch_);\n> >  }\n> > diff --git a/src/cam/sdl_texture_mjpg.h b/src/cam/sdl_texture_mjpg.h\n> > index 5141ed73bf70..814ca79ac193 100644\n> > --- a/src/cam/sdl_texture_mjpg.h\n> > +++ b/src/cam/sdl_texture_mjpg.h\n> > @@ -14,7 +14,7 @@ class SDLTextureMJPG : public SDLTexture\n> >  public:\n> >  \tSDLTextureMJPG(const SDL_Rect &rect);\n> >\n> > -\tvoid update(libcamera::Span<const uint8_t> data) override;\n> > +\tvoid update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\n> >\n> >  private:\n> >  \tint decompress(libcamera::Span<const uint8_t> data);\n> > diff --git a/src/cam/sdl_texture_yuv.cpp b/src/cam/sdl_texture_yuv.cpp\n> > index 07df4961a1ab..a5721182a68b 100644\n> > --- a/src/cam/sdl_texture_yuv.cpp\n> > +++ b/src/cam/sdl_texture_yuv.cpp\n> > @@ -14,7 +14,7 @@ SDLTextureYUYV::SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride)\n> >  {\n> >  }\n> >\n> > -void SDLTextureYUYV::update(Span<const uint8_t> data)\n> > +void SDLTextureYUYV::update(const std::vector<libcamera::Span<const uint8_t>> &data)\n> >  {\n> > -\tSDL_UpdateTexture(ptr_, &rect_, data.data(), pitch_);\n> > +\tSDL_UpdateTexture(ptr_, &rect_, data[0].data(), pitch_);\n> >  }\n> > diff --git a/src/cam/sdl_texture_yuv.h b/src/cam/sdl_texture_yuv.h\n> > index 81e51381ec62..c9130298b91d 100644\n> > --- a/src/cam/sdl_texture_yuv.h\n> > +++ b/src/cam/sdl_texture_yuv.h\n> > @@ -13,5 +13,5 @@ class SDLTextureYUYV : public SDLTexture\n> >  {\n> >  public:\n> >  \tSDLTextureYUYV(const SDL_Rect &rect, unsigned int stride);\n> > -\tvoid update(libcamera::Span<const uint8_t> data) override;\n> > +\tvoid update(const std::vector<libcamera::Span<const uint8_t>> &data) override;\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 047D6C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Aug 2022 14:31:29 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7E8D16332B;\n\tMon,  8 Aug 2022 16:31:28 +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 8A43663315\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Aug 2022 16:31:27 +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 E90D230A;\n\tMon,  8 Aug 2022 16:31:26 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659969088;\n\tbh=+bJSOgFQyKelg4phAvcul2UMRGTm3hfU99VXUz27iOI=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=Zan++R301MmhZORxTm5e+e5teZRSPj6W9RhX5m6Qr4EVAlh7hBkUr90LspUiztb8L\n\tNlshwYHul5mgGnuhSt0A+ZP1Nugoa0VOYMTvr7o06aMcykXnkb/bYXjVMrGh9zfynR\n\tCXHtnYDCkzyj8z2vfB3OlARVsFDVZGNobq7I26l0M6i14r74Xgs4pXubkKG+QkGgCm\n\tpIAFxM5e7su2Qe1hQLzgT8kMP48UNpUOX2GGyBEi1YQEIlOWiMlNyoSlA9jyOHCL8e\n\t3AwpeX1csKDHz+6fYjn2QXu9wKeW/f+y0x2pYL+g+k0W/hTwZ8YMX4sEXaY+3mnT5+\n\tCf4a8WPB2a9Zg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1659969087;\n\tbh=+bJSOgFQyKelg4phAvcul2UMRGTm3hfU99VXUz27iOI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=PEmmT1CzEhM+L+p2YGlUbscMURbMA/YqTOX+84Q2+vpJc1rVQS8YegpQjp5r7BJrv\n\thpLD4QO5a5Ozp1ZTVNaJ8YvkTGFozwp/YOxJ3idxG7tHOhOOxiuPsTsT1h0fdCz3ZA\n\tu2lV8pn/ZQjU2kz5DDIaoUgqw/U98ZVrTD9rvEKc="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"PEmmT1Cz\"; dkim-atps=neutral","Date":"Mon, 8 Aug 2022 17:31:16 +0300","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YvEeNLsV48K3quP6@pendragon.ideasonboard.com>","References":"<20220807021718.9789-1-laurent.pinchart@ideasonboard.com>\n\t<20220807021718.9789-4-laurent.pinchart@ideasonboard.com>\n\t<20220808082829.ibm44ktdl3s5jyei@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220808082829.ibm44ktdl3s5jyei@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH 3/4] cam: sdl_sink: Support\n\tmulti-planar formats","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]