From patchwork Wed Dec 21 17:43:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Machek X-Patchwork-Id: 18044 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id EDC1BC3213 for ; Wed, 21 Dec 2022 17:43:26 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4D2ED633AC; Wed, 21 Dec 2022 18:43:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1671644606; bh=GtSgvHXNXWx7fvL1culj1EoC2pDv0WIrQUOVxwSopAU=; h=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=UW/DJFbbFEgwvKdPK+NBP3rv7/oJU8xwblk2v0Svg1UbBAGC7PENLLuur/dtc9qo3 S0vP1nNN0AQ3FL+FvvkUBG9ivVQy7vErENcFGCiWy+oSquQLenodGKxCqziOmF9pmG +bUOvo+7y3xwb3+l2yzy1dKRVQ24O7+X8x6MkUv+D+JKS1Sz1p/yAPTUa/PL4JVAH7 036zswS0S7nghOdyVGNJqGeOGWKmADYiNFaJPTQinnoy+S525Mb7WWFtpeBHBh137O KnrV5G+wpRP0WgjQUlNVTf1A5tQeZj6dLS0iX5ThmEn673o8A8wvVEwb769lxwZurc HFIJFwgffQstw== Received: from jabberwock.ucw.cz (jabberwock.ucw.cz [46.255.230.98]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F26D961F15 for ; Wed, 21 Dec 2022 18:43:24 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ucw.cz header.i=@ucw.cz header.b="ncNQiFbW"; dkim-atps=neutral Received: by jabberwock.ucw.cz (Postfix, from userid 1017) id 71DA91C09F5; Wed, 21 Dec 2022 18:43:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucw.cz; s=gen1; t=1671644604; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=/iix150x8ATjlHoL+Jbt1D1Ee40ifT3DyIUxRz99Mf8=; b=ncNQiFbWBOJujRHkR+g5hKI7fPoXWWTwJyc0DQeLJH4ndyXsd3eJ12VUGdYfUWsCSwq2ku fqd3XFzbNzf/a2uMt5YhE3t//xXgTGfYQZh861Vaz0XX4Vq9VMkTxOmXk/jIpm1AAB0MEX 2+YSpzXBwLhlJUnZwZD0v7i/XC7ECZM= Date: Wed, 21 Dec 2022 18:43:23 +0100 To: Kieran Bingham Message-ID: References: <167162721688.3944359.738999548555516756@Monstersaurus> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <167162721688.3944359.738999548555516756@Monstersaurus> Subject: [libcamera-devel] [PATCH] Add bayer8 support to gstlibcamera X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Pavel Machek via libcamera-devel From: Pavel Machek Reply-To: Pavel Machek Cc: Dorota Czaplejewicz , Pavel Machek via libcamera-devel Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Bayer8 support is useful on hardware such as Librem 5, as gstreamer provides easy solution for debayering and display of the camera data. Add neccessary glue to gstlibcamera. Signed-off-by: Pavel Machek Reviewed-by: Nicolas Dufresne diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp index 36b9564c..b2cc7661 100644 --- a/src/gstreamer/gstlibcamera-utils.cpp +++ b/src/gstreamer/gstlibcamera-utils.cpp @@ -20,6 +20,12 @@ static struct { /* Compressed */ { GST_VIDEO_FORMAT_ENCODED, formats::MJPEG }, + /* Bayer formats, gstreamer only supports 8-bit */ + { GST_VIDEO_FORMAT_ENCODED, formats::SGRBG8 }, + { GST_VIDEO_FORMAT_ENCODED, formats::SGBRG8 }, + { GST_VIDEO_FORMAT_ENCODED, formats::SRGGB8 }, + { GST_VIDEO_FORMAT_ENCODED, formats::SBGGR8 }, + /* RGB16 */ { GST_VIDEO_FORMAT_RGB16, formats::RGB565 }, @@ -228,6 +234,22 @@ gst_format_to_pixel_format(GstVideoFormat gst_format) return PixelFormat{}; } +static const gchar * +bayer_format_to_string(int format) +{ + switch (format) { + case formats::SGRBG8: + return "grbg"; + case formats::SGBRG8: + return "gbrg"; + case formats::SRGGB8: + return "rggb"; + case formats::SBGGR8: + return "bggr"; + } + return NULL; +} + static GstStructure * bare_structure_from_format(const PixelFormat &format) { @@ -243,6 +265,12 @@ bare_structure_from_format(const PixelFormat &format) switch (format) { case formats::MJPEG: return gst_structure_new_empty("image/jpeg"); + case formats::SGRBG8: + case formats::SGBRG8: + case formats::SRGGB8: + case formats::SBGGR8: + return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING, + bayer_format_to_string(format), nullptr); default: return nullptr; } diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index 8d97d7c2..2ceeeb99 100644 --- a/src/gstreamer/gstlibcamerasrc.cpp +++ b/src/gstreamer/gstlibcamerasrc.cpp @@ -161,7 +161,7 @@ G_DEFINE_TYPE_WITH_CODE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT, GST_DEBUG_CATEGORY_INIT(source_debug, "libcamerasrc", 0, "libcamera Source")) -#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; image/jpeg") +#define TEMPLATE_CAPS GST_STATIC_CAPS("video/x-raw; video/x-bayer; image/jpeg") /* For the simple case, we have a src pad that is always present. */ GstStaticPadTemplate src_template = {