From 8d0dc4fdd28e483abc8c4340c56ea38c0fa7702d Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 9 Jun 2020 00:20:08 +0900 Subject: [PATCH] plugins: Update for documentation of Windows plugins * Add Since marks * Make use of GST_PARAM_CONDITIONALLY_AVAILABLE flag --- sys/d3d11/gstd3d11basefilter.c | 9 ++ sys/d3d11/gstd3d11videosink.c | 2 + sys/d3d11/plugin.c | 6 ++ sys/mediafoundation/gstmfaudioenc.cpp | 2 + sys/mediafoundation/gstmfh264enc.cpp | 157 ++++++++++++++++++--------------- sys/mediafoundation/gstmfh265enc.cpp | 128 ++++++++++++++------------- sys/mediafoundation/gstmfvideoenc.cpp | 2 + sys/mediafoundation/gstmfvp9enc.cpp | 57 +++++++----- sys/mediafoundation/plugin.c | 6 ++ sys/wasapi/gstwasapisink.c | 2 + sys/wasapi/gstwasapisrc.c | 2 + sys/wasapi2/plugin.c | 6 ++ sys/winscreencap/gstdxgiscreencapsrc.c | 5 ++ 13 files changed, 235 insertions(+), 149 deletions(-) diff --git a/sys/d3d11/gstd3d11basefilter.c b/sys/d3d11/gstd3d11basefilter.c index a1a8edc..a18fa2f 100644 --- a/sys/d3d11/gstd3d11basefilter.c +++ b/sys/d3d11/gstd3d11basefilter.c @@ -71,6 +71,13 @@ gst_d3d11_base_filter_class_init (GstD3D11BaseFilterClass * klass) gobject_class->get_property = gst_d3d11_base_filter_get_property; gobject_class->dispose = gst_d3d11_base_filter_dispose; + /** + * GstD3D11BaseFilter:adapter: + * + * Adapter index for creating device (-1 for default) + * + * Since: 1.18 + */ g_object_class_install_property (gobject_class, PROP_ADAPTER, g_param_spec_int ("adapter", "Adapter", "Adapter index for creating device (-1 for default)", @@ -89,6 +96,8 @@ gst_d3d11_base_filter_class_init (GstD3D11BaseFilterClass * klass) trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_d3d11_base_filter_get_unit_size); trans_class->query = GST_DEBUG_FUNCPTR (gst_d3d11_base_filter_query); + + gst_type_mark_as_plugin_api (GST_TYPE_D3D11_BASE_FILTER, 0); } static void diff --git a/sys/d3d11/gstd3d11videosink.c b/sys/d3d11/gstd3d11videosink.c index abee042..0a271a6 100644 --- a/sys/d3d11/gstd3d11videosink.c +++ b/sys/d3d11/gstd3d11videosink.c @@ -173,6 +173,8 @@ gst_d3d11_video_sink_class_init (GstD3D11VideoSinkClass * klass) videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_d3d11_video_sink_show_frame); + + gst_type_mark_as_plugin_api (GST_D3D11_WINDOW_TOGGLE_MODE_GET_TYPE, 0); } static void diff --git a/sys/d3d11/plugin.c b/sys/d3d11/plugin.c index 1ccdce2..d55d6c9 100644 --- a/sys/d3d11/plugin.c +++ b/sys/d3d11/plugin.c @@ -67,6 +67,12 @@ plugin_init (GstPlugin * plugin) GstD3D11Device *device = NULL; GstRank video_sink_rank = GST_RANK_NONE; + /** + * plugin-gstd3d11: + * + * Since: 1.18 + */ + GST_DEBUG_CATEGORY_INIT (gst_d3d11_debug, "d3d11", 0, "direct3d 11 plugin"); GST_DEBUG_CATEGORY_INIT (gst_d3d11_shader_debug, "d3d11shader", 0, "d3d11shader"); diff --git a/sys/mediafoundation/gstmfaudioenc.cpp b/sys/mediafoundation/gstmfaudioenc.cpp index dcff6d5..4015642 100644 --- a/sys/mediafoundation/gstmfaudioenc.cpp +++ b/sys/mediafoundation/gstmfaudioenc.cpp @@ -58,6 +58,8 @@ gst_mf_audio_enc_class_init (GstMFAudioEncClass * klass) GST_DEBUG_FUNCPTR (gst_mf_audio_enc_handle_frame); audioenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_audio_enc_flush); + + gst_type_mark_as_plugin_api (GST_TYPE_MF_AUDIO_ENC, (GstPluginAPIFlags) 0); } static void diff --git a/sys/mediafoundation/gstmfh264enc.cpp b/sys/mediafoundation/gstmfh264enc.cpp index 9baae91..303a353 100644 --- a/sys/mediafoundation/gstmfh264enc.cpp +++ b/sys/mediafoundation/gstmfh264enc.cpp @@ -258,6 +258,7 @@ typedef struct guint32 enum_flags; guint device_index; GstMFH264EncDeviceCaps device_caps; + gboolean is_default; } GstMFH264EncClassData; static GstElementClass *parent_class = NULL; @@ -296,10 +297,16 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data) if (device_caps->rc_mode) { g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", - "Rate Control Mode " - "(Exposed only if supported by device)", + "Rate Control Mode", GST_TYPE_MF_H264_ENC_RC_MODE, DEFAULT_RC_MODE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_H264_ENC_RC_MODE, + (GstPluginAPIFlags) 0); + } } /* quality and qp has the identical meaning but scale is different @@ -307,181 +314,191 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data) if (device_caps->quality && !device_caps->qp) { g_object_class_install_property (gobject_class, PROP_QUALITY, g_param_spec_uint ("quality", "Quality", - "Quality applied when rc-mode is qvbr " - "(Exposed only if supported by device)", + "Quality applied when rc-mode is qvbr", 1, 100, DEFAULT_QUALITY_LEVEL, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->adaptive_mode) { g_object_class_install_property (gobject_class, PROP_ADAPTIVE_MODE, g_param_spec_enum ("adaptive-mode", "Adaptive Mode", - "Adaptive Mode (Exposed only if supported by device)", - GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE, DEFAULT_ADAPTIVE_MODE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "Adaptive Mode", GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE, + DEFAULT_ADAPTIVE_MODE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE, + (GstPluginAPIFlags) 0); + } } if (device_caps->buffer_size) { g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE, g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", - "VBV(HRD) Buffer Size in bytes (0 = MFT default) " - "(Exposed only if supported by device)", 0, G_MAXUINT - 1, - DEFAULT_BUFFER_SIZE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "VBV(HRD) Buffer Size in bytes (0 = MFT default)", + 0, G_MAXUINT - 1, DEFAULT_BUFFER_SIZE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_bitrate) { g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", - "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec " - "(0 = MFT default) (Exposed only if supported by device)", 0, - (G_MAXUINT >> 10), - DEFAULT_MAX_BITRATE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec", + 0, (G_MAXUINT >> 10), DEFAULT_MAX_BITRATE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->quality_vs_speed) { g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, [0, 33]: Low complexity, " - "[34, 66]: Medium complexity, [67, 100]: High complexity " - "(Exposed only if supported by device)", 0, 100, + "[34, 66]: Medium complexity, [67, 100]: High complexity", 0, 100, DEFAULT_QUALITY_VS_SPEED, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->cabac) { g_object_class_install_property (gobject_class, PROP_CABAC, g_param_spec_boolean ("cabac", "Use CABAC", - "Enable CABAC entropy coding " - "(Exposed only if supported by device)", + "Enable CABAC entropy coding", DEFAULT_CABAC, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->sps_id) { g_object_class_install_property (gobject_class, PROP_SPS_ID, g_param_spec_uint ("sps-id", "SPS Id", - "The SPS id to use " - "(Exposed only if supported by device)", 0, 31, + "The SPS id to use", 0, 31, DEFAULT_SPS_ID, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->pps_id) { g_object_class_install_property (gobject_class, PROP_PPS_ID, g_param_spec_uint ("pps-id", "PPS Id", - "The PPS id to use " - "(Exposed only if supported by device)", 0, 255, + "The PPS id to use", 0, 255, DEFAULT_PPS_ID, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->bframes) { g_object_class_install_property (gobject_class, PROP_BFRAMES, g_param_spec_uint ("bframes", "bframes", - "The maximum number of consecutive B frames, " - "(Exposed only if supported by device)", 0, 2, + "The maximum number of consecutive B frames", 0, 2, DEFAULT_BFRAMES, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->gop_size) { g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_uint ("gop-size", "GOP size", "The number of pictures from one GOP header to the next, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, G_MAXUINT - 1, - DEFAULT_GOP_SIZE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "(0 = MFT default)", 0, G_MAXUINT - 1, DEFAULT_GOP_SIZE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->threads) { g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", - "The number of worker threads used by a encoder, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, 16, - DEFAULT_THREADS, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The number of worker threads used by a encoder, (0 = MFT default)", + 0, 16, DEFAULT_THREADS, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->content_type) { g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", - "Indicates the type of video content " - "(Exposed only if supported by device)", + "Indicates the type of video content", GST_TYPE_MF_H264_ENC_CONTENT_TYPE, DEFAULT_CONTENT_TYPE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_H264_ENC_CONTENT_TYPE, + (GstPluginAPIFlags) 0); + } } if (device_caps->qp) { g_object_class_install_property (gobject_class, PROP_QP, g_param_spec_uint ("qp", "qp", - "QP applied when rc-mode is \"qvbr\" " - "(Exposed only if supported by device)", 16, 51, + "QP applied when rc-mode is \"qvbr\"", 16, 51, DEFAULT_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->low_latency) { g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", - "Enable low latency encoding " - "(Exposed only if supported by device)", + "Enable low latency encoding", DEFAULT_LOW_LATENCY, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->min_qp) { g_object_class_install_property (gobject_class, PROP_MIN_QP, g_param_spec_uint ("min-qp", "Min QP", - "The minimum allowed QP applied to all rc-mode " - "(Exposed only if supported by device)", 0, 51, + "The minimum allowed QP applied to all rc-mode", 0, 51, DEFAULT_MIN_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_qp) { g_object_class_install_property (gobject_class, PROP_MAX_QP, g_param_spec_uint ("max-qp", "Max QP", - "The maximum allowed QP applied to all rc-mode " - "(Exposed only if supported by device)", 0, 51, + "The maximum allowed QP applied to all rc-mode", 0, 51, DEFAULT_MAX_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->frame_type_qp) { g_object_class_install_property (gobject_class, PROP_QP_I, g_param_spec_uint ("qp-i", "QP I", - "QP applied to I frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to I frames", 0, 51, DEFAULT_QP_I, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_QP_P, g_param_spec_uint ("qp-p", "QP P", - "QP applied to P frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to P frames", 0, 51, DEFAULT_QP_P, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_QP_B, g_param_spec_uint ("qp-b", "QP B", - "QP applied to B frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to B frames", 0, 51, DEFAULT_QP_B, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_num_ref) { g_object_class_install_property (gobject_class, PROP_REF, g_param_spec_uint ("ref", "Reference Frames", - "The number of reference frames " - "(Exposed only if supported by device)", + "The number of reference frames", device_caps->max_num_ref_low, device_caps->max_num_ref_high, DEFAULT_REF, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } long_name = g_strdup_printf ("Media Foundation %s", cdata->device_name); @@ -1039,6 +1056,8 @@ gst_mf_h264_enc_register (GstPlugin * plugin, guint rank, i++; } + cdata->is_default = is_default; + type = g_type_register_static (GST_TYPE_MF_VIDEO_ENC, type_name, &type_info, (GTypeFlags) 0); diff --git a/sys/mediafoundation/gstmfh265enc.cpp b/sys/mediafoundation/gstmfh265enc.cpp index e114b6a..390acc0 100644 --- a/sys/mediafoundation/gstmfh265enc.cpp +++ b/sys/mediafoundation/gstmfh265enc.cpp @@ -201,6 +201,7 @@ typedef struct guint32 enum_flags; guint device_index; GstMFH265EncDeviceCaps device_caps; + gboolean is_default; } GstMFH265EncClassData; static GstElementClass *parent_class = NULL; @@ -239,146 +240,153 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data) if (device_caps->rc_mode) { g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", - "Rate Control Mode " - "(Exposed only if supported by device)", + "Rate Control Mode", GST_TYPE_MF_H265_ENC_RC_MODE, DEFAULT_RC_MODE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_H265_ENC_RC_MODE, + (GstPluginAPIFlags) 0); + } } if (device_caps->buffer_size) { g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE, g_param_spec_uint ("vbv-buffer-size", "VBV Buffer Size", - "VBV(HRD) Buffer Size in bytes (0 = MFT default) " - "(Exposed only if supported by device)", 0, G_MAXUINT - 1, - DEFAULT_BUFFER_SIZE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "VBV(HRD) Buffer Size in bytes (0 = MFT default)", + 0, G_MAXUINT - 1, DEFAULT_BUFFER_SIZE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_bitrate) { g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec " - "(0 = MFT default) (Exposed only if supported by device)", 0, - (G_MAXUINT >> 10), - DEFAULT_MAX_BITRATE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "(0 = MFT default)", 0, (G_MAXUINT >> 10), DEFAULT_MAX_BITRATE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->quality_vs_speed) { g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, [0, 33]: Low complexity, " - "[34, 66]: Medium complexity, [67, 100]: High complexity " - "(Exposed only if supported by device)", 0, 100, - DEFAULT_QUALITY_VS_SPEED, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "[34, 66]: Medium complexity, [67, 100]: High complexity", + 0, 100, DEFAULT_QUALITY_VS_SPEED, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->bframes) { g_object_class_install_property (gobject_class, PROP_BFRAMES, g_param_spec_uint ("bframes", "bframes", - "The maximum number of consecutive B frames, " - "(Exposed only if supported by device)", 0, 2, - DEFAULT_BFRAMES, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The maximum number of consecutive B frames", + 0, 2, DEFAULT_BFRAMES, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->gop_size) { g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_uint ("gop-size", "GOP size", "The number of pictures from one GOP header to the next, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, G_MAXUINT - 1, - DEFAULT_GOP_SIZE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "(0 = MFT default)", 0, G_MAXUINT - 1, DEFAULT_GOP_SIZE, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->threads) { g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", - "The number of worker threads used by a encoder, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, 16, - DEFAULT_THREADS, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The number of worker threads used by a encoder, (0 = MFT default)", + 0, 16, DEFAULT_THREADS, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->content_type) { g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", - "Indicates the type of video content " - "(Exposed only if supported by device)", + "Indicates the type of video content", GST_TYPE_MF_H265_ENC_CONTENT_TYPE, DEFAULT_CONTENT_TYPE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_H265_ENC_CONTENT_TYPE, + (GstPluginAPIFlags) 0); + } } if (device_caps->qp) { g_object_class_install_property (gobject_class, PROP_QP, g_param_spec_uint ("qp", "qp", - "QP applied when rc-mode is \"qvbr\" " - "(Exposed only if supported by device)", 16, 51, - DEFAULT_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "QP applied when rc-mode is \"qvbr\"", 16, 51, DEFAULT_QP, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->low_latency) { g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", - "Enable low latency encoding " - "(Exposed only if supported by device)", - DEFAULT_LOW_LATENCY, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "Enable low latency encoding", DEFAULT_LOW_LATENCY, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->min_qp) { g_object_class_install_property (gobject_class, PROP_MIN_QP, g_param_spec_uint ("min-qp", "Min QP", - "The minimum allowed QP applied to all rc-mode " - "(Exposed only if supported by device)", 0, 51, - DEFAULT_MIN_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The minimum allowed QP applied to all rc-mode", + 0, 51, DEFAULT_MIN_QP, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_qp) { g_object_class_install_property (gobject_class, PROP_MAX_QP, g_param_spec_uint ("max-qp", "Max QP", - "The maximum allowed QP applied to all rc-mode " - "(Exposed only if supported by device)", 0, 51, - DEFAULT_MAX_QP, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + "The maximum allowed QP applied to all rc-mode", + 0, 51, DEFAULT_MAX_QP, + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->frame_type_qp) { g_object_class_install_property (gobject_class, PROP_QP_I, g_param_spec_uint ("qp-i", "QP I", - "QP applied to I frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to I frames", 0, 51, DEFAULT_QP_I, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_QP_P, g_param_spec_uint ("qp-p", "QP P", - "QP applied to P frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to P frames", 0, 51, DEFAULT_QP_P, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_QP_B, g_param_spec_uint ("qp-b", "QP B", - "QP applied to B frames " - "(Exposed only if supported by device)", 0, 51, + "QP applied to B frames", 0, 51, DEFAULT_QP_B, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->max_num_ref) { g_object_class_install_property (gobject_class, PROP_REF, g_param_spec_uint ("ref", "Reference Frames", - "The number of reference frames " - "(Exposed only if supported by device)", + "The number of reference frames", device_caps->max_num_ref_low, device_caps->max_num_ref_high, DEFAULT_REF, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } long_name = g_strdup_printf ("Media Foundation %s", cdata->device_name); @@ -809,6 +817,8 @@ gst_mf_h265_enc_register (GstPlugin * plugin, guint rank, i++; } + cdata->is_default = is_default; + type = g_type_register_static (GST_TYPE_MF_VIDEO_ENC, type_name, &type_info, (GTypeFlags) 0); diff --git a/sys/mediafoundation/gstmfvideoenc.cpp b/sys/mediafoundation/gstmfvideoenc.cpp index 4931fab..c317ba0 100644 --- a/sys/mediafoundation/gstmfvideoenc.cpp +++ b/sys/mediafoundation/gstmfvideoenc.cpp @@ -58,6 +58,8 @@ gst_mf_video_enc_class_init (GstMFVideoEncClass * klass) GST_DEBUG_FUNCPTR (gst_mf_video_enc_handle_frame); videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_mf_video_enc_finish); videoenc_class->flush = GST_DEBUG_FUNCPTR (gst_mf_video_enc_flush); + + gst_type_mark_as_plugin_api (GST_TYPE_MF_VIDEO_ENC, (GstPluginAPIFlags) 0); } static void diff --git a/sys/mediafoundation/gstmfvp9enc.cpp b/sys/mediafoundation/gstmfvp9enc.cpp index 57fa69c..a3634e9 100644 --- a/sys/mediafoundation/gstmfvp9enc.cpp +++ b/sys/mediafoundation/gstmfvp9enc.cpp @@ -163,6 +163,7 @@ typedef struct guint32 enum_flags; guint device_index; GstMFVP9EncDeviceCaps device_caps; + gboolean is_default; } GstMFVP9EncClassData; static GstElementClass *parent_class = NULL; @@ -201,68 +202,80 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data) if (device_caps->rc_mode) { g_object_class_install_property (gobject_class, PROP_RC_MODE, g_param_spec_enum ("rc-mode", "Rate Control Mode", - "Rate Control Mode " - "(Exposed only if supported by device)", + "Rate Control Mode", GST_TYPE_MF_VP9_ENC_RC_MODE, DEFAULT_RC_MODE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_VP9_ENC_RC_MODE, + (GstPluginAPIFlags) 0); + } } if (device_caps->max_bitrate) { g_object_class_install_property (gobject_class, PROP_MAX_BITRATE, g_param_spec_uint ("max-bitrate", "Max Bitrate", "The maximum bitrate applied when rc-mode is \"pcvbr\" in kbit/sec " - "(0 = MFT default) (Exposed only if supported by device)", 0, - (G_MAXUINT >> 10), + "(0 = MFT default)", 0, (G_MAXUINT >> 10), DEFAULT_MAX_BITRATE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->quality_vs_speed) { g_object_class_install_property (gobject_class, PROP_QUALITY_VS_SPEED, g_param_spec_uint ("quality-vs-speed", "Quality Vs Speed", "Quality and speed tradeoff, [0, 33]: Low complexity, " - "[34, 66]: Medium complexity, [67, 100]: High complexity " - "(Exposed only if supported by device)", 0, 100, + "[34, 66]: Medium complexity, [67, 100]: High complexity", 0, 100, DEFAULT_QUALITY_VS_SPEED, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->gop_size) { g_object_class_install_property (gobject_class, PROP_GOP_SIZE, g_param_spec_uint ("gop-size", "GOP size", "The number of pictures from one GOP header to the next, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, G_MAXUINT - 1, + "(0 = MFT default)", 0, G_MAXUINT - 1, DEFAULT_GOP_SIZE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->threads) { g_object_class_install_property (gobject_class, PROP_THREADS, g_param_spec_uint ("threads", "Threads", "The number of worker threads used by a encoder, " - "(0 = MFT default) " - "(Exposed only if supported by device)", 0, 16, + "(0 = MFT default)", 0, 16, DEFAULT_THREADS, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } if (device_caps->content_type) { g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE, g_param_spec_enum ("content-type", "Content Type", - "Indicates the type of video content " - "(Exposed only if supported by device)", + "Indicates the type of video content", GST_TYPE_MF_VP9_ENC_CONTENT_TYPE, DEFAULT_CONTENT_TYPE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + /* NOTE: documentation will be done by only for default device */ + if (cdata->is_default) { + gst_type_mark_as_plugin_api (GST_TYPE_MF_VP9_ENC_CONTENT_TYPE, + (GstPluginAPIFlags) 0); + } } if (device_caps->low_latency) { g_object_class_install_property (gobject_class, PROP_LOW_LATENCY, g_param_spec_boolean ("low-latency", "Low Latency", - "Enable low latency encoding " - "(Exposed only if supported by device)", + "Enable low latency encoding", DEFAULT_LOW_LATENCY, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + (GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } long_name = g_strdup_printf ("Media Foundation %s", cdata->device_name); @@ -572,6 +585,8 @@ gst_mf_vp9_enc_register (GstPlugin * plugin, guint rank, i++; } + cdata->is_default = is_default; + type = g_type_register_static (GST_TYPE_MF_VIDEO_ENC, type_name, &type_info, (GTypeFlags) 0); diff --git a/sys/mediafoundation/plugin.c b/sys/mediafoundation/plugin.c index 83f12ad..48a3859 100644 --- a/sys/mediafoundation/plugin.c +++ b/sys/mediafoundation/plugin.c @@ -49,6 +49,12 @@ plugin_init (GstPlugin * plugin) HRESULT hr; GstRank rank = GST_RANK_SECONDARY; + /** + * plugin-gstmediafoundation: + * + * Since: 1.18 + */ + GST_DEBUG_CATEGORY_INIT (gst_mf_debug, "mf", 0, "media foundation"); GST_DEBUG_CATEGORY_INIT (gst_mf_utils_debug, "mfutils", 0, "media foundation utility functions"); diff --git a/sys/wasapi/gstwasapisink.c b/sys/wasapi/gstwasapisink.c index 1188435..f631398 100644 --- a/sys/wasapi/gstwasapisink.c +++ b/sys/wasapi/gstwasapisink.c @@ -164,6 +164,8 @@ gst_wasapi_sink_class_init (GstWasapiSinkClass * klass) GST_DEBUG_CATEGORY_INIT (gst_wasapi_sink_debug, "wasapisink", 0, "Windows audio session API sink"); + + gst_type_mark_as_plugin_api (GST_WASAPI_DEVICE_TYPE_ROLE, 0); } static void diff --git a/sys/wasapi/gstwasapisrc.c b/sys/wasapi/gstwasapisrc.c index 411c9f5..92fd789 100644 --- a/sys/wasapi/gstwasapisrc.c +++ b/sys/wasapi/gstwasapisrc.c @@ -168,6 +168,8 @@ gst_wasapi_src_class_init (GstWasapiSrcClass * klass) GST_DEBUG_CATEGORY_INIT (gst_wasapi_src_debug, "wasapisrc", 0, "Windows audio session API source"); + + gst_type_mark_as_plugin_api (GST_WASAPI_DEVICE_TYPE_ROLE, 0); } static void diff --git a/sys/wasapi2/plugin.c b/sys/wasapi2/plugin.c index b87785c..5c49a5d 100644 --- a/sys/wasapi2/plugin.c +++ b/sys/wasapi2/plugin.c @@ -35,6 +35,12 @@ plugin_init (GstPlugin * plugin) { GstRank rank = GST_RANK_SECONDARY; + /** + * plugin-gstwasapi2: + * + * Since: 1.18 + */ + #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) /* If we are building for UWP, wasapi2 plugin should have the highest rank */ rank = GST_RANK_PRIMARY + 1; diff --git a/sys/winscreencap/gstdxgiscreencapsrc.c b/sys/winscreencap/gstdxgiscreencapsrc.c index 2ed902a..df360b4 100644 --- a/sys/winscreencap/gstdxgiscreencapsrc.c +++ b/sys/winscreencap/gstdxgiscreencapsrc.c @@ -576,6 +576,11 @@ gst_dxgi_screen_cap_src_register (GstPlugin * plugin, GstRank rank) return; } + /** + * element-dxgiscreencapsrc: + * + * Since: 1.18 + */ gst_element_register (plugin, "dxgiscreencapsrc", rank, GST_TYPE_DXGI_SCREEN_CAP_SRC); } -- 2.7.4