From 944debd3db3dcec96d5ec37719fadc6f53254eba Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Mon, 10 Sep 2018 16:20:52 -0300 Subject: [PATCH] v4l2: Add FWHT codec support The recently added vicodec (virtual codec) V4L driver uses the Fast Walsh-Hadamard Transform for encoding and decoding. Add support for it. --- sys/v4l2/Makefile.am | 2 + sys/v4l2/gstv4l2.c | 5 ++ sys/v4l2/gstv4l2fwhtenc.c | 119 +++++++++++++++++++++++++++++++++++++ sys/v4l2/gstv4l2fwhtenc.h | 62 +++++++++++++++++++ sys/v4l2/gstv4l2object.c | 6 ++ sys/v4l2/gstv4l2videodec.c | 2 + sys/v4l2/meson.build | 1 + 7 files changed, 197 insertions(+) create mode 100644 sys/v4l2/gstv4l2fwhtenc.c create mode 100644 sys/v4l2/gstv4l2fwhtenc.h diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am index 3126c11efe..d2d8a4ac57 100644 --- a/sys/v4l2/Makefile.am +++ b/sys/v4l2/Makefile.am @@ -15,6 +15,7 @@ libgstvideo4linux2_la_SOURCES = gstv4l2.c \ gstv4l2transform.c \ gstv4l2videodec.c \ gstv4l2videoenc.c \ + gstv4l2fwhtenc.c \ gstv4l2h263enc.c \ gstv4l2h264enc.c \ gstv4l2mpeg4enc.c \ @@ -61,6 +62,7 @@ noinst_HEADERS = \ gstv4l2transform.h \ gstv4l2videodec.h \ gstv4l2videoenc.h \ + gstv4l2fwhtenc.h \ gstv4l2h263enc.h \ gstv4l2h264enc.h \ gstv4l2mpeg4enc.h \ diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c index 2674d9cd34..e1298b3894 100644 --- a/sys/v4l2/gstv4l2.c +++ b/sys/v4l2/gstv4l2.c @@ -47,6 +47,7 @@ #include "gstv4l2sink.h" #include "gstv4l2radio.h" #include "gstv4l2videodec.h" +#include "gstv4l2fwhtenc.h" #include "gstv4l2h263enc.h" #include "gstv4l2h264enc.h" #include "gstv4l2mpeg4enc.h" @@ -185,6 +186,10 @@ gst_v4l2_probe_and_register (GstPlugin * plugin) gst_v4l2_video_dec_register (plugin, basename, it->device_path, sink_caps, src_caps); } else if (gst_v4l2_is_video_enc (sink_caps, src_caps, NULL)) { + if (gst_v4l2_is_fwht_enc (sink_caps, src_caps)) + gst_v4l2_fwht_enc_register (plugin, basename, it->device_path, + sink_caps, src_caps); + if (gst_v4l2_is_h264_enc (sink_caps, src_caps)) gst_v4l2_h264_enc_register (plugin, basename, it->device_path, sink_caps, src_caps); diff --git a/sys/v4l2/gstv4l2fwhtenc.c b/sys/v4l2/gstv4l2fwhtenc.c new file mode 100644 index 0000000000..1d5dff9cf3 --- /dev/null +++ b/sys/v4l2/gstv4l2fwhtenc.c @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2018 Collabora Inc. + * Authors: + * Nicolas Dufresne + * Ezequiel Garcia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#include "gstv4l2object.h" +#include "gstv4l2fwhtenc.h" + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (gst_v4l2_fwht_enc_debug); +#define GST_CAT_DEFAULT gst_v4l2_fwht_enc_debug + +static GstStaticCaps src_template_caps = GST_STATIC_CAPS ("video/x-fwht"); + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, + /* TODO */ +}; + +#define gst_v4l2_fwht_enc_parent_class parent_class +G_DEFINE_TYPE (GstV4l2FWHTEnc, gst_v4l2_fwht_enc, GST_TYPE_V4L2_VIDEO_ENC); + +static void +gst_v4l2_fwht_enc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_fwht_enc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_fwht_enc_init (GstV4l2FWHTEnc * self) +{ +} + +static void +gst_v4l2_fwht_enc_class_init (GstV4l2FWHTEncClass * klass) +{ + GstElementClass *element_class; + GObjectClass *gobject_class; + GstV4l2VideoEncClass *baseclass; + + parent_class = g_type_class_peek_parent (klass); + + element_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + baseclass = (GstV4l2VideoEncClass *) (klass); + + GST_DEBUG_CATEGORY_INIT (gst_v4l2_fwht_enc_debug, "v4l2fwhtenc", 0, + "V4L2 FWHT Encoder"); + + gst_element_class_set_static_metadata (element_class, + "V4L2 FWHT Encoder", + "Codec/Encoder/Video", + "Encode FWHT video streams via V4L2 API", + "Ezequiel Garcia set_property = + GST_DEBUG_FUNCPTR (gst_v4l2_fwht_enc_set_property); + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_v4l2_fwht_enc_get_property); + + baseclass->codec_name = "FWHT"; +} + +/* Probing functions */ +gboolean +gst_v4l2_is_fwht_enc (GstCaps * sink_caps, GstCaps * src_caps) +{ + return gst_v4l2_is_video_enc (sink_caps, src_caps, + gst_static_caps_get (&src_template_caps)); +} + +void +gst_v4l2_fwht_enc_register (GstPlugin * plugin, const gchar * basename, + const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps) +{ + gst_v4l2_video_enc_register (plugin, GST_TYPE_V4L2_FWHT_ENC, + "fwht", basename, device_path, sink_caps, + gst_static_caps_get (&src_template_caps), src_caps); +} diff --git a/sys/v4l2/gstv4l2fwhtenc.h b/sys/v4l2/gstv4l2fwhtenc.h new file mode 100644 index 0000000000..c4e42c55c6 --- /dev/null +++ b/sys/v4l2/gstv4l2fwhtenc.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2018 Collabora Inc. + * Authors: + * Nicolas Dufresne + * Ezequiel Garcia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __GST_V4L2_FWHT_ENC_H__ +#define __GST_V4L2_FWHT_ENC_H__ + +#include +#include "gstv4l2videoenc.h" + +G_BEGIN_DECLS +#define GST_TYPE_V4L2_FWHT_ENC \ + (gst_v4l2_fwht_enc_get_type()) +#define GST_V4L2_FWHT_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_FWHT_ENC,GstV4l2FWHTEnc)) +#define GST_V4L2_FWHT_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_FWHT_ENC,GstV4l2FWHTEncClass)) +#define GST_IS_V4L2_FWHT_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_FWHT_ENC)) +#define GST_IS_V4L2_FWHT_ENC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_FWHT_ENC)) +typedef struct _GstV4l2FWHTEnc GstV4l2FWHTEnc; +typedef struct _GstV4l2FWHTEncClass GstV4l2FWHTEncClass; + +struct _GstV4l2FWHTEnc +{ + GstV4l2VideoEnc parent; +}; + +struct _GstV4l2FWHTEncClass +{ + GstV4l2VideoEncClass parent_class; +}; + +GType gst_v4l2_fwht_enc_get_type (void); + +gboolean gst_v4l2_is_fwht_enc (GstCaps * sink_caps, GstCaps * src_caps); + +void gst_v4l2_fwht_enc_register (GstPlugin * plugin, const gchar * basename, + const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps); + +G_END_DECLS +#endif /* __GST_V4L2_FWHT_ENC_H__ */ diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 3db86fafc1..062bbb85e4 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -169,6 +169,7 @@ static const GstV4L2FormatDesc gst_v4l2_formats[] = { {V4L2_PIX_FMT_PJPG, FALSE, GST_V4L2_CODEC}, {V4L2_PIX_FMT_DV, FALSE, GST_V4L2_TRANSPORT}, {V4L2_PIX_FMT_MPEG, FALSE, GST_V4L2_TRANSPORT}, + {V4L2_PIX_FMT_FWHT, FALSE, GST_V4L2_CODEC}, {V4L2_PIX_FMT_H264, FALSE, GST_V4L2_CODEC}, {V4L2_PIX_FMT_H264_NO_SC, FALSE, GST_V4L2_CODEC}, {V4L2_PIX_FMT_H264_MVC, FALSE, GST_V4L2_CODEC}, @@ -1420,6 +1421,9 @@ gst_v4l2_object_v4l2fourcc_to_bare_struct (guint32 fourcc) "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); break; + case V4L2_PIX_FMT_FWHT: + structure = gst_structure_new_empty ("video/x-fwht"); + break; case V4L2_PIX_FMT_H263: structure = gst_structure_new ("video/x-h263", "variant", G_TYPE_STRING, "itu", NULL); @@ -1801,6 +1805,8 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps, break; } } + } else if (g_str_equal (mimetype, "video/x-fwht")) { + fourcc = V4L2_PIX_FMT_FWHT; } else if (g_str_equal (mimetype, "video/x-h263")) { fourcc = V4L2_PIX_FMT_H263; } else if (g_str_equal (mimetype, "video/x-h264")) { diff --git a/sys/v4l2/gstv4l2videodec.c b/sys/v4l2/gstv4l2videodec.c index 838ebff24c..e2b22373b3 100644 --- a/sys/v4l2/gstv4l2videodec.c +++ b/sys/v4l2/gstv4l2videodec.c @@ -1081,6 +1081,8 @@ G_STMT_START { \ } } else if (gst_structure_has_name (s, "video/x-h263")) { SET_META ("H263"); + } else if (gst_structure_has_name (s, "video/x-fwht")) { + SET_META ("FWHT"); } else if (gst_structure_has_name (s, "video/x-h264")) { SET_META ("H264"); } else if (gst_structure_has_name (s, "video/x-wmv")) { diff --git a/sys/v4l2/meson.build b/sys/v4l2/meson.build index c430ec5280..758e5061b3 100644 --- a/sys/v4l2/meson.build +++ b/sys/v4l2/meson.build @@ -12,6 +12,7 @@ v4l2_sources = [ 'gstv4l2transform.c', 'gstv4l2videodec.c', 'gstv4l2videoenc.c', + 'gstv4l2fwhtenc.c', 'gstv4l2h263enc.c', 'gstv4l2h264enc.c', 'gstv4l2mpeg4enc.c',