mediafoundation: Update for documentation

* Use GST_PARAM_DOC_SHOW_DEFAULT flags for GPU ID related
  properties
* Add doc caps
* Add since markers

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3250>
This commit is contained in:
Seungha Yang 2022-10-22 02:59:13 +09:00 committed by GStreamer Marge Bot
parent 9d926ae8b1
commit 7ce3fccf25
7 changed files with 367 additions and 26 deletions

View file

@ -11256,7 +11256,6 @@
"GstMFAacEnc!sink",
"GstMFAacEnc!src",
"GstMFAacEnc:bitrate",
"GstMFAudioEnc",
"GstMFH264Enc",
"GstMFH264Enc!sink",
"GstMFH264Enc!src",
@ -11312,7 +11311,6 @@
"GstMFVP9EncRCMode",
"GstMFVP9EncRCMode::cbr",
"GstMFVP9EncRCMode::qvbr",
"GstMFVideoEnc",
"GstMFVideoSrc",
"GstMFVideoSrc!src",
"GstMFVideoSrc:device-index",

View file

@ -33,6 +33,13 @@ using namespace Microsoft::WRL;
GST_DEBUG_CATEGORY (gst_mf_audio_decoder_debug);
#define GST_CAT_DEFAULT gst_mf_audio_decoder_debug
/**
* GstMFAudioDecoder:
*
* Base class for MediaFoundation audio decoders
*
* Since: 1.22
*/
#define gst_mf_audio_decoder_parent_class parent_class
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstMFAudioDecoder, gst_mf_audio_decoder,
GST_TYPE_AUDIO_DECODER,

View file

@ -33,6 +33,13 @@ using namespace Microsoft::WRL;
GST_DEBUG_CATEGORY (gst_mf_audio_encoder_debug);
#define GST_CAT_DEFAULT gst_mf_audio_encoder_debug
/**
* GstMFAudioEncoder:
*
* Base class for MediaFoundation audio encoders
*
* Since: 1.22
*/
#define gst_mf_audio_encoder_parent_class parent_class
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstMFAudioEncoder, gst_mf_audio_encoder,
GST_TYPE_AUDIO_ENCODER,

View file

