diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2017-07-31 16:09:30 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2017-07-31 16:46:25 -0400 |
commit | 2c7dfff047716d57001149e6ae28fbda6dd90c55 (patch) | |
tree | 57a7059d4c8ddf02d4691d31071a2adb96c7e111 /sys | |
parent | 27cdcaf363a117e0994829086cccfc5f47d3e21f (diff) |
v4l2: Add H263 Encoder support
Diffstat (limited to 'sys')
-rw-r--r-- | sys/v4l2/Makefile.am | 2 | ||||
-rw-r--r-- | sys/v4l2/gstv4l2.c | 5 | ||||
-rw-r--r-- | sys/v4l2/gstv4l2h263enc.c | 126 | ||||
-rw-r--r-- | sys/v4l2/gstv4l2h263enc.h | 62 | ||||
-rw-r--r-- | sys/v4l2/meson.build | 1 |
5 files changed, 196 insertions, 0 deletions
diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am index 492561d06..be5c12515 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 \ + gstv4l2h263enc.c \ gstv4l2h264enc.c \ gstv4l2mpeg4enc.c \ gstv4l2vidorient.c \ @@ -58,6 +59,7 @@ noinst_HEADERS = \ gstv4l2transform.h \ gstv4l2videodec.h \ gstv4l2videoenc.h \ + gstv4l2h263enc.h \ gstv4l2h264enc.h \ gstv4l2mpeg4enc.h \ gstv4l2vidorient.h \ diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c index dd0ad22e8..f7144507a 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 "gstv4l2h263enc.h" #include "gstv4l2h264enc.h" #include "gstv4l2mpeg4enc.h" #include "gstv4l2deviceprovider.h" @@ -194,6 +195,10 @@ gst_v4l2_probe_and_register (GstPlugin * plugin) if (gst_v4l2_is_mpeg4_enc (sink_caps, src_caps)) gst_v4l2_mpeg4_enc_register (plugin, basename, it->device_path, sink_caps, src_caps); + + if (gst_v4l2_is_h263_enc (sink_caps, src_caps)) + gst_v4l2_h263_enc_register (plugin, basename, it->device_path, + sink_caps, src_caps); } else if (gst_v4l2_is_transform (sink_caps, src_caps)) { gst_v4l2_transform_register (plugin, basename, it->device_path, sink_caps, src_caps); diff --git a/sys/v4l2/gstv4l2h263enc.c b/sys/v4l2/gstv4l2h263enc.c new file mode 100644 index 000000000..95f35c969 --- /dev/null +++ b/sys/v4l2/gstv4l2h263enc.c @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2017 Collabora Inc. + * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com> + * + * 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 <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <string.h> + +#include "gstv4l2object.h" +#include "gstv4l2h263enc.h" + +#include <string.h> +#include <gst/gst-i18n-plugin.h> + +GST_DEBUG_CATEGORY_STATIC (gst_v4l2_h263_enc_debug); +#define GST_CAT_DEFAULT gst_v4l2_h263_enc_debug + + +static GstStaticCaps src_template_caps = +GST_STATIC_CAPS ("video/x-h263, variant=(string) itu"); + +enum +{ + PROP_0, + V4L2_STD_OBJECT_PROPS, +/* TODO add H263 controls */ +}; + +#define gst_v4l2_h263_enc_parent_class parent_class +G_DEFINE_TYPE (GstV4l2H263Enc, gst_v4l2_h263_enc, GST_TYPE_V4L2_VIDEO_ENC); + +static void +gst_v4l2_h263_enc_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_h263_enc_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + /* TODO */ +} + +static void +gst_v4l2_h263_enc_init (GstV4l2H263Enc * self) +{ + +} + +static void +gst_v4l2_h263_enc_class_init (GstV4l2H263EncClass * klass) +{ + GstElementClass *element_class; + GObjectClass *gobject_class; + + parent_class = g_type_class_peek_parent (klass); + + element_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; + + GST_DEBUG_CATEGORY_INIT (gst_v4l2_h263_enc_debug, "v4l2h263enc", 0, + "V4L2 H.263 Encoder"); + + gst_element_class_set_static_metadata (element_class, + "V4L2 H.263 Encoder", + "Codec/Encoder/Video", + "Encode H.263 video streams via V4L2 API", + "Nicolas Dufresne <nicolas.dufresne@collabora.com>"); + + gobject_class->set_property = + GST_DEBUG_FUNCPTR (gst_v4l2_h263_enc_set_property); + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_v4l2_h263_enc_get_property); +} + +/* Probing functions */ +gboolean +gst_v4l2_is_h263_enc (GstCaps * sink_caps, GstCaps * src_caps) +{ + gboolean ret = FALSE; + GstCaps *codec_caps; + + codec_caps = gst_static_caps_get (&src_template_caps); + + if (gst_caps_is_subset (sink_caps, gst_v4l2_object_get_raw_caps ()) + && gst_caps_can_intersect (src_caps, codec_caps)) + ret = TRUE; + + gst_caps_unref (codec_caps); + + return ret; +} + +void +gst_v4l2_h263_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_H263_ENC, + "h263", basename, device_path, sink_caps, + gst_static_caps_get (&src_template_caps), src_caps); +} diff --git a/sys/v4l2/gstv4l2h263enc.h b/sys/v4l2/gstv4l2h263enc.h new file mode 100644 index 000000000..ff51bfd1f --- /dev/null +++ b/sys/v4l2/gstv4l2h263enc.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2017 Collabora Inc. + * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com> + * + * 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_H263_ENC_H__ +#define __GST_V4L2_H263_ENC_H__ + +#include <gst/gst.h> +#include "gstv4l2videoenc.h" + +GST_DEBUG_CATEGORY_EXTERN (v4l2h263enc_debug); + +G_BEGIN_DECLS +#define GST_TYPE_V4L2_H263_ENC \ + (gst_v4l2_h263_enc_get_type()) +#define GST_V4L2_H263_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_H263_ENC,GstV4l2H263Enc)) +#define GST_V4L2_H263_ENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_H263_ENC,GstV4l2H263EncClass)) +#define GST_IS_V4L2_H263_ENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_H263_ENC)) +#define GST_IS_V4L2_H263_ENC_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_H263_ENC)) +typedef struct _GstV4l2H263Enc GstV4l2H263Enc; +typedef struct _GstV4l2H263EncClass GstV4l2H263EncClass; + +struct _GstV4l2H263Enc +{ + GstV4l2VideoEnc parent; +}; + +struct _GstV4l2H263EncClass +{ + GstV4l2VideoEncClass parent_class; +}; + +GType gst_v4l2_h263_enc_get_type (void); + +gboolean gst_v4l2_is_h263_enc (GstCaps * sink_caps, GstCaps * src_caps); + +void gst_v4l2_h263_enc_register (GstPlugin * plugin, const gchar * basename, + const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps); + +G_END_DECLS +#endif /* __GST_V4L2_H263_ENC_H__ */ diff --git a/sys/v4l2/meson.build b/sys/v4l2/meson.build index f34390275..a49f8c8a3 100644 --- a/sys/v4l2/meson.build +++ b/sys/v4l2/meson.build @@ -12,6 +12,7 @@ v4l2_sources = [ 'gstv4l2transform.c', 'gstv4l2videodec.c', 'gstv4l2videoenc.c', + 'gstv4l2h263enc.c', 'gstv4l2h264enc.c', 'gstv4l2mpeg4enc.c', 'gstv4l2vidorient.c', |