[{"id":36407,"web_url":"https://patchwork.libcamera.org/comment/36407/","msgid":"<20251023163232.GA21554@pendragon.ideasonboard.com>","date":"2025-10-23T16:32:32","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n> so add support for it.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  src/apps/cam/sdl_sink.cpp        |  4 +++-\n>  src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n>  src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n>  3 files changed, 14 insertions(+), 7 deletions(-)\n> \n> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> index 30cfdf0af..17a9e04b5 100644\n> --- a/src/apps/cam/sdl_sink.cpp\n> +++ b/src/apps/cam/sdl_sink.cpp\n> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n>  #endif\n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n>  \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n>  #endif\n>  \telse {\n>  \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n> index bed297d28..40d1a3ae9 100644\n> --- a/src/apps/cam/sdl_texture_yuv.cpp\n> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n> @@ -7,16 +7,21 @@\n>  \n>  #include \"sdl_texture_yuv.h\"\n>  \n> -using namespace libcamera;\n> +#include <assert.h>\n>  \n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n> +\t: SDLTexture(rect, pixelFormat, stride)\n>  {\n> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n>  }\n>  \n> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>  {\n> +\tassert(data.size() == 2);\n> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n\nThat seems quite strict, >= could be better. You should also mention the\nreason for this change in the commit message.\n\n> +\n>  \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n>  \t\t\t    data[1].data(), stride_);\n>  }\n> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n> index c271f901b..8e73506d1 100644\n> --- a/src/apps/cam/sdl_texture_yuv.h\n> +++ b/src/apps/cam/sdl_texture_yuv.h\n> @@ -10,10 +10,10 @@\n>  #include \"sdl_texture.h\"\n>  \n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n> -class SDLTextureNV12 : public SDLTexture\n> +class SDLTextureNV final : public SDLTexture\n\nSame here, explain in the commit message why you add final.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  {\n>  public:\n> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n>  \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n>  };\n>  #endif","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 B013BC3259\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Oct 2025 16:32:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B037360812;\n\tThu, 23 Oct 2025 18:32:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B954A607EE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Oct 2025 18:32:44 +0200 (CEST)","from pendragon.ideasonboard.com (82-203-161-16.bb.dnainternet.fi\n\t[82.203.161.16])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 885F44C7;\n\tThu, 23 Oct 2025 18:30:59 +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=\"Of2odeU1\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761237059;\n\tbh=X1mAZ4uK3MpdAquRhJy82toSFvYIvRw9vTDHOHwM/3I=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Of2odeU1O/aetToOzzmwVCvu5T2MlTFC6m7q3sHpYcKV7yUPHFkEMBSWXLrYsNjrk\n\tbIUqEArKIZ8YgIlLR+DN5oHKY3nveihKkvHt2FbjEZABqw6QHUN+unKhOp4Y9AW+p6\n\ttwLXezbN7WjD+YM/SF017KKtPHBe8S6FdD8fimL0=","Date":"Thu, 23 Oct 2025 19:32:32 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","Message-ID":"<20251023163232.GA21554@pendragon.ideasonboard.com>","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>","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":36415,"web_url":"https://patchwork.libcamera.org/comment/36415/","msgid":"<4d7ee62f-c5f7-474e-8782-e8ba1ac2ee81@ideasonboard.com>","date":"2025-10-23T18:25:06","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 10. 23. 18:32 keltezéssel, Laurent Pinchart írta:\n> On Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n>> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n>> so add support for it.\n>>\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   src/apps/cam/sdl_sink.cpp        |  4 +++-\n>>   src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n>>   src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n>>   3 files changed, 14 insertions(+), 7 deletions(-)\n>>\n>> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n>> index 30cfdf0af..17a9e04b5 100644\n>> --- a/src/apps/cam/sdl_sink.cpp\n>> +++ b/src/apps/cam/sdl_sink.cpp\n>> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n>>   #endif\n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>>   \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n>> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n>> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n>>   #endif\n>>   \telse {\n>>   \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n>> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n>> index bed297d28..40d1a3ae9 100644\n>> --- a/src/apps/cam/sdl_texture_yuv.cpp\n>> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n>> @@ -7,16 +7,21 @@\n>>   \n>>   #include \"sdl_texture_yuv.h\"\n>>   \n>> -using namespace libcamera;\n>> +#include <assert.h>\n>>   \n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n>> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n>> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n>> +\t: SDLTexture(rect, pixelFormat, stride)\n>>   {\n>> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n>>   }\n>>   \n>> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>>   {\n>> +\tassert(data.size() == 2);\n>> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n>> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n> \n> That seems quite strict, >= could be better. You should also mention the\n> reason for this change in the commit message.\n\nI assume the `data.size()` check is fine with `==`. For the other two,\ndo you have anything specific in mind? Is it reasonable to expect tail\npadding in the buffer?\n\n\nRegards,\nBarnabás Pőcze\n\n> \n>> +\n>>   \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n>>   \t\t\t    data[1].data(), stride_);\n>>   }\n>> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n>> index c271f901b..8e73506d1 100644\n>> --- a/src/apps/cam/sdl_texture_yuv.h\n>> +++ b/src/apps/cam/sdl_texture_yuv.h\n>> @@ -10,10 +10,10 @@\n>>   #include \"sdl_texture.h\"\n>>   \n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>> -class SDLTextureNV12 : public SDLTexture\n>> +class SDLTextureNV final : public SDLTexture\n> \n> Same here, explain in the commit message why you add final.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n>>   {\n>>   public:\n>> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n>> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n>>   \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n>>   };\n>>   #endif\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 BCEC1C3259\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Oct 2025 18:25:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C65A760829;\n\tThu, 23 Oct 2025 20:25:13 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AC2B2607F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Oct 2025 20:25:12 +0200 (CEST)","from [192.168.33.33] (185.221.141.231.nat.pool.zt.hu\n\t[185.221.141.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 51368EFE;\n\tThu, 23 Oct 2025 20:23:27 +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=\"ZHU1E1mi\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761243807;\n\tbh=TChD4uQw26zyJD9RMjFyNoBy4lffxzgGACvHwbm7iWc=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=ZHU1E1mi+sQ1eB2q6EcwTz05okTWRH6DmQF5HHWZlz1uWC1uzetWtPRKiz4PyDeUL\n\ttnwS5ilBd2jzcPN0ALQnLbngwvXIo/V0Qne2i9aYX2DHYEs2NSrgfbzy8TM3sq4jFU\n\tnpKrz2Xd4x+DqFLAYZqlyUsdn4YY4wBLknJEkP6c=","Message-ID":"<4d7ee62f-c5f7-474e-8782-e8ba1ac2ee81@ideasonboard.com>","Date":"Thu, 23 Oct 2025 20:25:06 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>\n\t<20251023163232.GA21554@pendragon.ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20251023163232.GA21554@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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":36416,"web_url":"https://patchwork.libcamera.org/comment/36416/","msgid":"<20251023191800.GB21554@pendragon.ideasonboard.com>","date":"2025-10-23T19:18:00","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Oct 23, 2025 at 08:25:06PM +0200, Barnabás Pőcze wrote:\n> 2025. 10. 23. 18:32 keltezéssel, Laurent Pinchart írta:\n> > On Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n> >> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n> >> so add support for it.\n> >>\n> >> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> >> ---\n> >>   src/apps/cam/sdl_sink.cpp        |  4 +++-\n> >>   src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n> >>   src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n> >>   3 files changed, 14 insertions(+), 7 deletions(-)\n> >>\n> >> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> >> index 30cfdf0af..17a9e04b5 100644\n> >> --- a/src/apps/cam/sdl_sink.cpp\n> >> +++ b/src/apps/cam/sdl_sink.cpp\n> >> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n> >>   #endif\n> >>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n> >>   \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n> >> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n> >> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n> >> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n> >> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n> >>   #endif\n> >>   \telse {\n> >>   \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n> >> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n> >> index bed297d28..40d1a3ae9 100644\n> >> --- a/src/apps/cam/sdl_texture_yuv.cpp\n> >> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n> >> @@ -7,16 +7,21 @@\n> >>   \n> >>   #include \"sdl_texture_yuv.h\"\n> >>   \n> >> -using namespace libcamera;\n> >> +#include <assert.h>\n> >>   \n> >>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n> >> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n> >> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n> >> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n> >> +\t: SDLTexture(rect, pixelFormat, stride)\n> >>   {\n> >> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n> >>   }\n> >>   \n> >> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n> >> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n> >>   {\n> >> +\tassert(data.size() == 2);\n> >> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n> >> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n> > \n> > That seems quite strict, >= could be better. You should also mention the\n> > reason for this change in the commit message.\n> \n> I assume the `data.size()` check is fine with `==`.\n\nYes sorry.\n\n> For the other two,\n> do you have anything specific in mind? Is it reasonable to expect tail\n> padding in the buffer?\n\nPadding is what I had in mind, yes. We may not have a use case for that\nin the cam application though. The SDL classes are not generic.\n\nHave you seen those assertions fail, can it happen with the current code\nbase ?\n\n> >> +\n> >>   \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n> >>   \t\t\t    data[1].data(), stride_);\n> >>   }\n> >> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n> >> index c271f901b..8e73506d1 100644\n> >> --- a/src/apps/cam/sdl_texture_yuv.h\n> >> +++ b/src/apps/cam/sdl_texture_yuv.h\n> >> @@ -10,10 +10,10 @@\n> >>   #include \"sdl_texture.h\"\n> >>   \n> >>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n> >> -class SDLTextureNV12 : public SDLTexture\n> >> +class SDLTextureNV final : public SDLTexture\n> > \n> > Same here, explain in the commit message why you add final.\n> > \n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > \n> >>   {\n> >>   public:\n> >> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n> >> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n> >>   \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n> >>   };\n> >>   #endif","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 9751EBE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Oct 2025 19:18:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8D11860842;\n\tThu, 23 Oct 2025 21:18:14 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5D09F606E1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Oct 2025 21:18:13 +0200 (CEST)","from pendragon.ideasonboard.com (82-203-161-16.bb.dnainternet.fi\n\t[82.203.161.16])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 08C5D56D;\n\tThu, 23 Oct 2025 21:16:27 +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=\"Gh83hfCv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761246988;\n\tbh=msvGHegrDv/KE0Pcy7caxeuoIIpWQIf20noVLGAkepE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Gh83hfCvUmdCSUMIw5ASwOkJVpOju1VxWZXzRkBAAaqrHy8g1AfScfKTYt3TI7NO9\n\tNdHKIs077L1tQQxtgGKxeyAnQDqcvV9yp1rkWWvy5WNTjXUwB1zqFFXaPYXTg2y2yI\n\t3gbnmHdPJVp/SAZ5mVwOxSH29HeggHpTUqXH8Pbk=","Date":"Thu, 23 Oct 2025 22:18:00 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","Message-ID":"<20251023191800.GB21554@pendragon.ideasonboard.com>","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>\n\t<20251023163232.GA21554@pendragon.ideasonboard.com>\n\t<4d7ee62f-c5f7-474e-8782-e8ba1ac2ee81@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<4d7ee62f-c5f7-474e-8782-e8ba1ac2ee81@ideasonboard.com>","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":36430,"web_url":"https://patchwork.libcamera.org/comment/36430/","msgid":"<df394716-6bce-4025-b2ee-2df42ec8a8c7@ideasonboard.com>","date":"2025-10-24T11:43:04","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 10. 23. 21:18 keltezéssel, Laurent Pinchart írta:\n> On Thu, Oct 23, 2025 at 08:25:06PM +0200, Barnabás Pőcze wrote:\n>> 2025. 10. 23. 18:32 keltezéssel, Laurent Pinchart írta:\n>>> On Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n>>>> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n>>>> so add support for it.\n>>>>\n>>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>>>> ---\n>>>>    src/apps/cam/sdl_sink.cpp        |  4 +++-\n>>>>    src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n>>>>    src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n>>>>    3 files changed, 14 insertions(+), 7 deletions(-)\n>>>>\n>>>> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n>>>> index 30cfdf0af..17a9e04b5 100644\n>>>> --- a/src/apps/cam/sdl_sink.cpp\n>>>> +++ b/src/apps/cam/sdl_sink.cpp\n>>>> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n>>>>    #endif\n>>>>    #if SDL_VERSION_ATLEAST(2, 0, 16)\n>>>>    \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n>>>> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n>>>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n>>>> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n>>>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n>>>>    #endif\n>>>>    \telse {\n>>>>    \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n>>>> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n>>>> index bed297d28..40d1a3ae9 100644\n>>>> --- a/src/apps/cam/sdl_texture_yuv.cpp\n>>>> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n>>>> @@ -7,16 +7,21 @@\n>>>>    \n>>>>    #include \"sdl_texture_yuv.h\"\n>>>>    \n>>>> -using namespace libcamera;\n>>>> +#include <assert.h>\n>>>>    \n>>>>    #if SDL_VERSION_ATLEAST(2, 0, 16)\n>>>> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n>>>> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n>>>> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n>>>> +\t: SDLTexture(rect, pixelFormat, stride)\n>>>>    {\n>>>> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n>>>>    }\n>>>>    \n>>>> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>>>> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>>>>    {\n>>>> +\tassert(data.size() == 2);\n>>>> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n>>>> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n>>>\n>>> That seems quite strict, >= could be better. You should also mention the\n>>> reason for this change in the commit message.\n>>\n>> I assume the `data.size()` check is fine with `==`.\n> \n> Yes sorry.\n> \n>> For the other two,\n>> do you have anything specific in mind? Is it reasonable to expect tail\n>> padding in the buffer?\n> \n> Padding is what I had in mind, yes. We may not have a use case for that\n> in the cam application though. The SDL classes are not generic.\n> \n> Have you seen those assertions fail, can it happen with the current code\n> base ?\n\nI haven't seen them fail. For different pixel formats, but there is a similar\nassertion in `SDLTexture1Plane::update()`, which was added before 0.5.1, and no\ncomplaints so far.\n\n\n> \n>>>> +\n>>>>    \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n>>>>    \t\t\t    data[1].data(), stride_);\n>>>>    }\n>>>> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n>>>> index c271f901b..8e73506d1 100644\n>>>> --- a/src/apps/cam/sdl_texture_yuv.h\n>>>> +++ b/src/apps/cam/sdl_texture_yuv.h\n>>>> @@ -10,10 +10,10 @@\n>>>>    #include \"sdl_texture.h\"\n>>>>    \n>>>>    #if SDL_VERSION_ATLEAST(2, 0, 16)\n>>>> -class SDLTextureNV12 : public SDLTexture\n>>>> +class SDLTextureNV final : public SDLTexture\n>>>\n>>> Same here, explain in the commit message why you add final.\n>>>\n>>> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>>>\n>>>>    {\n>>>>    public:\n>>>> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n>>>> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n>>>>    \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n>>>>    };\n>>>>    #endif\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 4CB8ABE080\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Oct 2025 11:43:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9A000608CD;\n\tFri, 24 Oct 2025 13:43:09 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 830AD608BD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Oct 2025 13:43:07 +0200 (CEST)","from [192.168.33.13] (185.221.141.231.nat.pool.zt.hu\n\t[185.221.141.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DF7CF1AC5;\n\tFri, 24 Oct 2025 13:41:21 +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=\"b340r2kn\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761306082;\n\tbh=kWLkpWTTex5uF41A4TBOy/lZN5HzZOsbOf15IAH8dP4=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=b340r2kniSn2k5iM7o63qLbmt7TvGZpWse1vJiU2ATpnSa7CyJbTlF80g3CCr9SEo\n\ttMBvzOXVPQbes7VTDnq9qfDI3K/1ORLVayrgILhMQE5wz6sNI8nKVkj7X0eqfGmXPG\n\tiVXo2MSEVEfXNbRKEccTKJu1idMizgR+yACpHiOM=","Message-ID":"<df394716-6bce-4025-b2ee-2df42ec8a8c7@ideasonboard.com>","Date":"Fri, 24 Oct 2025 13:43:04 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>\n\t<20251023163232.GA21554@pendragon.ideasonboard.com>\n\t<4d7ee62f-c5f7-474e-8782-e8ba1ac2ee81@ideasonboard.com>\n\t<20251023191800.GB21554@pendragon.ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20251023191800.GB21554@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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":36586,"web_url":"https://patchwork.libcamera.org/comment/36586/","msgid":"<ce5o3reo4ckazrx4yrpbkzmaz2pdj2uppw4mktpztzycykvul6@k5ofbm7xjtix>","date":"2025-11-01T08:47:07","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n> so add support for it.\n>\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  src/apps/cam/sdl_sink.cpp        |  4 +++-\n>  src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n>  src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n>  3 files changed, 14 insertions(+), 7 deletions(-)\n>\n> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n> index 30cfdf0af..17a9e04b5 100644\n> --- a/src/apps/cam/sdl_sink.cpp\n> +++ b/src/apps/cam/sdl_sink.cpp\n> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n>  #endif\n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n>  \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n>  #endif\n>  \telse {\n>  \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n> index bed297d28..40d1a3ae9 100644\n> --- a/src/apps/cam/sdl_texture_yuv.cpp\n> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n> @@ -7,16 +7,21 @@\n>\n>  #include \"sdl_texture_yuv.h\"\n>\n> -using namespace libcamera;\n\nThat would be unrelated, but ok\n\n> +#include <assert.h>\n>\n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n> +\t: SDLTexture(rect, pixelFormat, stride)\n>  {\n> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n>  }\n>\n> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>  {\n> +\tassert(data.size() == 2);\n> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n\nI agree the assertion might be too strict. However I wonder how would\nSDL_UpdateNVTexture() react if passed a data array larger than\nexpected. I guess we can start with this and eventually drop it if any\nuse case require padding\n\n> +\n>  \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n>  \t\t\t    data[1].data(), stride_);\n>  }\n> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n> index c271f901b..8e73506d1 100644\n> --- a/src/apps/cam/sdl_texture_yuv.h\n> +++ b/src/apps/cam/sdl_texture_yuv.h\n> @@ -10,10 +10,10 @@\n>  #include \"sdl_texture.h\"\n>\n>  #if SDL_VERSION_ATLEAST(2, 0, 16)\n> -class SDLTextureNV12 : public SDLTexture\n> +class SDLTextureNV final : public SDLTexture\n\nAlso unrelated\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\n>  {\n>  public:\n> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n>  \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n>  };\n>  #endif\n> --\n> 2.51.1.dirty\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 7B73CC3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat,  1 Nov 2025 08:47:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BBC2660A80;\n\tSat,  1 Nov 2025 09:47:14 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5C2E4606A0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  1 Nov 2025 09:47:12 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2001:b07:6462:5de2:153:f9b8:5024:faa2])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A6CC9236;\n\tSat,  1 Nov 2025 09:45:20 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"M25ozklm\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1761986720;\n\tbh=++nzyeJnpw+FeHjNevdrDZG2cVKzMayyeFhfwMOA8vk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=M25ozklm1ddxsOBOyOob5Qi6DrCO70BhWk5vVIZtLma+XZRDdw+/8BOFeexGREvI/\n\toFE4TkBjvTaOhZTW+k3qAcgphThEc0NaU+Ts6avX/mm0KetFd/iUGAiw0+I4oxZgm+\n\t8EY2kgqkR96UKgSQa3NDogkmqNChtN6XYSpjZvbU=","Date":"Sat, 1 Nov 2025 09:47:07 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","Message-ID":"<ce5o3reo4ckazrx4yrpbkzmaz2pdj2uppw4mktpztzycykvul6@k5ofbm7xjtix>","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>","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":36849,"web_url":"https://patchwork.libcamera.org/comment/36849/","msgid":"<cc7f3c1a-457e-4d0b-9456-716d461db4d5@ideasonboard.com>","date":"2025-11-17T10:40:15","subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 11. 01. 9:47 keltezéssel, Jacopo Mondi írta:\n> Hi Barnabás\n> \n> On Thu, Oct 23, 2025 at 04:51:39PM +0200, Barnabás Pőcze wrote:\n>> SDL also supports NV21 with the same `SDL_UpdateNVTexture()`,\n>> so add support for it.\n>>\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   src/apps/cam/sdl_sink.cpp        |  4 +++-\n>>   src/apps/cam/sdl_texture_yuv.cpp | 13 +++++++++----\n>>   src/apps/cam/sdl_texture_yuv.h   |  4 ++--\n>>   3 files changed, 14 insertions(+), 7 deletions(-)\n>>\n>> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp\n>> index 30cfdf0af..17a9e04b5 100644\n>> --- a/src/apps/cam/sdl_sink.cpp\n>> +++ b/src/apps/cam/sdl_sink.cpp\n>> @@ -112,7 +112,9 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)\n>>   #endif\n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>>   \telse if (cfg.pixelFormat == libcamera::formats::NV12)\n>> -\t\ttexture_ = std::make_unique<SDLTextureNV12>(rect_, cfg.stride);\n>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV12, cfg.stride);\n>> +\telse if (cfg.pixelFormat == libcamera::formats::NV21)\n>> +\t\ttexture_ = std::make_unique<SDLTextureNV>(rect_, SDL_PIXELFORMAT_NV21, cfg.stride);\n>>   #endif\n>>   \telse {\n>>   \t\tstd::cerr << \"Unsupported pixel format \" << cfg.pixelFormat << std::endl;\n>> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp\n>> index bed297d28..40d1a3ae9 100644\n>> --- a/src/apps/cam/sdl_texture_yuv.cpp\n>> +++ b/src/apps/cam/sdl_texture_yuv.cpp\n>> @@ -7,16 +7,21 @@\n>>\n>>   #include \"sdl_texture_yuv.h\"\n>>\n>> -using namespace libcamera;\n> \n> That would be unrelated, but ok\n> \n>> +#include <assert.h>\n>>\n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>> -SDLTextureNV12::SDLTextureNV12(const SDL_Rect &rect, unsigned int stride)\n>> -\t: SDLTexture(rect, SDL_PIXELFORMAT_NV12, stride)\n>> +SDLTextureNV::SDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride)\n>> +\t: SDLTexture(rect, pixelFormat, stride)\n>>   {\n>> +\tassert(pixelFormat == SDL_PIXELFORMAT_NV12 || pixelFormat == SDL_PIXELFORMAT_NV21);\n>>   }\n>>\n>> -void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>> +void SDLTextureNV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)\n>>   {\n>> +\tassert(data.size() == 2);\n>> +\tassert(data[0].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_));\n>> +\tassert(data[1].size_bytes() == std::size_t(rect_.h) * std::size_t(stride_) / 2);\n> \n> I agree the assertion might be too strict. However I wonder how would\n> SDL_UpdateNVTexture() react if passed a data array larger than\n> expected. I guess we can start with this and eventually drop it if any\n> use case require padding\n\nI think so, too. This kind of strict checking is already done in sdl_texture_1plance.cpp\nand no complaints so far.\n\n\n> \n>> +\n>>   \tSDL_UpdateNVTexture(ptr_, nullptr, data[0].data(), stride_,\n>>   \t\t\t    data[1].data(), stride_);\n>>   }\n>> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h\n>> index c271f901b..8e73506d1 100644\n>> --- a/src/apps/cam/sdl_texture_yuv.h\n>> +++ b/src/apps/cam/sdl_texture_yuv.h\n>> @@ -10,10 +10,10 @@\n>>   #include \"sdl_texture.h\"\n>>\n>>   #if SDL_VERSION_ATLEAST(2, 0, 16)\n>> -class SDLTextureNV12 : public SDLTexture\n>> +class SDLTextureNV final : public SDLTexture\n> \n> Also unrelated\n\nRemoved.\n\n\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> \n>>   {\n>>   public:\n>> -\tSDLTextureNV12(const SDL_Rect &rect, unsigned int stride);\n>> +\tSDLTextureNV(const SDL_Rect &rect, uint32_t pixelFormat, unsigned int stride);\n>>   \tvoid update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;\n>>   };\n>>   #endif\n>> --\n>> 2.51.1.dirty\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 484D4C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 17 Nov 2025 10:40:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5E31D60A8B;\n\tMon, 17 Nov 2025 11:40:23 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9CFDD606A0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Nov 2025 11:40:21 +0100 (CET)","from [192.168.33.31] (185.221.143.100.nat.pool.zt.hu\n\t[185.221.143.100])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EFB22142;\n\tMon, 17 Nov 2025 11:38:17 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"oobRRZvs\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1763375898;\n\tbh=qE5/1JOyKZPNjc4aJI6j2tL9Egpd9xMZCvczEncj0lk=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=oobRRZvsV2sybjRY3krMtFso1Jc3vm7IJ0oAOv56xTd/6ELGhJcSw5qdBG5aU3IX0\n\tSElpFshkUf5s3fVWp7daB8+aTG70Wt3ylaZBvyPwFB5FOTa4AfzNRrz6c0qiqyonwW\n\tr7Gibx9FurXWhXRl9e8vVpnpNVQHGYuFV5yh6pPk=","Message-ID":"<cc7f3c1a-457e-4d0b-9456-716d461db4d5@ideasonboard.com>","Date":"Mon, 17 Nov 2025 11:40:15 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1] apps: cam: sdl_texture: Support NV21","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20251023145139.1085153-1-barnabas.pocze@ideasonboard.com>\n\t<ce5o3reo4ckazrx4yrpbkzmaz2pdj2uppw4mktpztzycykvul6@k5ofbm7xjtix>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<ce5o3reo4ckazrx4yrpbkzmaz2pdj2uppw4mktpztzycykvul6@k5ofbm7xjtix>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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>"}}]