@ -62,6 +62,11 @@ enum
GST_MF_H264_ENC_RC_MODE_QUALITY,
};
/**
* GstMFH264EncRCMode:
*
* Since: 1.18
*/
#define GST_TYPE_MF_H264_ENC_RC_MODE (gst_mf_h264_enc_rc_mode_get_type())
static GType
gst_mf_h264_enc_rc_mode_get_type (void)
@ -90,6 +95,11 @@ enum
GST_MF_H264_ENC_ADAPTIVE_MODE_FRAMERATE,
};
/**
* GstMFH264EncAdaptiveMode:
*
* Since: 1.18
*/
#define GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE (gst_mf_h264_enc_adaptive_mode_get_type())
static GType
gst_mf_h264_enc_adaptive_mode_get_type (void)
@ -117,6 +127,11 @@ enum
GST_MF_H264_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE,
};
/**
* GstMFH264EncContentType:
*
* Since: 1.18
*/
#define GST_TYPE_MF_H264_ENC_CONTENT_TYPE (gst_mf_h264_enc_content_type_get_type())
static GType
gst_mf_h264_enc_content_type_get_type (void)
@ -189,6 +204,19 @@ enum
#define DEFAULT_QP_B 26
#define DEFAULT_REF 2
#define DOC_SINK_CAPS_COMM \
"format = (string) NV12, " \
"width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ]"
#define DOC_SINK_CAPS \
"video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \
"video/x-raw, " DOC_SINK_CAPS_COMM
#define DOC_SRC_CAPS \
"video/x-h264, width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ], " \
"stream-format = (string) byte-stream, alignment = (string) au, " \
"profile = (string) { high, main, constrained-baseline, baseline }"
typedef struct _GstMFH264Enc
{
GstMFVideoEncoder parent;
@ -253,6 +281,8 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps;
gchar *long_name;
gchar *classification;
GstPadTemplate *pad_templ;
GstCaps *doc_caps;
parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
@ -266,6 +296,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
if (device_caps->rc_mode) {
/**
* GstMFH264Enc:rc-mode:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_RC_MODE,
g_param_spec_enum ("rc-mode", "Rate Control Mode",
"Rate Control Mode",
@ -283,6 +318,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
/* quality and qp has the identical meaning but scale is different
* use qp if available */
if (device_caps->quality && !device_caps->qp) {
/**
* GstMFH264Enc:quality:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QUALITY,
g_param_spec_uint ("quality", "Quality",
"Quality applied when rc-mode is qvbr",
@ -292,6 +332,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->adaptive_mode) {
/**
* GstMFH264Enc:adaptive-mode:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_ADAPTIVE_MODE,
g_param_spec_enum ("adaptive-mode", "Adaptive Mode",
"Adaptive Mode", GST_TYPE_MF_H264_ENC_ADAPTIVE_MODE,
@ -307,6 +352,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->buffer_size) {
/**
* GstMFH264Enc:vbv-buffer-size:
*
* Since: 1.18
*/
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)",
@ -316,6 +366,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->max_bitrate) {
/**
* GstMFH264Enc:max-bitrate:
*
* Since: 1.18
*/
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",
@ -325,6 +380,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->quality_vs_speed) {
/**
* GstMFH264Enc:quality-vs-speed:
*
* Since: 1.18
*/
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, "
@ -335,6 +395,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->cabac) {
/**
* GstMFH264Enc:cabac:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_CABAC,
g_param_spec_boolean ("cabac", "Use CABAC",
"Enable CABAC entropy coding",
@ -344,6 +409,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->sps_id) {
/**
* GstMFH264Enc:sps-id:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_SPS_ID,
g_param_spec_uint ("sps-id", "SPS Id",
"The SPS id to use", 0, 31,
@ -353,6 +423,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->pps_id) {
/**
* GstMFH264Enc:pps-id:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_PPS_ID,
g_param_spec_uint ("pps-id", "PPS Id",
"The PPS id to use", 0, 255,
@ -362,6 +437,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->bframes) {
/**
* GstMFH264Enc:bframes:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_BFRAMES,
g_param_spec_uint ("bframes", "bframes",
"The maximum number of consecutive B frames", 0, 2,
@ -371,6 +451,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->gop_size) {
/**
* GstMFH264Enc:gop-size:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_GOP_SIZE,
g_param_spec_int ("gop-size", "GOP size",
"The number of pictures from one GOP header to the next. "
@ -382,6 +467,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->threads) {
/**
* GstMFH264Enc:threads:
*
* Since: 1.18
*/
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)",
@ -391,6 +481,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->content_type) {
/**
* GstMFH264Enc:content-type:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE,
g_param_spec_enum ("content-type", "Content Type",
"Indicates the type of video content",
@ -406,6 +501,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->qp) {
/**
* GstMFH264Enc:qp:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP,
g_param_spec_uint ("qp", "qp",
"QP applied when rc-mode is \"qvbr\"", 16, 51,
@ -415,6 +515,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->low_latency) {
/**
* GstMFH264Enc:low-latency:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_LOW_LATENCY,
g_param_spec_boolean ("low-latency", "Low Latency",
"Enable low latency encoding",
@ -424,6 +529,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->min_qp) {
/**
* GstMFH264Enc:min-qp:
*
* Since: 1.18
*/
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", 0, 51,
@ -433,6 +543,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->max_qp) {
/**
* GstMFH264Enc:max-qp:
*
* Since: 1.18
*/
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", 0, 51,
@ -442,6 +557,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->frame_type_qp) {
/**
* GstMFH264Enc:qp-i:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_I,
g_param_spec_uint ("qp-i", "QP I",
"QP applied to I frames", 0, 51,
@ -449,6 +569,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstMFH264Enc:qp-p:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_P,
g_param_spec_uint ("qp-p", "QP P",
"QP applied to P frames", 0, 51,
@ -456,6 +581,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstMFH264Enc:qp-b:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_B,
g_param_spec_uint ("qp-b", "QP B",
"QP applied to B frames", 0, 51,
@ -465,6 +595,11 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
}
if (device_caps->max_num_ref) {
/**
* GstMFH264Enc:ref:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_REF,
g_param_spec_uint ("ref", "Reference Frames",
"The number of reference frames",
@ -498,8 +633,9 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
g_param_spec_int64 ("adapter-luid", "Adapter LUID",
"DXGI Adapter LUID (Locally Unique Identifier) of created device",
G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_MININT64, G_MAXINT64, 0,
(GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT |
GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
@ -514,12 +650,19 @@ gst_mf_h264_enc_class_init (GstMFH264EncClass * klass, gpointer data)
g_free (long_name);
g_free (classification);
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));
pad_templ = gst_pad_template_new ("sink",
GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps);
doc_caps = gst_caps_from_string (DOC_SINK_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
pad_templ = gst_pad_template_new ("src",
GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps);
doc_caps = gst_caps_from_string (DOC_SRC_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
mfenc_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_h264_enc_set_option);
mfenc_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_h264_enc_set_src_caps);

View file

@ -53,6 +53,11 @@ enum
GST_MF_H265_ENC_RC_MODE_QUALITY,
};
/**
* GstMFH265EncRCMode:
*
* Since: 1.18
*/
#define GST_TYPE_MF_H265_ENC_RC_MODE (gst_mf_h265_enc_rc_mode_get_type())
static GType
gst_mf_h265_enc_rc_mode_get_type (void)
@ -77,6 +82,11 @@ enum
GST_MF_H265_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE,
};
/**
* GstMFH265EncContentType:
*
* Since: 1.18
*/
#define GST_TYPE_MF_H265_ENC_CONTENT_TYPE (gst_mf_h265_enc_content_type_get_type())
static GType
gst_mf_h265_enc_content_type_get_type (void)
@ -140,6 +150,19 @@ enum
#define DEFAULT_QP_B 26
#define DEFAULT_REF 2
#define DOC_SINK_CAPS_COMM \
"format = (string) { NV12, P010_10LE }, " \
"width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ]"
#define DOC_SINK_CAPS \
"video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \
"video/x-raw, " DOC_SINK_CAPS_COMM
#define DOC_SRC_CAPS \
"video/x-h265, width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ], " \
"stream-format = (string) byte-stream, alignment = (string) au, " \
"profile = (string) { main, main-10 }"
typedef struct _GstMFH265Enc
{
GstMFVideoEncoder parent;
@ -198,6 +221,8 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps;
gchar *long_name;
gchar *classification;
GstPadTemplate *pad_templ;
GstCaps *doc_caps;
parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
@ -211,6 +236,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
if (device_caps->rc_mode) {
/**
* GstMFH264Enc:rc-mode:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_RC_MODE,
g_param_spec_enum ("rc-mode", "Rate Control Mode",
"Rate Control Mode",
@ -226,6 +256,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->buffer_size) {
/**
* GstMFH264Enc:vbv-buffer-size:
*
* Since: 1.18
*/
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)",
@ -235,6 +270,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->max_bitrate) {
/**
* GstMFH264Enc:max-bitrate:
*
* Since: 1.18
*/
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 "
@ -244,6 +284,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->quality_vs_speed) {
/**
* GstMFH264Enc:quality-vs-speed:
*
* Since: 1.18
*/
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, "
@ -254,6 +299,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->bframes) {
/**
* GstMFH264Enc:bframes:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_BFRAMES,
g_param_spec_uint ("bframes", "bframes",
"The maximum number of consecutive B frames",
@ -263,6 +313,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->gop_size) {
/**
* GstMFH264Enc:gop-size:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_GOP_SIZE,
g_param_spec_int ("gop-size", "GOP size",
"The number of pictures from one GOP header to the next. "
@ -274,6 +329,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->threads) {
/**
* GstMFH264Enc:threads:
*
* Since: 1.18
*/
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)",
@ -283,6 +343,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->content_type) {
/**
* GstMFH264Enc:content-type:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE,
g_param_spec_enum ("content-type", "Content Type",
"Indicates the type of video content",
@ -298,6 +363,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->qp) {
/**
* GstMFH264Enc:qp:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP,
g_param_spec_uint ("qp", "qp",
"QP applied when rc-mode is \"qvbr\"", 16, 51, DEFAULT_QP,
@ -306,6 +376,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->low_latency) {
/**
* GstMFH264Enc:low-latency:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_LOW_LATENCY,
g_param_spec_boolean ("low-latency", "Low Latency",
"Enable low latency encoding", DEFAULT_LOW_LATENCY,
@ -314,6 +389,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->min_qp) {
/**
* GstMFH265Enc:min-qp:
*
* Since: 1.18
*/
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",
@ -323,6 +403,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->max_qp) {
/**
* GstMFH265Enc:max-qp:
*
* Since: 1.18
*/
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",
@ -332,6 +417,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->frame_type_qp) {
/**
* GstMFH265Enc:qp-i:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_I,
g_param_spec_uint ("qp-i", "QP I",
"QP applied to I frames", 0, 51,
@ -339,6 +429,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstMFH265Enc:qp-p:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_P,
g_param_spec_uint ("qp-p", "QP P",
"QP applied to P frames", 0, 51,
@ -346,6 +441,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstMFH265Enc:qp-b:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_QP_B,
g_param_spec_uint ("qp-b", "QP B",
"QP applied to B frames", 0, 51,
@ -355,6 +455,11 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
}
if (device_caps->max_num_ref) {
/**
* GstMFH265Enc:ref:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_REF,
g_param_spec_uint ("ref", "Reference Frames",
"The number of reference frames",
@ -388,8 +493,9 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
g_param_spec_int64 ("adapter-luid", "Adapter LUID",
"DXGI Adapter LUID (Locally Unique Identifier) of created device",
G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_MININT64, G_MAXINT64, 0,
(GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT |
GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
@ -404,12 +510,19 @@ gst_mf_h265_enc_class_init (GstMFH265EncClass * klass, gpointer data)
g_free (long_name);
g_free (classification);
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));
pad_templ = gst_pad_template_new ("sink",
GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps);
doc_caps = gst_caps_from_string (DOC_SINK_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
pad_templ = gst_pad_template_new ("src",
GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps);
doc_caps = gst_caps_from_string (DOC_SRC_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
encoder_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_h265_enc_set_option);
encoder_class->set_src_caps =

View file

@ -41,6 +41,13 @@ using namespace Microsoft::WRL;
GST_DEBUG_CATEGORY_EXTERN (gst_mf_video_encoder_debug);
#define GST_CAT_DEFAULT gst_mf_video_encoder_debug
/**
* GstMFVideoEncoder:
*
* Base class for MediaFoundation video encoders
*
* Since: 1.22
*/
#define gst_mf_video_encoder_parent_class parent_class
G_DEFINE_ABSTRACT_TYPE (GstMFVideoEncoder, gst_mf_video_encoder,
GST_TYPE_VIDEO_ENCODER);

View file

@ -52,6 +52,11 @@ enum
GST_MF_VP9_ENC_RC_MODE_QUALITY,
};
/**
* GstMFVP9EncRCMode:
*
* Since: 1.22
*/
#define GST_TYPE_MF_VP9_ENC_RC_MODE (gst_mf_vp9_enc_rc_mode_get_type())
static GType
gst_mf_vp9_enc_rc_mode_get_type (void)
@ -76,6 +81,11 @@ enum
GST_MF_VP9_ENC_CONTENT_TYPE_FIXED_CAMERA_ANGLE,
};
/**
* GstMFVP9EncContentType:
*
* Since: 1.22
*/
#define GST_TYPE_MF_VP9_ENC_CONTENT_TYPE (gst_mf_vp9_enc_content_type_get_type())
static GType
gst_mf_vp9_enc_content_type_get_type (void)
@ -120,6 +130,17 @@ enum
#define DEFAULT_CONTENT_TYPE GST_MF_VP9_ENC_CONTENT_TYPE_UNKNOWN
#define DEFAULT_LOW_LATENCY FALSE
#define DOC_SINK_CAPS_COMM \
"format = (string) NV12, " \
"width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ]"
#define DOC_SINK_CAPS \
"video/x-raw(memory:D3D11Memory), " DOC_SINK_CAPS_COMM "; " \
"video/x-raw, " DOC_SINK_CAPS_COMM
#define DOC_SRC_CAPS \
"video/x-vp9, width = (int) [ 64, 8192 ], height = (int) [ 64, 8192 ]"
typedef struct _GstMFVP9Enc
{
GstMFVideoEncoder parent;
@ -169,6 +190,8 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
GstMFVideoEncoderDeviceCaps *device_caps = &cdata->device_caps;
gchar *long_name;
gchar *classification;
GstPadTemplate *pad_templ;
GstCaps *doc_caps;
parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
@ -182,6 +205,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
if (device_caps->rc_mode) {
/**
* GstMFVP9Enc:rc-mode:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_RC_MODE,
g_param_spec_enum ("rc-mode", "Rate Control Mode",
"Rate Control Mode",
@ -197,6 +225,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->max_bitrate) {
/**
* GstMFVP9Enc:max-bitrate:
*
* Since: 1.18
*/
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 "
@ -207,6 +240,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->quality_vs_speed) {
/**
* GstMFVP9Enc:quality-vs-speed:
*
* Since: 1.18
*/
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, "
@ -217,6 +255,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->gop_size) {
/**
* GstMFVP9Enc:gop-size:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_GOP_SIZE,
g_param_spec_int ("gop-size", "GOP size",
"The number of pictures from one GOP header to the next. "
@ -228,6 +271,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->threads) {
/**
* GstMFVP9Enc:threads:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_THREADS,
g_param_spec_uint ("threads", "Threads",
"The number of worker threads used by a encoder, "
@ -238,6 +286,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->content_type) {
/**
* GstMFVP9Enc:content-type:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_CONTENT_TYPE,
g_param_spec_enum ("content-type", "Content Type",
"Indicates the type of video content",
@ -253,6 +306,11 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
}
if (device_caps->low_latency) {
/**
* GstMFVP9Enc:low-latency:
*
* Since: 1.18
*/
g_object_class_install_property (gobject_class, PROP_LOW_LATENCY,
g_param_spec_boolean ("low-latency", "Low Latency",
"Enable low latency encoding",
@ -285,8 +343,9 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
g_object_class_install_property (gobject_class, PROP_ADAPTER_LUID,
g_param_spec_int64 ("adapter-luid", "Adapter LUID",
"DXGI Adapter LUID (Locally Unique Identifier) of created device",
G_MININT64, G_MAXINT64, device_caps->adapter_luid,
(GParamFlags) (GST_PARAM_CONDITIONALLY_AVAILABLE |
G_MININT64, G_MAXINT64, 0,
(GParamFlags) (GST_PARAM_DOC_SHOW_DEFAULT |
GST_PARAM_CONDITIONALLY_AVAILABLE |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
}
@ -301,12 +360,19 @@ gst_mf_vp9_enc_class_init (GstMFVP9EncClass * klass, gpointer data)
g_free (long_name);
g_free (classification);
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));
pad_templ = gst_pad_template_new ("sink",
GST_PAD_SINK, GST_PAD_ALWAYS, cdata->sink_caps);
doc_caps = gst_caps_from_string (DOC_SINK_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
pad_templ = gst_pad_template_new ("src",
GST_PAD_SRC, GST_PAD_ALWAYS, cdata->src_caps);
doc_caps = gst_caps_from_string (DOC_SRC_CAPS);
gst_pad_template_set_documentation_caps (pad_templ, doc_caps);
gst_caps_unref (doc_caps);
gst_element_class_add_pad_template (element_class, pad_templ);
encoder_class->set_option = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_option);
encoder_class->set_src_caps = GST_DEBUG_FUNCPTR (gst_mf_vp9_enc_set_src_caps);