diff options
Diffstat (limited to 'src/cam')
-rw-r--r-- | src/cam/meson.build | 9 | ||||
-rw-r--r-- | src/cam/sdl_sink.cpp | 8 | ||||
-rw-r--r-- | src/cam/sdl_texture_mjpg.cpp | 25 | ||||
-rw-r--r-- | src/cam/sdl_texture_mjpg.h | 17 |
4 files changed, 59 insertions, 0 deletions
diff --git a/src/cam/meson.build b/src/cam/meson.build index c17a971f..5957ce14 100644 --- a/src/cam/meson.build +++ b/src/cam/meson.build @@ -25,6 +25,7 @@ cam_cpp_args = [] libdrm = dependency('libdrm', required : false) libsdl2 = dependency('SDL2', required : false) +libsdl2_image = dependency('SDL2_image', required : false) if libdrm.found() cam_cpp_args += [ '-DHAVE_KMS' ] @@ -41,6 +42,13 @@ if libsdl2.found() 'sdl_texture.cpp', 'sdl_texture_yuyv.cpp' ]) + + if libsdl2_image.found() + cam_cpp_args += ['-DHAVE_SDL_IMAGE'] + cam_sources += files([ + 'sdl_texture_mjpg.cpp' + ]) + endif endif cam = executable('cam', cam_sources, @@ -50,6 +58,7 @@ cam = executable('cam', cam_sources, libdrm, libevent, libsdl2, + libsdl2_image, libyaml, ], cpp_args : cam_cpp_args, diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp index 4c74bce7..f8e3e95d 100644 --- a/src/cam/sdl_sink.cpp +++ b/src/cam/sdl_sink.cpp @@ -21,6 +21,9 @@ #include "event_loop.h" #include "image.h" +#ifdef HAVE_SDL_IMAGE +#include "sdl_texture_mjpg.h" +#endif #include "sdl_texture_yuyv.h" using namespace libcamera; @@ -59,6 +62,11 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config) rect_.h = cfg.size.height; switch (cfg.pixelFormat) { +#ifdef HAVE_SDL_IMAGE + case libcamera::formats::MJPEG: + texture_ = std::make_unique<SDLTextureMJPG>(rect_); + break; +#endif case libcamera::formats::YUYV: texture_ = std::make_unique<SDLTextureYUYV>(rect_); break; diff --git a/src/cam/sdl_texture_mjpg.cpp b/src/cam/sdl_texture_mjpg.cpp new file mode 100644 index 00000000..69e99ad3 --- /dev/null +++ b/src/cam/sdl_texture_mjpg.cpp @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2022, Ideas on Board Oy + * + * sdl_texture_mjpg.cpp - SDL Texture MJPG + */ + +#include "sdl_texture_mjpg.h" + +#include <SDL2/SDL_image.h> + +using namespace libcamera; + +SDLTextureMJPG::SDLTextureMJPG(const SDL_Rect &rect) + : SDLTexture(rect, SDL_PIXELFORMAT_RGB24, 0) +{ +} + +void SDLTextureMJPG::update(const Span<uint8_t> &data) +{ + SDL_RWops *bufferStream = SDL_RWFromMem(data.data(), data.size()); + SDL_Surface *frame = IMG_Load_RW(bufferStream, 0); + SDL_UpdateTexture(ptr_, nullptr, frame->pixels, frame->pitch); + SDL_FreeSurface(frame); +} diff --git a/src/cam/sdl_texture_mjpg.h b/src/cam/sdl_texture_mjpg.h new file mode 100644 index 00000000..b103f801 --- /dev/null +++ b/src/cam/sdl_texture_mjpg.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2022, Ideas on Board Oy + * + * sdl_texture_mjpg.h - SDL Texture MJPG + */ + +#pragma once + +#include "sdl_texture.h" + +class SDLTextureMJPG : public SDLTexture +{ +public: + SDLTextureMJPG(const SDL_Rect &rect); + void update(const libcamera::Span<uint8_t> &data) override; +}; |