[libcamera-devel] JPEG support for libcamera

Pavel Machek pavel at ucw.cz
Mon Jul 4 20:07:20 CEST 2022


JPEG is very similar to MJPEG format (AFAICT, it may contain extra
EXIF headers). Add support for it. Tested with PinePhone and command
line cam utility.

Signed-off-by: Pavel Machek <pavel at ucw.cz>

diff --git a/include/linux/drm_fourcc.h b/include/linux/drm_fourcc.h
index ea11dcb4..b30a705d 100644
--- a/include/linux/drm_fourcc.h
+++ b/include/linux/drm_fourcc.h
@@ -352,6 +352,7 @@ extern "C" {
 
 /* Compressed formats */
 #define DRM_FORMAT_MJPEG	fourcc_code('M', 'J', 'P', 'G') /* Motion-JPEG */
+#define DRM_FORMAT_JPEG	fourcc_code('J', 'P', 'E', 'G') /* JFIF JPEG */
 
 /*
  * Bayer formats
diff --git a/src/cam/sdl_sink.cpp b/src/cam/sdl_sink.cpp
index f8e3e95d..673bd642 100644
--- a/src/cam/sdl_sink.cpp
+++ b/src/cam/sdl_sink.cpp
@@ -63,6 +63,7 @@ int SDLSink::configure(const libcamera::CameraConfiguration &config)
 
 	switch (cfg.pixelFormat) {
 #ifdef HAVE_SDL_IMAGE
+	case libcamera::formats::JPEG:
 	case libcamera::formats::MJPEG:
 		texture_ = std::make_unique<SDLTextureMJPG>(rect_);
 		break;
diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
index 3f242286..fd5689d9 100644
--- a/src/gstreamer/gstlibcamera-utils.cpp
+++ b/src/gstreamer/gstlibcamera-utils.cpp
@@ -80,6 +80,7 @@ bare_structure_from_format(const PixelFormat &format)
 					 gst_video_format_to_string(gst_format), nullptr);
 
 	switch (format) {
+	case formats::JPEG:
 	case formats::MJPEG:
 		return gst_structure_new_empty("image/jpeg");
 	default:
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index 283ecb3d..c5e97198 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -944,6 +944,19 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	} },
 
 	/* Compressed formats. */
+	{ formats::JPEG, {
+		.name = "JPEG",
+		.format = formats::JPEG,
+		.v4l2Formats = {
+			.single = V4L2PixelFormat(V4L2_PIX_FMT_JPEG),
+			.multi = V4L2PixelFormat(),
+		},
+		.bitsPerPixel = 0,
+		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+		.packed = false,
+		.pixelsPerGroup = 1,
+		.planes = {{ { 1, 1 }, { 0, 0 }, { 0, 0 } }},
+	} },
 	{ formats::MJPEG, {
 		.name = "MJPEG",
 		.format = formats::MJPEG,
diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml
index 7dda0132..6b931c34 100644
--- a/src/libcamera/formats.yaml
+++ b/src/libcamera/formats.yaml
@@ -76,6 +76,8 @@ formats:
   - YVU444:
       fourcc: DRM_FORMAT_YVU444
 
+  - JPEG:
+      fourcc: DRM_FORMAT_JPEG
   - MJPEG:
       fourcc: DRM_FORMAT_MJPEG
 
diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
index 58fc4e9d..82dfbd1e 100644
--- a/src/libcamera/v4l2_pixelformat.cpp
+++ b/src/libcamera/v4l2_pixelformat.cpp
@@ -183,6 +183,8 @@ const std::map<V4L2PixelFormat, V4L2PixelFormat::Info> vpf2pf{
 	/* Compressed formats. */
 	{ V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
 		{ formats::MJPEG, "Motion-JPEG" } },
+	{ V4L2PixelFormat(V4L2_PIX_FMT_JPEG),
+		{ formats::JPEG, "JPEG" } },
 };
 
 } /* namespace */

-- 
People of Russia, stop Putin before his war on Ukraine escalates.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20220704/439fc2a0/attachment.sig>


More information about the libcamera-devel mailing list