From 63535d9086f15b03563c6a0a0241dc845cc9e52a Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Mon, 10 Sep 2018 13:18:30 -0300 Subject: [PATCH] v4l2: Add JPEG encoding support This commit adds the support for V4L JPEG stateful encoders. --- sys/v4l2/Makefile.am | 2 + sys/v4l2/gstv4l2.c | 5 ++ sys/v4l2/gstv4l2jpegenc.c | 120 ++++++++++++++++++++++++++++++++++++++ sys/v4l2/gstv4l2jpegenc.h | 60 +++++++++++++++++++ sys/v4l2/meson.build | 1 + 5 files changed, 188 insertions(+) create mode 100644 sys/v4l2/gstv4l2jpegenc.c create mode 100644 sys/v4l2/gstv4l2jpegenc.h diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am index d2d8a4ac57..b1c899b2af 100644 --- a/sys/v4l2/Makefile.am +++ b/sys/v4l2/Makefile.am @@ -18,6 +18,7 @@ libgstvideo4linux2_la_SOURCES = gstv4l2.c \ gstv4l2fwhtenc.c \ gstv4l2h263enc.c \ gstv4l2h264enc.c \ + gstv4l2jpegenc.c \ gstv4l2mpeg4enc.c \ gstv4l2vidorient.c \ gstv4l2vp8enc.c \ @@ -65,6 +66,7 @@ noinst_HEADERS = \ gstv4l2fwhtenc.h \ gstv4l2h263enc.h \ gstv4l2h264enc.h \ + gstv4l2jpegenc.h \ gstv4l2mpeg4enc.h \ gstv4l2vidorient.h \ gstv4l2vp8enc.h \ diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c index e1298b3894..ab5699430c 100644 --- a/sys/v4l2/gstv4l2.c +++ b/sys/v4l2/gstv4l2.c @@ -50,6 +50,7 @@ #include "gstv4l2fwhtenc.h" #include "gstv4l2h263enc.h" #include "gstv4l2h264enc.h" +#include "gstv4l2jpegenc.h" #include "gstv4l2mpeg4enc.h" #include "gstv4l2vp8enc.h" #include "gstv4l2vp9enc.h" @@ -202,6 +203,10 @@ gst_v4l2_probe_and_register (GstPlugin * plugin) gst_v4l2_h263_enc_register (plugin, basename, it->device_path, sink_caps, src_caps); + if (gst_v4l2_is_jpeg_enc (sink_caps, src_caps)) + gst_v4l2_jpeg_enc_register (plugin, basename, it->device_path, + sink_caps, src_caps); + if (gst_v4l2_is_vp8_enc (sink_caps, src_caps)) gst_v4l2_vp8_enc_register (plugin, basename, it->device_path, sink_caps, src_caps); diff --git a/sys/v4l2/gstv4l2jpegenc.c b/sys/v4l2/gstv4l2jpegenc.c new file mode 100644 index 0000000000..9c01ffe6d6 --- /dev/null +++ b/sys/v4l2/gstv4l2jpegenc.c @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2018 Collabora Inc. + * Authors: + * Ezequiel Garcia + * Nicolas Dufresne + * + * 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 "gstv4l2jpegenc.h" + +#include +#include + +GST_DEBUG_CATEGORY_STATIC (gst_v4l2_jpeg_enc_debug); +#define GST_CAT_DEFAULT gst_v4l2_jpeg_enc_debug + +static GstStaticCaps src_template_caps = +GST_STATIC_CAPS ("image/jpeg"); + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, + /* TODO */ +}; + +#define gst_v4l2_jpeg_enc_parent_class parent_class +G_DEFINE_TYPE (GstV4l2JPEGEnc, gst_v4l2_jpeg_enc, GST_TYPE_V4L2_VIDEO_ENC); + +static void +gst_v4l2_jpeg_enc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_jpeg_enc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_jpeg_enc_init (GstV4l2JPEGEnc * self) +{ +} + +static void +gst_v4l2_jpeg_enc_class_init (GstV4l2JPEGEncClass * 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_jpeg_enc_debug, "v4l2jpegenc", 0, + "V4L2 JPEG Encoder"); + + gst_element_class_set_static_metadata (element_class, + "V4L2 JPEG Encoder", + "Codec/Encoder/Video", + "Encode JPEG video streams via V4L2 API", + "Ezequiel Garcia set_property = + GST_DEBUG_FUNCPTR (gst_v4l2_jpeg_enc_set_property); + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_v4l2_jpeg_enc_get_property); + + baseclass->codec_name = "JPEG"; +} + +/* Probing functions */ +gboolean +gst_v4l2_is_jpeg_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_jpeg_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_JPEG_ENC, + "jpeg", basename, device_path, sink_caps, + gst_static_caps_get (&src_template_caps), src_caps); +} diff --git a/sys/v4l2/gstv4l2jpegenc.h b/sys/v4l2/gstv4l2jpegenc.h new file mode 100644 index 0000000000..8b6d0b7a64 --- /dev/null +++ b/sys/v4l2/gstv4l2jpegenc.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2017 Collabora Inc. + * Author: Nicolas Dufresne + * + * 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_JPEG_ENC_H__ +#define __GST_V4L2_JPEG_ENC_H__ + +#include +#include "gstv4l2videoenc.h" + +G_BEGIN_DECLS +#define GST_TYPE_V4L2_JPEG_ENC \ + (gst_v4l2_jpeg_enc_get_type()) +#define GST_V4L2_JPEG_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_JPEG_ENC,GstV4l2JPEGEnc)) +#define GST_V4L2_JPEG_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_JPEG_ENC,GstV4l2JPEGEncClass)) +#define GST_IS_V4L2_JPEG_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_JPEG_ENC)) +#define GST_IS_V4L2_JPEG_ENC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_JPEG_ENC)) +typedef struct _GstV4l2JPEGEnc GstV4l2JPEGEnc; +typedef struct _GstV4l2JPEGEncClass GstV4l2JPEGEncClass; + +struct _GstV4l2JPEGEnc +{ + GstV4l2VideoEnc parent; +}; + +struct _GstV4l2JPEGEncClass +{ + GstV4l2VideoEncClass parent_class; +}; + +GType gst_v4l2_jpeg_enc_get_type (void); + +gboolean gst_v4l2_is_jpeg_enc (GstCaps * sink_caps, GstCaps * src_caps); + +void gst_v4l2_jpeg_enc_register (GstPlugin * plugin, const gchar * basename, + const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps); + +G_END_DECLS +#endif /* __GST_V4L2_JPEG_ENC_H__ */ diff --git a/sys/v4l2/meson.build b/sys/v4l2/meson.build index 758e5061b3..71dbd50e49 100644 --- a/sys/v4l2/meson.build +++ b/sys/v4l2/meson.build @@ -15,6 +15,7 @@ v4l2_sources = [ 'gstv4l2fwhtenc.c', 'gstv4l2h263enc.c', 'gstv4l2h264enc.c', + 'gstv4l2jpegenc.c', 'gstv4l2mpeg4enc.c', 'gstv4l2vidorient.c', 'gstv4l2vp8enc.c',