From bfbde5ce22af1074864efe0991c952cc8d94fa1e Mon Sep 17 00:00:00 2001 From: Yinhang Liu Date: Fri, 10 Mar 2023 19:03:47 +0800 Subject: [PATCH] msdkdec: Enable dynamic capability support Enable dynamic capability support for msdkav1dec, msdkh264dec, msdkh265dec, msdkmjpegdec, msdkmpeg2dec, msdkvc1dec, msdkvp8dec, msdkvp9dec. The gstmsdkdec elements can create the sink caps and src caps dynamically for different platforms. Part-of: --- .../gst-plugins-bad/sys/msdk/gstmsdk.c | 70 ++++++++--- .../gst-plugins-bad/sys/msdk/gstmsdkav1dec.c | 103 ++++++++++----- .../gst-plugins-bad/sys/msdk/gstmsdkav1dec.h | 16 +-- .../gst-plugins-bad/sys/msdk/gstmsdkdec.c | 8 -- .../gst-plugins-bad/sys/msdk/gstmsdkdec.h | 7 ++ .../gst-plugins-bad/sys/msdk/gstmsdkh264dec.c | 110 ++++++++++------ .../gst-plugins-bad/sys/msdk/gstmsdkh264dec.h | 16 +-- .../gst-plugins-bad/sys/msdk/gstmsdkh265dec.c | 117 ++++++++++++------ .../gst-plugins-bad/sys/msdk/gstmsdkh265dec.h | 16 +-- .../sys/msdk/gstmsdkmjpegdec.c | 104 +++++++++++----- .../sys/msdk/gstmsdkmjpegdec.h | 16 +-- .../sys/msdk/gstmsdkmpeg2dec.c | 98 +++++++++++---- .../sys/msdk/gstmsdkmpeg2dec.h | 16 +-- .../gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c | 110 ++++++++++------ .../gst-plugins-bad/sys/msdk/gstmsdkvc1dec.h | 16 +-- .../gst-plugins-bad/sys/msdk/gstmsdkvp8dec.c | 87 +++++++++++-- .../gst-plugins-bad/sys/msdk/gstmsdkvp8dec.h | 16 +-- .../gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c | 106 +++++++++++----- .../gst-plugins-bad/sys/msdk/gstmsdkvp9dec.h | 16 +-- 19 files changed, 683 insertions(+), 365 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdk.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk.c index 9af87929fd..eace06f68e 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdk.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdk.c @@ -156,46 +156,48 @@ _register_encoder (GstPlugin * plugin, } static gboolean -_register_decoder (GstPlugin * plugin, guint codec_id) +_register_decoder (GstPlugin * plugin, + GstMsdkContext * context, guint codec_id, + GstCaps * sink_caps, GstCaps * src_caps) { gboolean ret = TRUE; switch (codec_id) { case MFX_CODEC_AVC: - ret = gst_element_register (plugin, "msdkh264dec", GST_RANK_NONE, - GST_TYPE_MSDKH264DEC); + ret = gst_msdkh264dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; case MFX_CODEC_HEVC: - ret = gst_element_register (plugin, "msdkh265dec", GST_RANK_NONE, - GST_TYPE_MSDKH265DEC); + ret = gst_msdkh265dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; case MFX_CODEC_MPEG2: - ret = gst_element_register (plugin, "msdkmpeg2dec", GST_RANK_NONE, - GST_TYPE_MSDKMPEG2DEC); + ret = gst_msdkmpeg2dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; case MFX_CODEC_VP8: - ret = gst_element_register (plugin, "msdkvp8dec", GST_RANK_NONE, - GST_TYPE_MSDKVP8DEC); + ret = gst_msdkvp8dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; #ifdef USE_MSDK_VP9_DEC case MFX_CODEC_VP9: - ret = gst_element_register (plugin, "msdkvp9dec", GST_RANK_NONE, - GST_TYPE_MSDKVP9DEC); + ret = gst_msdkvp9dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; #endif #ifdef USE_MSDK_AV1_DEC case MFX_CODEC_AV1: - ret = gst_element_register (plugin, "msdkav1dec", GST_RANK_NONE, - GST_TYPE_MSDKAV1DEC); + ret = gst_msdkav1dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; #endif case MFX_CODEC_JPEG: - ret = gst_element_register (plugin, "msdkmjpegdec", GST_RANK_NONE, - GST_TYPE_MSDKMJPEGDEC); + ret = gst_msdkmjpegdec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; case MFX_CODEC_VC1: - ret = gst_element_register (plugin, "msdkvc1dec", GST_RANK_NONE, - GST_TYPE_MSDKVC1DEC); + ret = gst_msdkvc1dec_register (plugin, + context, sink_caps, src_caps, GST_RANK_NONE); break; default: ret = FALSE; @@ -238,11 +240,26 @@ static void _register_decoders (GstPlugin * plugin, GstMsdkContext * context, mfxDecoderDescription * dec_desc) { + GstCaps *sink_caps = NULL; + GstCaps *src_caps = NULL; + for (guint c = 0; c < dec_desc->NumCodecs; c++) { - if (!_register_decoder (plugin, dec_desc->Codecs[c].CodecID)) { + if (!gst_msdkcaps_dec_create_caps (context, dec_desc, + dec_desc->Codecs[c].CodecID, &sink_caps, &src_caps)) { + GST_WARNING ("Failed to create caps for %" GST_FOURCC_FORMAT " DEC", + GST_FOURCC_ARGS (dec_desc->Codecs[c].CodecID)); + continue; + } + + if (!_register_decoder (plugin, + context, dec_desc->Codecs[c].CodecID, sink_caps, src_caps)) { GST_WARNING ("Failed to register %" GST_FOURCC_FORMAT " DEC", GST_FOURCC_ARGS (dec_desc->Codecs[c].CodecID)); + continue; } + + gst_caps_unref (sink_caps); + gst_caps_unref (src_caps); } } @@ -312,11 +329,26 @@ _register_encoders (GstPlugin * plugin, GstMsdkContext * context) static void _register_decoders (GstPlugin * plugin, GstMsdkContext * context) { + GstCaps *sink_caps = NULL; + GstCaps *src_caps = NULL; + for (guint c = 0; c < G_N_ELEMENTS (dec_codecs); c++) { - if (!_register_decoder (plugin, dec_codecs[c])) { + if (!gst_msdkcaps_dec_create_caps (context, + NULL, dec_codecs[c], &sink_caps, &src_caps)) { + GST_WARNING ("Failed to create caps for %" GST_FOURCC_FORMAT " DEC", + GST_FOURCC_ARGS (dec_codecs[c])); + continue; + } + + if (!_register_decoder (plugin, context, + dec_codecs[c], sink_caps, src_caps)) { GST_WARNING ("Failed to register %" GST_FOURCC_FORMAT " DEC", GST_FOURCC_ARGS (dec_codecs[c])); + continue; } + + gst_caps_unref (sink_caps); + gst_caps_unref (src_caps); } } diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c index cd654f7ae1..48c774a855 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c @@ -54,38 +54,27 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkav1dec_debug); #define GST_CAT_DEFAULT gst_msdkav1dec_debug -#define COMMON_FORMAT "{ NV12, P010_10LE, VUYA, Y410 }" +#define GST_MSDKAV1DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkAV1Dec)) +#define GST_MSDKAV1DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkAV1DecClass)) +#define GST_IS_MSDKAV1DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKAV1DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - ";" GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define D3D11_SRC_CAPS_STR \ - ";" GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12 }") -#endif +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12, P010_10LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, P010_10LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-av1") - ); +static const gchar *doc_sink_caps_str = "video/x-av1"; -#ifndef _WIN32 -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - VA_SRC_CAPS_STR)); -#else -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - D3D11_SRC_CAPS_STR)); -#endif - -#define gst_msdkav1dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkAV1Dec, gst_msdkav1dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkav1dec_configure (GstMsdkDec * decoder) @@ -118,10 +107,13 @@ gst_msdkav1dec_preinit_decoder (GstMsdkDec * decoder) } static void -gst_msdkav1dec_class_init (GstMsdkAV1DecClass * klass) +gst_msdkav1dec_class_init (gpointer klass, gpointer data) { GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); element_class = GST_ELEMENT_CLASS (klass); decoder_class = GST_MSDKDEC_CLASS (klass); @@ -136,11 +128,56 @@ gst_msdkav1dec_class_init (GstMsdkAV1DecClass * klass) "AV1 video decoder based on " MFX_API_SDK, "Haihao Xiang "); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkav1dec_init (GstMsdkAV1Dec * thiz) +gst_msdkav1dec_init (GTypeInstance * instance, gpointer g_class) { } + +gboolean +gst_msdkav1dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkAV1DecClass), + .class_init = gst_msdkav1dec_class_init, + .instance_size = sizeof (GstMsdkAV1Dec), + .instance_init = gst_msdkav1dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkAV1Dec"); + feature_name = g_strdup ("msdkav1dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.h index 3cb1ee4048..2559346727 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.h @@ -36,17 +36,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKAV1DEC \ - (gst_msdkav1dec_get_type()) -#define GST_MSDKAV1DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKAV1DEC,GstMsdkAV1Dec)) -#define GST_MSDKAV1DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKAV1DEC,GstMsdkAV1DecClass)) -#define GST_IS_MSDKAV1DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKAV1DEC)) -#define GST_IS_MSDKAV1DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKAV1DEC)) - typedef struct _GstMsdkAV1Dec GstMsdkAV1Dec; typedef struct _GstMsdkAV1DecClass GstMsdkAV1DecClass; @@ -60,7 +49,10 @@ struct _GstMsdkAV1DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkav1dec_get_type (void); +gboolean +gst_msdkav1dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c index b32e00d8de..883ab46434 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c @@ -48,12 +48,6 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkdec_debug); #define GST_CAT_DEFAULT gst_msdkdec_debug -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("NV12", "NV12")) - ); - #define PROP_HARDWARE_DEFAULT TRUE #define PROP_ASYNC_DEPTH_DEFAULT 1 @@ -2245,8 +2239,6 @@ gst_msdkdec_class_init (GstMsdkDecClass * klass) "Depth of asynchronous pipeline", 1, 20, PROP_ASYNC_DEPTH_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - gst_element_class_add_static_pad_template (element_class, &src_factory); } static void diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.h index 4e00278380..3950514071 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.h @@ -61,6 +61,7 @@ G_BEGIN_DECLS typedef struct _GstMsdkDec GstMsdkDec; typedef struct _GstMsdkDecClass GstMsdkDecClass; typedef struct _MsdkDecTask MsdkDecTask; +typedef struct _MsdkDecCData MsdkDecCData; struct _GstMsdkDec { @@ -134,6 +135,12 @@ struct _GstMsdkDecClass gboolean (*postinit_decoder) (GstMsdkDec * decoder); }; +struct _MsdkDecCData +{ + GstCaps *sink_caps; + GstCaps *src_caps; +}; + GType gst_msdkdec_get_type (void); void diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c index f2affd77b2..6be1d102b0 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c @@ -54,41 +54,26 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkh264dec_debug); #define GST_CAT_DEFAULT gst_msdkh264dec_debug -#define COMMON_FORMAT "{ NV12, BGRA, BGRx }" +#define GST_MSDKH264DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkH264Dec)) +#define GST_MSDKH264DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkH264DecClass)) +#define GST_IS_MSDKH264DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKH264DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define D3D11_SRC_CAPS_STR \ - ";" GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12 }") -#endif +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-h264, " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], " - "stream-format = (string) byte-stream , alignment = (string) au , " - "profile = (string) { high, progressive-high, constrained-high, main, baseline, constrained-baseline }") - ); +static const gchar *doc_sink_caps_str = "video/x-h264"; -#ifndef _WIN32 -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - VA_SRC_CAPS_STR)); -#else -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - D3D11_SRC_CAPS_STR)); -#endif - -#define gst_msdkh264dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkH264Dec, gst_msdkh264dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkh264dec_configure (GstMsdkDec * decoder) @@ -177,11 +162,14 @@ gst_msdkdec_h264_get_property (GObject * object, guint prop_id, GValue * value, } static void -gst_msdkh264dec_class_init (GstMsdkH264DecClass * klass) +gst_msdkh264dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -204,12 +192,62 @@ gst_msdkh264dec_class_init (GstMsdkH264DecClass * klass) gst_msdkdec_prop_install_error_report_property (gobject_class); #endif - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkh264dec_init (GstMsdkH264Dec * thiz) +gst_msdkh264dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkH264Dec *thiz = GST_MSDKH264DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkh264dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkH264DecClass), + .class_init = gst_msdkh264dec_class_init, + .instance_size = sizeof (GstMsdkH264Dec), + .instance_init = gst_msdkh264dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_copy (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + gst_caps_set_simple (cdata->sink_caps, + "alignment", G_TYPE_STRING, "au", + "stream-format", G_TYPE_STRING, "byte-stream", NULL); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkH264Dec"); + feature_name = g_strdup ("msdkh264dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.h index 5b5c6acb28..3edc5bc6ab 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.h @@ -36,17 +36,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKH264DEC \ - (gst_msdkh264dec_get_type()) -#define GST_MSDKH264DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKH264DEC,GstMsdkH264Dec)) -#define GST_MSDKH264DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKH264DEC,GstMsdkH264DecClass)) -#define GST_IS_MSDKH264DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKH264DEC)) -#define GST_IS_MSDKH264DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKH264DEC)) - typedef struct _GstMsdkH264Dec GstMsdkH264Dec; typedef struct _GstMsdkH264DecClass GstMsdkH264DecClass; @@ -61,7 +50,10 @@ struct _GstMsdkH264DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkh264dec_get_type (void); +gboolean +gst_msdkh264dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c index f9df04eb31..c92b404986 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c @@ -54,42 +54,32 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkh265dec_debug); #define GST_CAT_DEFAULT gst_msdkh265dec_debug -#define COMMON_FORMAT \ - "{ NV12, P010_10LE, YUY2, Y210, VUYA, Y410, P012_LE, Y212_LE, Y412_LE, BGRA, BGRx }" +#define GST_TYPE_MSDKH265DEC \ + (gst_msdkh265dec_get_type()) +#define GST_MSDKH265DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkH265Dec)) +#define GST_MSDKH265DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkH265DecClass)) +#define GST_IS_MSDKH265DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKH265DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define D3D11_SRC_CAPS_STR \ - ";" GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12 }") -#endif +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ( + "{ NV12, P010_10LE, YUY2, VUYA, Y210, Y410, P012_LE, Y212_LE, " + "Y412_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, P010_10LE, YUY2, VUYA, Y210, Y410, P012_LE, Y212_LE, " + "Y412_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -/* TODO: update both sink and src dynamically */ -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-h265, " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], " - "stream-format = (string) byte-stream , alignment = (string) au ") - ); +static const gchar *doc_sink_caps_str = "video/x-h265"; -#ifndef _WIN32 -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - VA_SRC_CAPS_STR)); -#else -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - D3D11_SRC_CAPS_STR)); -#endif - -#define gst_msdkh265dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkH265Dec, gst_msdkh265dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkh265dec_configure (GstMsdkDec * decoder) @@ -190,11 +180,14 @@ gst_msdkdec_h265_get_property (GObject * object, guint prop_id, GValue * value, } static void -gst_msdkh265dec_class_init (GstMsdkH265DecClass * klass) +gst_msdkh265dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -217,12 +210,62 @@ gst_msdkh265dec_class_init (GstMsdkH265DecClass * klass) gst_msdkdec_prop_install_error_report_property (gobject_class); #endif - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkh265dec_init (GstMsdkH265Dec * thiz) +gst_msdkh265dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkH265Dec *thiz = GST_MSDKH265DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkh265dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkH265DecClass), + .class_init = gst_msdkh265dec_class_init, + .instance_size = sizeof (GstMsdkH265Dec), + .instance_init = gst_msdkh265dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_copy (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + gst_caps_set_simple (cdata->sink_caps, + "stream-format", G_TYPE_STRING, "byte-stream", + "alignment", G_TYPE_STRING, "au", NULL); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkH265Dec"); + feature_name = g_strdup ("msdkh265dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.h index e58bde3e4a..0054ab1e25 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.h @@ -36,17 +36,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKH265DEC \ - (gst_msdkh265dec_get_type()) -#define GST_MSDKH265DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKH265DEC,GstMsdkH265Dec)) -#define GST_MSDKH265DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKH265DEC,GstMsdkH265DecClass)) -#define GST_IS_MSDKH265DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKH265DEC)) -#define GST_IS_MSDKH265DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKH265DEC)) - typedef struct _GstMsdkH265Dec GstMsdkH265Dec; typedef struct _GstMsdkH265DecClass GstMsdkH265DecClass; @@ -61,7 +50,10 @@ struct _GstMsdkH265DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkh265dec_get_type (void); +gboolean +gst_msdkh265dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c index 04b27517b2..33e896d3e0 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c @@ -59,37 +59,27 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkmjpegdec_debug); #define GST_CAT_DEFAULT gst_msdkmjpegdec_debug -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("image/jpeg, " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], parsed = true ") - ); +#define GST_MSDKMJPEGDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkMJPEGDec)) +#define GST_MSDKMJPEGDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkMJPEGDecClass)) +#define GST_IS_MSDKMJPEGDEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKMJPEGDEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define D3D11_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12 }") -#endif +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12, YUY2, BGRA }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, YUY2, BGRA }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -#ifndef _WIN32 -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("{ NV12, YUY2 }", "{ NV12, YUY2 }") - VA_SRC_CAPS_STR)); -#else -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("{ NV12, YUY2 }", "{ NV12, YUY2 }") - D3D11_SRC_CAPS_STR)); -#endif +static const gchar *doc_sink_caps_str = "image/jpeg"; -#define gst_msdkmjpegdec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkMJPEGDec, gst_msdkmjpegdec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkmjpegdec_configure (GstMsdkDec * decoder) @@ -192,11 +182,14 @@ gst_msdkdec_mjpeg_get_property (GObject * object, guint prop_id, GValue * value, } static void -gst_msdkmjpegdec_class_init (GstMsdkMJPEGDecClass * klass) +gst_msdkmjpegdec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -219,11 +212,58 @@ gst_msdkmjpegdec_class_init (GstMsdkMJPEGDecClass * klass) gst_msdkdec_prop_install_error_report_property (gobject_class); #endif - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkmjpegdec_init (GstMsdkMJPEGDec * thiz) +gst_msdkmjpegdec_init (GTypeInstance * instance, gpointer g_class) { } + +gboolean +gst_msdkmjpegdec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkMJPEGDecClass), + .class_init = gst_msdkmjpegdec_class_init, + .instance_size = sizeof (GstMsdkMJPEGDec), + .instance_init = gst_msdkmjpegdec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_copy (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + gst_caps_set_simple (cdata->sink_caps, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkMJPEGDec"); + feature_name = g_strdup ("msdkmjpegdec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.h index 565c95f321..f4c39a6d13 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.h @@ -36,17 +36,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKMJPEGDEC \ - (gst_msdkmjpegdec_get_type()) -#define GST_MSDKMJPEGDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKMJPEGDEC,GstMsdkMJPEGDec)) -#define GST_MSDKMJPEGDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKMJPEGDEC,GstMsdkMJPEGDecClass)) -#define GST_IS_MSDKMJPEGDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKMJPEGDEC)) -#define GST_IS_MSDKMJPEGDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKMJPEGDEC)) - typedef struct _GstMsdkMJPEGDec GstMsdkMJPEGDec; typedef struct _GstMsdkMJPEGDecClass GstMsdkMJPEGDecClass; @@ -60,7 +49,10 @@ struct _GstMsdkMJPEGDecClass GstMsdkDecClass parent_class; }; -GType gst_msdkmjpegdec_get_type (void); +gboolean +gst_msdkmjpegdec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c index 688a1957b3..9f2a428f4f 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c @@ -57,29 +57,26 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkmpeg2dec_debug); #define GST_CAT_DEFAULT gst_msdkmpeg2dec_debug -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define VA_SRC_CAPS_STR "" -#endif +#define GST_MSDKMPEG2DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkMPEG2Dec)) +#define GST_MSDKMPEG2DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkMPEG2DecClass)) +#define GST_IS_MSDKMPEG2DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKMPEG2DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], " - "mpegversion = (int) 2, " "systemstream = (boolean) false") - ); +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("{ NV12 }", "{ NV12 }") - VA_SRC_CAPS_STR)); +static const gchar *doc_sink_caps_str = "video/mpeg"; -#define gst_msdkmpeg2dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkMPEG2Dec, gst_msdkmpeg2dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkmpeg2dec_configure (GstMsdkDec * decoder) @@ -140,11 +137,14 @@ gst_msdkdec_mpeg2_get_property (GObject * object, guint prop_id, GValue * value, } static void -gst_msdkmpeg2dec_class_init (GstMsdkMPEG2DecClass * klass) +gst_msdkmpeg2dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -163,12 +163,62 @@ gst_msdkmpeg2dec_class_init (GstMsdkMPEG2DecClass * klass) gst_msdkdec_prop_install_output_oder_property (gobject_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkmpeg2dec_init (GstMsdkMPEG2Dec * thiz) +gst_msdkmpeg2dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkMPEG2Dec *thiz = GST_MSDKMPEG2DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkmpeg2dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkMPEG2DecClass), + .class_init = gst_msdkmpeg2dec_class_init, + .instance_size = sizeof (GstMsdkMPEG2Dec), + .instance_init = gst_msdkmpeg2dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_copy (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + gst_caps_set_simple (cdata->sink_caps, + "mpegversion", G_TYPE_INT, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkMPEG2Dec"); + feature_name = g_strdup ("msdkmpeg2dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.h index dee40366d5..6bb3456233 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.h @@ -38,17 +38,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKMPEG2DEC \ - (gst_msdkmpeg2dec_get_type()) -#define GST_MSDKMPEG2DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKMPEG2DEC,GstMsdkMPEG2Dec)) -#define GST_MSDKMPEG2DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKMPEG2DEC,GstMsdkMPEG2DecClass)) -#define GST_IS_MSDKMPEG2DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKMPEG2DEC)) -#define GST_IS_MSDKMPEG2DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKMPEG2DEC)) - typedef struct _GstMsdkMPEG2Dec GstMsdkMPEG2Dec; typedef struct _GstMsdkMPEG2DecClass GstMsdkMPEG2DecClass; @@ -63,7 +52,10 @@ struct _GstMsdkMPEG2DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkmpeg2dec_get_type (void); +gboolean +gst_msdkmpeg2dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c index 68910c5378..eb9b9d4479 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c @@ -56,41 +56,25 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkvc1dec_debug); #define GST_CAT_DEFAULT gst_msdkvc1dec_debug -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") -#else -#define VA_SRC_CAPS_STR "" -#endif +#define GST_MSDKVC1DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkVC1Dec)) +#define GST_MSDKVC1DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkVC1DecClass)) +#define GST_IS_MSDKVC1DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKVC1DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-wmv, " - "framerate = (fraction) [0/1, MAX], " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], " - "wmvversion= (int) 3, " - "format= (string) WMV3, " - "header-format= (string) none, " - "stream-format= (string) sequence-layer-frame-layer, " - "profile = (string) {simple, main}" ";" - "video/x-wmv, " - "framerate = (fraction) [0/1, MAX], " - "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], " - "wmvversion= (int) 3, " - "format= (string) WVC1, " - "header-format= (string) asf, " - "stream-format= (string) bdu, " "profile = (string) advanced" ";") - ); +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }"); +/* *INDENT-ON* */ -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("{ NV12 }", "{ NV12 }") - VA_SRC_CAPS_STR)); +static const gchar *doc_sink_caps_str = "video/x-wmv"; -#define gst_msdkvc1dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkVC1Dec, gst_msdkvc1dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkvc1dec_configure (GstMsdkDec * decoder) @@ -196,11 +180,14 @@ gst_msdkvc1dec_preinit_decoder (GstMsdkDec * decoder) } static void -gst_msdkvc1dec_class_init (GstMsdkVC1DecClass * klass) +gst_msdkvc1dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -221,13 +208,64 @@ gst_msdkvc1dec_class_init (GstMsdkVC1DecClass * klass) gst_msdkdec_prop_install_output_oder_property (gobject_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkvc1dec_init (GstMsdkVC1Dec * thiz) +gst_msdkvc1dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkVC1Dec *thiz = GST_MSDKVC1DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkvc1dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkVC1DecClass), + .class_init = gst_msdkvc1dec_class_init, + .instance_size = sizeof (GstMsdkVC1Dec), + .instance_init = gst_msdkvc1dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_ref (sink_caps); +#ifndef _WIN32 + cdata->src_caps = gst_caps_ref (src_caps); +#else + cdata->src_caps = gst_caps_copy (src_caps); + gst_msdkcaps_remove_structure (cdata->src_caps, "memory:D3D11Memory"); +#endif + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkVC1Dec"); + feature_name = g_strdup ("msdkvc1dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.h index 5f3f298902..fa13fe2768 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.h @@ -38,17 +38,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKVC1DEC \ - (gst_msdkvc1dec_get_type()) -#define GST_MSDKVC1DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKVC1DEC,GstMsdkVC1Dec)) -#define GST_MSDKVC1DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKVC1DEC,GstMsdkVC1DecClass)) -#define GST_IS_MSDKVC1DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKVC1DEC)) -#define GST_IS_MSDKVC1DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKVC1DEC)) - typedef struct _GstMsdkVC1Dec GstMsdkVC1Dec; typedef struct _GstMsdkVC1DecClass GstMsdkVC1DecClass; @@ -63,7 +52,10 @@ struct _GstMsdkVC1DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkvc1dec_get_type (void); +gboolean +gst_msdkvc1dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.c index 4033d0d5b2..22ebf76fa6 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.c @@ -57,14 +57,25 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp8dec_debug); #define GST_CAT_DEFAULT gst_msdkvp8dec_debug -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-vp8") - ); +#define GST_MSDKVP8DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkVP8Dec)) +#define GST_MSDKVP8DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkVP8DecClass)) +#define GST_IS_MSDKVP8DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKVP8DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#define gst_msdkvp8dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkVP8Dec, gst_msdkvp8dec, GST_TYPE_MSDKDEC); +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }"); +/* *INDENT-ON* */ + +static const gchar *doc_sink_caps_str = "video/x-vp8"; + +static GstElementClass *parent_class = NULL; static gboolean gst_msdkvp8dec_configure (GstMsdkDec * decoder) @@ -168,11 +179,14 @@ gst_msdkvp8dec_postinit_decoder (GstMsdkDec * decoder) } static void -gst_msdkvp8dec_class_init (GstMsdkVP8DecClass * klass) +gst_msdkvp8dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -195,11 +209,64 @@ gst_msdkvp8dec_class_init (GstMsdkVP8DecClass * klass) gst_msdkdec_prop_install_output_oder_property (gobject_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata); } static void -gst_msdkvp8dec_init (GstMsdkVP8Dec * thiz) +gst_msdkvp8dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkVP8Dec *thiz = GST_MSDKVP8DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkvp8dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkVP8DecClass), + .class_init = gst_msdkvp8dec_class_init, + .instance_size = sizeof (GstMsdkVP8Dec), + .instance_init = gst_msdkvp8dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = gst_caps_copy (src_caps); +#ifndef _WIN32 + cdata->src_caps = gst_caps_ref (src_caps); +#else + cdata->src_caps = gst_caps_copy (src_caps); + gst_msdkcaps_remove_structure (cdata->src_caps, "memory:D3D11Memory"); +#endif + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkVP8Dec"); + feature_name = g_strdup ("msdkvp8dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.h index 43f1a47fa7..9b8b806d4a 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp8dec.h @@ -37,17 +37,6 @@ G_BEGIN_DECLS -#define GST_TYPE_MSDKVP8DEC \ - (gst_msdkvp8dec_get_type()) -#define GST_MSDKVP8DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKVP8DEC,GstMsdkVP8Dec)) -#define GST_MSDKVP8DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKVP8DEC,GstMsdkVP8DecClass)) -#define GST_IS_MSDKVP8DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKVP8DEC)) -#define GST_IS_MSDKVP8DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKVP8DEC)) - typedef struct _GstMsdkVP8Dec GstMsdkVP8Dec; typedef struct _GstMsdkVP8DecClass GstMsdkVP8DecClass; @@ -62,7 +51,10 @@ struct _GstMsdkVP8DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkvp8dec_get_type (void); +gboolean +gst_msdkvp8dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c index 666c6414b5..730bb1fb9b 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c @@ -56,39 +56,28 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp9dec_debug); #define GST_CAT_DEFAULT gst_msdkvp9dec_debug -#define COMMON_FORMAT "{ NV12, P010_10LE, VUYA, Y410, P012_LE, Y412_LE }" -#define SUPPORTED_VA_FORMAT "{ NV12 }" +#define GST_MSDKVP9DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkVP9Dec)) +#define GST_MSDKVP9DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkVP9DecClass)) +#define GST_IS_MSDKVP9DEC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj))) +#define GST_IS_MSDKVP9DEC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) -#ifndef _WIN32 -#define VA_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE (SUPPORTED_VA_FORMAT) -#else -#define D3D11_SRC_CAPS_STR \ - "; " GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12 }") -#endif +/* *INDENT-OFF* */ +static const gchar *doc_src_caps_str = + GST_VIDEO_CAPS_MAKE ( + "{ NV12, P010_10LE, VUYA, Y410, P012_LE, Y412_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, P010_10LE, VUYA, Y410, P012_LE, Y412_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ -static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-vp9") - ); +static const gchar *doc_sink_caps_str = "video/x-vp9"; -#ifndef _WIN32 -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - VA_SRC_CAPS_STR)); -#else -static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) - D3D11_SRC_CAPS_STR)); -#endif - -#define gst_msdkvp9dec_parent_class parent_class -G_DEFINE_TYPE (GstMsdkVP9Dec, gst_msdkvp9dec, GST_TYPE_MSDKDEC); +static GstElementClass *parent_class = NULL; static gboolean gst_msdkvp9dec_configure (GstMsdkDec * decoder) @@ -181,11 +170,14 @@ gst_msdkvp9dec_preinit_decoder (GstMsdkDec * decoder) } static void -gst_msdkvp9dec_class_init (GstMsdkVP9DecClass * klass) +gst_msdkvp9dec_class_init (gpointer klass, gpointer data) { GObjectClass *gobject_class; GstElementClass *element_class; GstMsdkDecClass *decoder_class; + MsdkDecCData *cdata = data; + + parent_class = g_type_class_peek_parent (klass); gobject_class = G_OBJECT_CLASS (klass); element_class = GST_ELEMENT_CLASS (klass); @@ -206,12 +198,58 @@ gst_msdkvp9dec_class_init (GstMsdkVP9DecClass * klass) gst_msdkdec_prop_install_output_oder_property (gobject_class); - gst_element_class_add_static_pad_template (element_class, &sink_factory); - gst_element_class_add_static_pad_template (element_class, &src_factory); + gst_msdkcaps_pad_template_init (element_class, + cdata->sink_caps, cdata->src_caps, doc_sink_caps_str, doc_src_caps_str); + + gst_caps_unref (cdata->sink_caps); + gst_caps_unref (cdata->src_caps); + g_free (cdata);; } static void -gst_msdkvp9dec_init (GstMsdkVP9Dec * thiz) +gst_msdkvp9dec_init (GTypeInstance * instance, gpointer g_class) { + GstMsdkVP9Dec *thiz = GST_MSDKVP9DEC (instance); thiz->output_order = PROP_OUTPUT_ORDER_DEFAULT; } + +gboolean +gst_msdkvp9dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank) +{ + GType type; + MsdkDecCData *cdata; + gchar *type_name, *feature_name; + gboolean ret = FALSE; + + GTypeInfo type_info = { + .class_size = sizeof (GstMsdkVP9DecClass), + .class_init = gst_msdkvp9dec_class_init, + .instance_size = sizeof (GstMsdkVP9Dec), + .instance_init = gst_msdkvp9dec_init + }; + + cdata = g_new (MsdkDecCData, 1); + cdata->sink_caps = gst_caps_ref (sink_caps); + cdata->src_caps = gst_caps_ref (src_caps); + + GST_MINI_OBJECT_FLAG_SET (cdata->sink_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + GST_MINI_OBJECT_FLAG_SET (cdata->src_caps, + GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED); + + type_info.class_data = cdata; + + type_name = g_strdup ("GstMsdkVP9Dec"); + feature_name = g_strdup ("msdkvp9dec"); + + type = g_type_register_static (GST_TYPE_MSDKDEC, type_name, &type_info, 0); + if (type) + ret = gst_element_register (plugin, feature_name, rank, type); + + g_free (type_name); + g_free (feature_name); + + return ret; +} diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.h index 28ced43f11..6b2a56dfe8 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.h @@ -39,17 +39,6 @@ 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; @@ -64,7 +53,10 @@ struct _GstMsdkVP9DecClass GstMsdkDecClass parent_class; }; -GType gst_msdkvp9dec_get_type (void); +gboolean +gst_msdkvp9dec_register (GstPlugin * plugin, + GstMsdkContext * context, GstCaps * sink_caps, + GstCaps * src_caps, guint rank); G_END_DECLS