From a4fc1c5031c1a18f67ca1df5ce481c3595774bfd Mon Sep 17 00:00:00 2001 From: Yinhang Liu Date: Mon, 6 Mar 2023 19:45:06 +0800 Subject: [PATCH] msdkenc: Add documented capabilities to expose "stable" caps Although msdkenc supports dynamic caps, it still needs to expose "stable" caps to users. Part-of: --- .../gst-plugins-bad/sys/msdk/gstmsdkav1enc.c | 19 +++++++---- .../gst-plugins-bad/sys/msdk/gstmsdkcaps.c | 32 +++++++++++++++++++ .../gst-plugins-bad/sys/msdk/gstmsdkcaps.h | 5 +++ .../gst-plugins-bad/sys/msdk/gstmsdkh264enc.c | 19 +++++++---- .../gst-plugins-bad/sys/msdk/gstmsdkh265enc.c | 23 +++++++++---- .../sys/msdk/gstmsdkmjpegenc.c | 19 +++++++---- .../sys/msdk/gstmsdkmpeg2enc.c | 18 +++++++---- .../gst-plugins-bad/sys/msdk/gstmsdkvp9enc.c | 20 ++++++++---- 8 files changed, 119 insertions(+), 36 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1enc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1enc.c index 0c592c3839..1bf382557e 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1enc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkav1enc.c @@ -78,6 +78,17 @@ enum #define PROP_B_PYRAMID_DEFAULT MFX_B_REF_UNKNOWN #define PROP_P_PYRAMID_DEFAULT MFX_P_REF_DEFAULT +/* *INDENT-OFF* */ +static const gchar *doc_sink_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 const gchar *doc_src_caps_str = "video/x-av1"; + static GstElementClass *parent_class = NULL; static gboolean @@ -364,12 +375,8 @@ gst_msdkav1enc_class_init (gpointer klass, gpointer data) "Haihao Xiang , " "Mengkejiergeli Ba "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.c index 58a1ad7934..af570c3f59 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.c @@ -1027,6 +1027,38 @@ failed: #endif +static void +_pad_template_init (GstElementClass * klass, + const gchar * name_template, GstPadDirection direction, + GstCaps * caps, const gchar * doc_caps_str) +{ + GstPadTemplate *pad_templ; + + if (!caps) + return; + + pad_templ = gst_pad_template_new (name_template, + direction, GST_PAD_ALWAYS, caps); + if (doc_caps_str) { + GstCaps *doc_caps = gst_caps_from_string (doc_caps_str); + gst_pad_template_set_documentation_caps (pad_templ, doc_caps); + gst_caps_unref (doc_caps); + } + + gst_element_class_add_pad_template (klass, pad_templ); +} + +void +gst_msdkcaps_pad_template_init (GstElementClass * klass, + GstCaps * sink_caps, GstCaps * src_caps, + const gchar * doc_sink_caps_str, const gchar * doc_src_caps_str) +{ + _pad_template_init (klass, + "sink", GST_PAD_SINK, sink_caps, doc_sink_caps_str); + + _pad_template_init (klass, "src", GST_PAD_SRC, src_caps, doc_src_caps_str); +} + gboolean gst_msdkcaps_set_strings (GstCaps * caps, const gchar * features, const char *field, const gchar * strings) diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.h b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.h index 5a88217f84..5df8b74d00 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.h +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkcaps.h @@ -48,6 +48,11 @@ gst_msdkcaps_enc_create_caps (GstMsdkContext * context, gpointer enc_description, guint codec_id, GstCaps ** sink_caps, GstCaps ** src_caps); +void +gst_msdkcaps_pad_template_init (GstElementClass * klass, + GstCaps * sink_caps, GstCaps * src_caps, + const gchar * doc_sink_caps_str, const gchar * doc_src_caps_str); + gboolean gst_msdkcaps_set_strings (GstCaps * caps, const gchar * features, const char * field, const gchar * strings); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264enc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264enc.c index bb756fe1d4..819288810f 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264enc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh264enc.c @@ -112,6 +112,17 @@ enum #define PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT 0 #define PROP_DBLK_IDC_DEFAULT 0 +/* *INDENT-OFF* */ +static const gchar *doc_sink_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12, YUY2, BGRA, VUYA }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, YUY2, BGRA, VUYA }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", "{ NV12 }"); +/* *INDENT-ON* */ + +static const gchar *doc_src_caps_str = "video/x-h264"; + static GstElementClass *parent_class = NULL; static GType @@ -871,12 +882,8 @@ gst_msdkh264enc_class_init (gpointer klass, gpointer data) "H264 video encoder based on " MFX_API_SDK, "Josep Torra "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265enc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265enc.c index 5316b76172..a15a4579a9 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265enc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkh265enc.c @@ -110,6 +110,21 @@ enum #define PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT 0 #define PROP_DBLK_IDC_DEFAULT 0 +/* *INDENT-OFF* */ +static const gchar *doc_sink_caps_str = + GST_VIDEO_CAPS_MAKE ( + "{ NV12, P010_10LE, YUY2, BGRA, VUYA, BGR10A2_LE, Y210, Y410, " + "P012_LE, Y212_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, P010_10LE, YUY2, BGRA, VUYA, BGR10A2_LE, Y210, Y410, " + "P012_LE, Y212_LE }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", + "{ NV12, P010_10LE }"); +/* *INDENT-ON* */ + +static const gchar *doc_src_caps_str = "video/x-h265"; + static GstElementClass *parent_class = NULL; static void @@ -994,12 +1009,8 @@ gst_msdkh265enc_class_init (gpointer klass, gpointer data) "H265 video encoder based on " MFX_API_SDK, "Josep Torra "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegenc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegenc.c index 1652a79401..415933843f 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegenc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmjpegenc.c @@ -79,6 +79,17 @@ enum #define DEFAULT_QUALITY 85 +/* *INDENT-OFF* */ +static const gchar *doc_sink_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* */ + +static const gchar *doc_src_caps_str = "image/jpeg"; + static GstElementClass *parent_class = NULL; static gboolean @@ -199,12 +210,8 @@ gst_msdkmjpegenc_class_init (gpointer klass, gpointer data) "MJPEG video encoder based on " MFX_API_SDK, "Scott D Phillips "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2enc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2enc.c index a551ec55de..191699cc37 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2enc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkmpeg2enc.c @@ -63,6 +63,16 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkmpeg2enc_debug); #define GST_IS_MSDKMPEG2ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) +/* *INDENT-OFF* */ +static const gchar *doc_sink_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 const gchar *doc_src_caps_str = "video/mpeg"; + static GstElementClass *parent_class = NULL; static gboolean @@ -216,12 +226,8 @@ gst_msdkmpeg2enc_class_init (gpointer klass, gpointer data) "MPEG2 video encoder based on " MFX_API_SDK, "Josep Torra "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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); diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9enc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9enc.c index d5196ed7ab..60be05e514 100644 --- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9enc.c +++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvp9enc.c @@ -65,6 +65,18 @@ GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp9enc_debug); #define GST_IS_MSDKVP9ENC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass))) +/* *INDENT-OFF* */ +static const gchar *doc_sink_caps_str = + GST_VIDEO_CAPS_MAKE ("{ NV12, P010_10LE, VUYA, Y410 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:DMABuf", + "{ NV12, P010_10LE, VUYA, Y410 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory", "{ NV12 }") " ;" + GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:D3D11Memory", + "{ NV12, P010_10LE }"); +/* *INDENT-ON* */ + +static const gchar *doc_src_caps_str = "video/x-vp9"; + static GstElementClass *parent_class = NULL; static gboolean @@ -271,12 +283,8 @@ gst_msdkvp9enc_class_init (gpointer klass, gpointer data) "VP9 video encoder based on " MFX_API_SDK, "Haihao Xiang "); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - cdata->sink_caps)); - gst_element_class_add_pad_template (element_class, - gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - cdata->src_caps)); + 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);