[PATCH v2 3/4] apps: cam: sdl_texture: Add `SDLTexture1Plane`

Barnabás Pőcze barnabas.pocze at ideasonboard.com
Fri Apr 25 14:59:18 CEST 2025


Hi


2025. 04. 25. 14:41 keltezéssel, Laurent Pinchart írta:
> Hi Barnabás,
> 
> Thank you for the patch.
> 
> On Fri, Apr 25, 2025 at 12:47:02PM +0200, Barnabás Pőcze wrote:
>> `SDLTextureYUYV` uses `SDL_PIXELFORMAT_YUY2`, which is a single plane
>> format. To support other single plane formats, replace `SDLTextureYUYV`
>> with `SDLTexture1Plane` that can be instantiated with an arbitrary SDL
>> pixel format and that uses `SDL_UpdateTexture()` to update the texture
>> using exactly a single plane.
>>
>> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
>> ---
>>   src/apps/cam/sdl_sink.cpp         |  3 ++-
>>   src/apps/cam/sdl_texture_1plane.h | 18 ++++++++++++++++++
>>   src/apps/cam/sdl_texture_yuv.cpp  | 10 ----------
>>   src/apps/cam/sdl_texture_yuv.h    |  7 -------
>>   4 files changed, 20 insertions(+), 18 deletions(-)
>>   create mode 100644 src/apps/cam/sdl_texture_1plane.h
>>
>> diff --git a/src/apps/cam/sdl_sink.cpp b/src/apps/cam/sdl_sink.cpp
>> index 8355dd5ed..b295675dc 100644
>> --- a/src/apps/cam/sdl_sink.cpp
>> +++ b/src/apps/cam/sdl_sink.cpp
>> @@ -22,6 +22,7 @@
>>   #include "../common/event_loop.h"
>>   #include "../common/image.h"
>>   
>> +#include "sdl_texture_1plane.h"
>>   #ifdef HAVE_LIBJPEG
>>   #include "sdl_texture_mjpg.h"
>>   #endif
>> @@ -74,7 +75,7 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)
>>   		break;
>>   #endif
>>   	case libcamera::formats::YUYV:
>> -		texture_ = std::make_unique<SDLTextureYUYV>(rect_, cfg.stride);
>> +		texture_ = std::make_unique<SDLTexture1Plane>(rect_, SDL_PIXELFORMAT_YUY2, cfg.stride);
>>   		break;
>>   	default:
>>   		std::cerr << "Unsupported pixel format "
>> diff --git a/src/apps/cam/sdl_texture_1plane.h b/src/apps/cam/sdl_texture_1plane.h
>> new file mode 100644
>> index 000000000..ded35c589
>> --- /dev/null
>> +++ b/src/apps/cam/sdl_texture_1plane.h
>> @@ -0,0 +1,18 @@
>> +#pragma once
>> +
>> +#include <assert.h>
>> +
>> +#include "sdl_texture.h"
>> +
>> +class SDLTexture1Plane final : public SDLTexture
>> +{
>> +public:
>> +	using SDLTexture::SDLTexture;
>> +
>> +	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override
>> +	{
>> +		assert(data.size() == 1);
>> +		assert(data[0].size_bytes() == std::size_t(rect_.h * stride_));
>> +		SDL_UpdateTexture(ptr_, nullptr, data[0].data(), stride_);
>> +	}
> 
> Do we need to inline this function, can't it go to a .cpp file ?

It could certainly be in a cpp file, I can move it if you want me to. I just kept it here
for simplicity and because it is only used in a single cpp file.


Regards,
Barnabás Pőcze

> 
> With that handled,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
>> +};
>> diff --git a/src/apps/cam/sdl_texture_yuv.cpp b/src/apps/cam/sdl_texture_yuv.cpp
>> index 7e2ce3f49..bed297d28 100644
>> --- a/src/apps/cam/sdl_texture_yuv.cpp
>> +++ b/src/apps/cam/sdl_texture_yuv.cpp
>> @@ -21,13 +21,3 @@ void SDLTextureNV12::update(libcamera::Span<const libcamera::Span<const uint8_t>
>>   			    data[1].data(), stride_);
>>   }
>>   #endif
>> -
>> -SDLTextureYUYV::SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride)
>> -	: SDLTexture(rect, SDL_PIXELFORMAT_YUY2, stride)
>> -{
>> -}
>> -
>> -void SDLTextureYUYV::update(libcamera::Span<const libcamera::Span<const uint8_t>> data)
>> -{
>> -	SDL_UpdateTexture(ptr_, nullptr, data[0].data(), stride_);
>> -}
>> diff --git a/src/apps/cam/sdl_texture_yuv.h b/src/apps/cam/sdl_texture_yuv.h
>> index db877f503..c271f901b 100644
>> --- a/src/apps/cam/sdl_texture_yuv.h
>> +++ b/src/apps/cam/sdl_texture_yuv.h
>> @@ -17,10 +17,3 @@ public:
>>   	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;
>>   };
>>   #endif
>> -
>> -class SDLTextureYUYV : public SDLTexture
>> -{
>> -public:
>> -	SDLTextureYUYV(const SDL_Rect &rect, unsigned int stride);
>> -	void update(libcamera::Span<const libcamera::Span<const uint8_t>> data) override;
>> -};
> 



More information about the libcamera-devel mailing list