diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c index 5e3ab9e08b..46cb9f18f2 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1dec.c @@ -57,6 +57,13 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkav1dec_debug); #define COMMON_FORMAT "{ NV12, P010_10LE, VUYA, Y410 }" +#ifndef _WIN32 +#define VA_SRC_CAPS_STR \ + ";" GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") +#else +#define VA_SRC_CAPS_STR "" +#endif + static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -66,8 +73,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", 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)) - ); + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) + VA_SRC_CAPS_STR)); #define gst_msdkav1dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkAV1Dec, gst_msdkav1dec, GST_TYPE_MSDKDEC); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c index 95fff479d0..f86081d0ce 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c @@ -41,6 +41,10 @@ #include "gstmsdksystemmemory.h" #include "gstmsdkcontextutil.h" +#ifndef _WIN32 +#include +#endif + GST_DEBUG_CATEGORY_EXTERN (gst_msdkdec_debug); #define GST_CAT_DEFAULT gst_msdkdec_debug @@ -567,26 +571,28 @@ _gst_caps_has_feature (const GstCaps * caps, const gchar * feature) } static gboolean -srcpad_can_dmabuf (GstMsdkDec * thiz) +pad_accept_memory (GstMsdkDec * thiz, const gchar * mem_type, GstCaps * filter) { gboolean ret = FALSE; GstCaps *caps, *out_caps; - GstPad *srcpad; + GstPad *pad; - srcpad = GST_VIDEO_DECODER_SRC_PAD (thiz); - caps = gst_pad_get_pad_template_caps (srcpad); + pad = GST_VIDEO_DECODER_SRC_PAD (thiz); - out_caps = gst_pad_peer_query_caps (srcpad, caps); + /* make a copy of filter caps since we need to alter the structure + * by adding dmabuf-capsfeatures */ + caps = gst_caps_copy (filter); + gst_caps_set_features (caps, 0, gst_caps_features_from_string (mem_type)); + + out_caps = gst_pad_peer_query_caps (pad, caps); if (!out_caps) goto done; - if (gst_caps_is_any (out_caps) || gst_caps_is_empty (out_caps) - || out_caps == caps) + if (gst_caps_is_any (out_caps) || gst_caps_is_empty (out_caps)) goto done; - if (_gst_caps_has_feature (out_caps, GST_CAPS_FEATURE_MEMORY_DMABUF)) + if (_gst_caps_has_feature (out_caps, mem_type)) ret = TRUE; - done: if (caps) gst_caps_unref (caps); @@ -748,10 +754,16 @@ gst_msdkdec_set_src_caps (GstMsdkDec * thiz, gboolean need_allocation) gst_msdk_set_video_alignment (vinfo, alloc_w, alloc_h, &align); gst_video_info_align (vinfo, &align); output_state->caps = gst_video_info_to_caps (vinfo); - - if (srcpad_can_dmabuf (thiz)) +#ifndef _WIN32 + if (pad_accept_memory (thiz, GST_CAPS_FEATURE_MEMORY_VA, output_state->caps)) { + gst_caps_set_features (output_state->caps, 0, + gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_VA, NULL)); + } else if (pad_accept_memory (thiz, GST_CAPS_FEATURE_MEMORY_DMABUF, + output_state->caps)) { gst_caps_set_features (output_state->caps, 0, gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_DMABUF, NULL)); + } +#endif if (need_allocation) { /* Find allocation width and height */ diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c index 1fcc9437d7..43b6d90aab 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264dec.c @@ -56,6 +56,13 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkh264dec_debug); #define COMMON_FORMAT "{ NV12, BGRA, BGRx }" +#ifndef _WIN32 +#define VA_SRC_CAPS_STR \ + "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") +#else +#define VA_SRC_CAPS_STR "" +#endif + static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -68,8 +75,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", 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)) - ); + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) + VA_SRC_CAPS_STR)); #define gst_msdkh264dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkH264Dec, gst_msdkh264dec, GST_TYPE_MSDKDEC); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c index 6b0e4d440b..8de9deaa64 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265dec.c @@ -58,6 +58,13 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkh265dec_debug); #define COMMON_FORMAT \ "{ NV12, P010_10LE, YUY2, Y210, VUYA, Y410, P012_LE, Y212_LE, Y412_LE, BGRA, BGRx }" +#ifndef _WIN32 +#define VA_SRC_CAPS_STR \ + "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") +#else +#define VA_SRC_CAPS_STR "" +#endif + /* TODO: update both sink and src dynamically */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -70,8 +77,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", 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)) - ); + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) + VA_SRC_CAPS_STR)); #define gst_msdkh265dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkH265Dec, gst_msdkh265dec, GST_TYPE_MSDKDEC); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c index a9cff9a4c5..de0d7d3727 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegdec.c @@ -67,11 +67,18 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", "width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], parsed = true ") ); +#ifndef _WIN32 +#define VA_SRC_CAPS_STR \ + "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("{ NV12 }") +#else +#define VA_SRC_CAPS_STR "" +#endif + 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 }")) - ); + GST_STATIC_CAPS (GST_MSDK_CAPS_STR ("{ NV12, YUY2 }", "{ NV12, YUY2 }") + VA_SRC_CAPS_STR)); #define gst_msdkmjpegdec_parent_class parent_class G_DEFINE_TYPE (GstMsdkMJPEGDec, gst_msdkmjpegdec, GST_TYPE_MSDKDEC); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c index 4d2f9267f8..688a1957b3 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2dec.c @@ -57,6 +57,13 @@ 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 + static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -65,6 +72,12 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", "mpegversion = (int) 2, " "systemstream = (boolean) false") ); +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)); + #define gst_msdkmpeg2dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkMPEG2Dec, gst_msdkmpeg2dec, GST_TYPE_MSDKDEC); @@ -151,6 +164,7 @@ 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); } static void diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c index cef1fcfd49..68910c5378 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvc1dec.c @@ -56,6 +56,13 @@ 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 + static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, @@ -76,6 +83,12 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", "stream-format= (string) bdu, " "profile = (string) advanced" ";") ); +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)); + #define gst_msdkvc1dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkVC1Dec, gst_msdkvc1dec, GST_TYPE_MSDKDEC); @@ -209,6 +222,8 @@ 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); + } static void diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c index 847d6529e7..3056a7dd5b 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9dec.c @@ -58,6 +58,14 @@ 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 }" + +#ifndef _WIN32 +#define VA_SRC_CAPS_STR \ + "; " GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE (SUPPORTED_VA_FORMAT) +#else +#define VA_SRC_CAPS_STR "" +#endif static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -68,8 +76,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", 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)) - ); + GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT, COMMON_FORMAT) + VA_SRC_CAPS_STR)); #define gst_msdkvp9dec_parent_class parent_class G_DEFINE_TYPE (GstMsdkVP9Dec, gst_msdkvp9dec, GST_TYPE_MSDKDEC);