diff options
author | Scott D Phillips <scott.d.phillips@intel.com> | 2016-10-05 15:32:43 -0700 |
---|---|---|
committer | Josep Torra <n770galaxy@gmail.com> | 2016-12-13 00:06:42 +0100 |
commit | 1a4db8846f333bc5263251c394d4e26b05ac55fa (patch) | |
tree | 48400708c80462b732239860f379e1a73bee243d /sys | |
parent | 1f6903bf3e607aabdaab6d3141c6174516cd314b (diff) | |
download | gstreamer-plugins-bad-1a4db8846f333bc5263251c394d4e26b05ac55fa.tar.gz |
msdk: add mjpeg encoder
https://bugzilla.gnome.org/show_bug.cgi?id=774793
Diffstat (limited to 'sys')
-rw-r--r-- | sys/msdk/Makefile.am | 2 | ||||
-rw-r--r-- | sys/msdk/gstmsdk.c | 7 | ||||
-rw-r--r-- | sys/msdk/gstmsdkmjpegenc.c | 163 | ||||
-rw-r--r-- | sys/msdk/gstmsdkmjpegenc.h | 68 | ||||
-rw-r--r-- | sys/msdk/meson.build | 1 |
5 files changed, 241 insertions, 0 deletions
diff --git a/sys/msdk/Makefile.am b/sys/msdk/Makefile.am index 32d786a08..bdc111719 100644 --- a/sys/msdk/Makefile.am +++ b/sys/msdk/Makefile.am @@ -5,6 +5,7 @@ libgstmsdk_la_SOURCES = \ gstmsdkh264enc.c \ gstmsdkh265dec.c \ gstmsdkh265enc.c \ + gstmsdkmjpegenc.c \ gstmsdkmpeg2enc.c \ gstmsdkvp8enc.c \ gstmsdkdec.c \ @@ -20,6 +21,7 @@ noinst_HEADERS = \ gstmsdkh264enc.h \ gstmsdkh265dec.h \ gstmsdkh265enc.h \ + gstmsdkmjpegenc.h \ gstmsdkmpeg2enc.h \ gstmsdkvp8enc.h \ gstmsdkdec.h \ diff --git a/sys/msdk/gstmsdk.c b/sys/msdk/gstmsdk.c index f5a7525fd..93b1af438 100644 --- a/sys/msdk/gstmsdk.c +++ b/sys/msdk/gstmsdk.c @@ -39,6 +39,7 @@ #include "gstmsdkh264enc.h" #include "gstmsdkh265dec.h" #include "gstmsdkh265enc.h" +#include "gstmsdkmjpegenc.h" #include "gstmsdkmpeg2enc.h" #include "gstmsdkvp8enc.h" @@ -48,6 +49,7 @@ GST_DEBUG_CATEGORY (gst_msdkh264dec_debug); GST_DEBUG_CATEGORY (gst_msdkh264enc_debug); GST_DEBUG_CATEGORY (gst_msdkh265dec_debug); GST_DEBUG_CATEGORY (gst_msdkh265enc_debug); +GST_DEBUG_CATEGORY (gst_msdkmjpegenc_debug); GST_DEBUG_CATEGORY (gst_msdkmpeg2enc_debug); GST_DEBUG_CATEGORY (gst_msdkvp8enc_debug); @@ -66,6 +68,8 @@ plugin_init (GstPlugin * plugin) "msdkh265dec"); GST_DEBUG_CATEGORY_INIT (gst_msdkh265enc_debug, "msdkh265enc", 0, "msdkh265enc"); + GST_DEBUG_CATEGORY_INIT (gst_msdkmjpegenc_debug, "msdkmjpegenc", 0, + "msdkmjpegenc"); GST_DEBUG_CATEGORY_INIT (gst_msdkmpeg2enc_debug, "msdkmpeg2enc", 0, "msdkmpeg2enc"); GST_DEBUG_CATEGORY_INIT (gst_msdkvp8enc_debug, "msdkvp8enc", 0, "msdkvp8enc"); @@ -86,6 +90,9 @@ plugin_init (GstPlugin * plugin) ret = gst_element_register (plugin, "msdkh265enc", GST_RANK_NONE, GST_TYPE_MSDKH265ENC); + ret = gst_element_register (plugin, "msdkmjpegenc", GST_RANK_NONE, + GST_TYPE_MSDKMJPEGENC); + ret = gst_element_register (plugin, "msdkmpeg2enc", GST_RANK_NONE, GST_TYPE_MSDKMPEG2ENC); diff --git a/sys/msdk/gstmsdkmjpegenc.c b/sys/msdk/gstmsdkmjpegenc.c new file mode 100644 index 000000000..ebee0e506 --- /dev/null +++ b/sys/msdk/gstmsdkmjpegenc.c @@ -0,0 +1,163 @@ +/* GStreamer Intel MSDK plugin + * Copyright (c) 2016, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#include <mfxstructures.h> +#include <mfxjpeg.h> + +#include "gstmsdkmjpegenc.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_msdkmjpegenc_debug); +#define GST_CAT_DEFAULT gst_msdkmjpegenc_debug + +enum +{ + PROP_0, + PROP_QUALITY +}; + +#define DEFAULT_QUALITY 85 + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("image/jpeg, " + "framerate = (fraction) [0/1, MAX], " + "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ]") + ); + +#define gst_msdkmjpegenc_parent_class parent_class +G_DEFINE_TYPE (GstMsdkMJPEGEnc, gst_msdkmjpegenc, GST_TYPE_MSDKENC); + +static gboolean +gst_msdkmjpegenc_set_format (GstMsdkEnc * encoder) +{ + return TRUE; +} + +static gboolean +gst_msdkmjpegenc_configure (GstMsdkEnc * encoder) +{ + GstMsdkMJPEGEnc *mjpegenc = GST_MSDKMJPEGENC (encoder); + + encoder->param.mfx.CodecId = MFX_CODEC_JPEG; + encoder->param.mfx.Quality = mjpegenc->quality; + encoder->param.mfx.Interleaved = 1; + encoder->param.mfx.RestartInterval = 0; + encoder->param.mfx.BufferSizeInKB = 3072; + + return TRUE; +} + +static GstCaps * +gst_msdkmjpegenc_set_src_caps (GstMsdkEnc * encoder) +{ + GstCaps *caps; + + caps = gst_caps_from_string ("image/jpeg"); + + return caps; +} + +static void +gst_msdkmjpegenc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMsdkMJPEGEnc *thiz = GST_MSDKMJPEGENC (object); + + GST_OBJECT_LOCK (thiz); + switch (prop_id) { + case PROP_QUALITY: + g_value_set_uint (value, thiz->quality); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); +} + +static void +gst_msdkmjpegenc_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMsdkMJPEGEnc *thiz = GST_MSDKMJPEGENC (object); + + GST_OBJECT_LOCK (thiz); + switch (prop_id) { + case PROP_QUALITY: + thiz->quality = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (thiz); +} + +static void +gst_msdkmjpegenc_class_init (GstMsdkMJPEGEncClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstMsdkEncClass *encoder_class; + + gobject_class = G_OBJECT_CLASS (klass); + element_class = GST_ELEMENT_CLASS (klass); + encoder_class = GST_MSDKENC_CLASS (klass); + + encoder_class->set_format = gst_msdkmjpegenc_set_format; + encoder_class->configure = gst_msdkmjpegenc_configure; + encoder_class->set_src_caps = gst_msdkmjpegenc_set_src_caps; + + gobject_class->get_property = gst_msdkmjpegenc_get_property; + gobject_class->set_property = gst_msdkmjpegenc_set_property; + + g_object_class_install_property (gobject_class, PROP_QUALITY, + g_param_spec_uint ("quality", "Quality", "Quality of encoding", + 0, 100, DEFAULT_QUALITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gst_element_class_set_static_metadata (element_class, + "Intel MSDK MJPEG encoder", + "Codec/Encoder/Video", + "MJPEG video encoder based on Intel Media SDK", + "Scott D Phillips <scott.d.phillips@intel.com>"); + + gst_element_class_add_static_pad_template (element_class, &src_factory); +} + +static void +gst_msdkmjpegenc_init (GstMsdkMJPEGEnc * thiz) +{ + thiz->quality = DEFAULT_QUALITY; +} diff --git a/sys/msdk/gstmsdkmjpegenc.h b/sys/msdk/gstmsdkmjpegenc.h new file mode 100644 index 000000000..f8cd56e54 --- /dev/null +++ b/sys/msdk/gstmsdkmjpegenc.h @@ -0,0 +1,68 @@ +/* GStreamer Intel MSDK plugin + * Copyright (c) 2016, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GST_MSDKMJPEGENC_H__ +#define __GST_MSDKMJPEGENC_H__ + +#include "gstmsdkenc.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MSDKMJPEGENC \ + (gst_msdkmjpegenc_get_type()) +#define GST_MSDKMJPEGENC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKMJPEGENC,GstMsdkMJPEGEnc)) +#define GST_MSDKMJPEGENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKMJPEGENC,GstMsdkMJPEGEncClass)) +#define GST_IS_MSDKMJPEGENC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKMJPEGENC)) +#define GST_IS_MSDKMJPEGENC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKMJPEGENC)) + +typedef struct _GstMsdkMJPEGEnc GstMsdkMJPEGEnc; +typedef struct _GstMsdkMJPEGEncClass GstMsdkMJPEGEncClass; + +struct _GstMsdkMJPEGEnc +{ + GstMsdkEnc base; + guint quality; +}; + +struct _GstMsdkMJPEGEncClass +{ + GstMsdkEncClass parent_class; +}; + +GType gst_msdkmjpegenc_get_type (void); + +G_END_DECLS + +#endif /* __GST_MSDKMJPEGENC_H__ */ diff --git a/sys/msdk/meson.build b/sys/msdk/meson.build index eaada6cbc..0afc48475 100644 --- a/sys/msdk/meson.build +++ b/sys/msdk/meson.build @@ -6,6 +6,7 @@ msdk_sources = [ 'gstmsdkh264enc.c', 'gstmsdkh265dec.c', 'gstmsdkh265enc.c', + 'gstmsdkmjpegenc.c', 'gstmsdkmpeg2enc.c', 'gstmsdkvp8enc.c', 'msdk.c', |