diff --git a/sys/msdk/Makefile.am b/sys/msdk/Makefile.am index 55083fda8c..083d6a0535 100644 --- a/sys/msdk/Makefile.am +++ b/sys/msdk/Makefile.am @@ -17,6 +17,7 @@ libgstmsdk_la_SOURCES = \ gstmsdkvp8dec.c \ gstmsdkvp8enc.c \ gstmsdkvc1dec.c \ + gstmsdkvp9dec.c \ gstmsdkdec.c \ gstmsdkenc.c \ gstmsdkvpp.c \ @@ -47,6 +48,7 @@ noinst_HEADERS = \ gstmsdkvp8dec.h \ gstmsdkvp8enc.h \ gstmsdkvc1dec.h \ + gstmsdkvp9dec.h \ gstmsdkdec.h \ gstmsdkenc.h \ gstmsdkvpp.h \ diff --git a/sys/msdk/gstmsdk.c b/sys/msdk/gstmsdk.c index 9349980652..79b1ae2325 100644 --- a/sys/msdk/gstmsdk.c +++ b/sys/msdk/gstmsdk.c @@ -1,5 +1,6 @@ /* GStreamer Intel MSDK plugin * Copyright (c) 2016, Oblong Industries, Inc. + * Copyright (c) 2018, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,6 +47,7 @@ #include "gstmsdkvp8dec.h" #include "gstmsdkvp8enc.h" #include "gstmsdkvc1dec.h" +#include "gstmsdkvp9dec.h" #include "gstmsdkvpp.h" GST_DEBUG_CATEGORY (gst_msdk_debug); @@ -63,6 +65,7 @@ GST_DEBUG_CATEGORY (gst_msdkmpeg2dec_debug); GST_DEBUG_CATEGORY (gst_msdkvp8dec_debug); GST_DEBUG_CATEGORY (gst_msdkvp8enc_debug); GST_DEBUG_CATEGORY (gst_msdkvc1dec_debug); +GST_DEBUG_CATEGORY (gst_msdkvp9dec_debug); static gboolean plugin_init (GstPlugin * plugin) @@ -92,6 +95,7 @@ plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (gst_msdkvp8dec_debug, "msdkvp8dec", 0, "msdkvp8dec"); GST_DEBUG_CATEGORY_INIT (gst_msdkvp8enc_debug, "msdkvp8enc", 0, "msdkvp8enc"); GST_DEBUG_CATEGORY_INIT (gst_msdkvc1dec_debug, "msdkvc1dec", 0, "msdkvc1dec"); + GST_DEBUG_CATEGORY_INIT (gst_msdkvp8dec_debug, "msdkvp9dec", 0, "msdkvp8dec"); if (!msdk_is_available ()) return FALSE; @@ -129,6 +133,9 @@ plugin_init (GstPlugin * plugin) ret = gst_element_register (plugin, "msdkvc1dec", GST_RANK_NONE, GST_TYPE_MSDKVC1DEC); + ret = gst_element_register (plugin, "msdkvp9dec", GST_RANK_NONE, + GST_TYPE_MSDKVP9DEC); + ret = gst_element_register (plugin, "msdkvpp", GST_RANK_NONE, GST_TYPE_MSDKVPP); diff --git a/sys/msdk/gstmsdkvp9dec.c b/sys/msdk/gstmsdkvp9dec.c new file mode 100644 index 0000000000..436b1c4938 --- /dev/null +++ b/sys/msdk/gstmsdkvp9dec.c @@ -0,0 +1,115 @@ +/* GStreamer Intel MSDK plugin + * Copyright (c) 2018, Intel Corporation + * All rights reserved. + * + * Author: Sreerenj Balachandran + * + * 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 NEGLIGDECE + * 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 +#endif + +#ifdef HAVE_LIBMFX +# include +# include +#else +# include "mfxplugin.h" +# include "mfxvp9.h" +#endif + +#include "gstmsdkvp9dec.h" + +GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp9dec_debug); +#define GST_CAT_DEFAULT gst_msdkvp9dec_debug + +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-vp9") + ); + +#define gst_msdkvp9dec_parent_class parent_class +G_DEFINE_TYPE (GstMsdkVP9Dec, gst_msdkvp9dec, GST_TYPE_MSDKDEC); + +static gboolean +gst_msdkvp9dec_configure (GstMsdkDec * decoder) +{ + GstMsdkVP9Dec *vp9dec = GST_MSDKVP9DEC (decoder); + mfxSession session; + mfxStatus status; + const mfxPluginUID *uid; + + session = gst_msdk_context_get_session (decoder->context); + + uid = &MFX_PLUGINID_VP9D_HW; + + status = MFXVideoUSER_Load (session, uid, 1); + if (status < MFX_ERR_NONE) { + GST_ERROR_OBJECT (vp9dec, "Media SDK Plugin load failed (%s)", + msdk_status_to_string (status)); + return FALSE; + } else if (status > MFX_ERR_NONE) { + GST_WARNING_OBJECT (vp9dec, "Media SDK Plugin load warning: %s", + msdk_status_to_string (status)); + } + + decoder->param.mfx.CodecId = MFX_CODEC_VP9; + /* Replaced with width and height rounded up to 16 */ + decoder->param.mfx.FrameInfo.Width = + GST_ROUND_UP_16 (decoder->param.mfx.FrameInfo.CropW); + decoder->param.mfx.FrameInfo.Height = + GST_ROUND_UP_16 (decoder->param.mfx.FrameInfo.CropH); + + return TRUE; +} + +static void +gst_msdkvp9dec_class_init (GstMsdkVP9DecClass * klass) +{ + GstElementClass *element_class; + GstMsdkDecClass *decoder_class; + + element_class = GST_ELEMENT_CLASS (klass); + decoder_class = GST_MSDKDEC_CLASS (klass); + + decoder_class->configure = GST_DEBUG_FUNCPTR (gst_msdkvp9dec_configure); + + gst_element_class_set_static_metadata (element_class, + "Intel MSDK VP9 decoder", + "Codec/Decoder/Video", + "VP9 video decoder based on Intel Media SDK", + "Sreerenj Balachandran "); + + gst_element_class_add_static_pad_template (element_class, &sink_factory); +} + +static void +gst_msdkvp9dec_init (GstMsdkVP9Dec * thiz) +{ +} diff --git a/sys/msdk/gstmsdkvp9dec.h b/sys/msdk/gstmsdkvp9dec.h new file mode 100644 index 0000000000..95f154e92d --- /dev/null +++ b/sys/msdk/gstmsdkvp9dec.h @@ -0,0 +1,70 @@ +/* GStreamer Intel MSDK plugin + * Copyright (c) 2018, Intel Corporation + * + * Author: Sreerenj Balachandran + * + * 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 NEGLIGDECE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GST_MSDKVP9DEC_H__ +#define __GST_MSDKVP9DEC_H__ + +#include "gstmsdkdec.h" + +G_BEGIN_DECLS + +#define GST_TYPE_MSDKVP9DEC \ + (gst_msdkvp9dec_get_type()) +#define GST_MSDKVP9DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKVP9DEC,GstMsdkVP9Dec)) +#define GST_MSDKVP9DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKVP9DEC,GstMsdkVP9DecClass)) +#define GST_IS_MSDKVP9DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKVP9DEC)) +#define GST_IS_MSDKVP9DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKVP9DEC)) + +typedef struct _GstMsdkVP9Dec GstMsdkVP9Dec; +typedef struct _GstMsdkVP9DecClass GstMsdkVP9DecClass; + +struct _GstMsdkVP9Dec +{ + GstMsdkDec base; +}; + +struct _GstMsdkVP9DecClass +{ + GstMsdkDecClass parent_class; +}; + +GType gst_msdkvp9dec_get_type (void); + +G_END_DECLS + +#endif /* __GST_MSDKVP9DEC_H__ */