mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 16:26:39 +00:00
msdkenc: Enable dynamic capability support
Enable dynamic capability support for msdkav1enc, msdkh264enc, msdkh265enc, msdkmjpegenc, msdkvp9enc, msdkmpeg2enc. The gstmsdkenc elements can create the sink caps and src caps dynamically for different platforms. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4177>
This commit is contained in:
parent
7aa0b29da8
commit
30d3ce3a9e
15 changed files with 589 additions and 271 deletions
|
@ -112,38 +112,40 @@ plugin_add_dependencies (GstPlugin * plugin)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_register_encoder (GstPlugin * plugin, guint codec_id)
|
||||
_register_encoder (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, "msdkh264enc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKH264ENC);
|
||||
ret = gst_msdkh264enc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);
|
||||
break;
|
||||
case MFX_CODEC_HEVC:
|
||||
ret = gst_element_register (plugin, "msdkh265enc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKH265ENC);
|
||||
ret = gst_msdkh265enc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);;
|
||||
break;
|
||||
case MFX_CODEC_MPEG2:
|
||||
ret = gst_element_register (plugin, "msdkmpeg2enc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKMPEG2ENC);
|
||||
ret = gst_msdkmpeg2enc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);
|
||||
break;
|
||||
#ifdef USE_MSDK_VP9_ENC
|
||||
case MFX_CODEC_VP9:
|
||||
ret = gst_element_register (plugin, "msdkvp9enc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKVP9ENC);
|
||||
ret = gst_msdkvp9enc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_MSDK_AV1_ENC
|
||||
case MFX_CODEC_AV1:
|
||||
ret = gst_element_register (plugin, "msdkav1enc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKAV1ENC);
|
||||
ret = gst_msdkav1enc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);
|
||||
break;
|
||||
#endif
|
||||
case MFX_CODEC_JPEG:
|
||||
ret = gst_element_register (plugin, "msdkmjpegenc", GST_RANK_NONE,
|
||||
GST_TYPE_MSDKMJPEGENC);
|
||||
ret = gst_msdkmjpegenc_register (plugin,
|
||||
context, sink_caps, src_caps, GST_RANK_NONE);
|
||||
break;
|
||||
default:
|
||||
ret = FALSE;
|
||||
|
@ -209,11 +211,26 @@ static void
|
|||
_register_encoders (GstPlugin * plugin,
|
||||
GstMsdkContext * context, mfxEncoderDescription * enc_desc)
|
||||
{
|
||||
GstCaps *sink_caps = NULL;
|
||||
GstCaps *src_caps = NULL;
|
||||
|
||||
for (guint c = 0; c < enc_desc->NumCodecs; c++) {
|
||||
if (!_register_encoder (plugin, enc_desc->Codecs[c].CodecID)) {
|
||||
if (!gst_msdkcaps_enc_create_caps (context, enc_desc,
|
||||
enc_desc->Codecs[c].CodecID, &sink_caps, &src_caps)) {
|
||||
GST_WARNING ("Failed to create caps for %" GST_FOURCC_FORMAT " ENC",
|
||||
GST_FOURCC_ARGS (enc_desc->Codecs[c].CodecID));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_register_encoder (plugin,
|
||||
context, enc_desc->Codecs[c].CodecID, sink_caps, src_caps)) {
|
||||
GST_WARNING ("Failed to register %" GST_FOURCC_FORMAT " ENC",
|
||||
GST_FOURCC_ARGS (enc_desc->Codecs[c].CodecID));
|
||||
continue;
|
||||
}
|
||||
|
||||
gst_caps_unref (sink_caps);
|
||||
gst_caps_unref (src_caps);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -269,11 +286,26 @@ static const guint dec_codecs[] = {
|
|||
static void
|
||||
_register_encoders (GstPlugin * plugin, GstMsdkContext * context)
|
||||
{
|
||||
GstCaps *sink_caps = NULL;
|
||||
GstCaps *src_caps = NULL;
|
||||
|
||||
for (guint c = 0; c < G_N_ELEMENTS (enc_codecs); c++) {
|
||||
if (!_register_encoder (plugin, enc_codecs[c])) {
|
||||
if (!gst_msdkcaps_enc_create_caps (context,
|
||||
NULL, enc_codecs[c], &sink_caps, &src_caps)) {
|
||||
GST_WARNING ("Failed to create caps for %" GST_FOURCC_FORMAT " ENC",
|
||||
GST_FOURCC_ARGS (enc_codecs[c]));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_register_encoder (plugin, context,
|
||||
enc_codecs[c], sink_caps, src_caps)) {
|
||||
GST_WARNING ("Failed to register %" GST_FOURCC_FORMAT " ENC",
|
||||
GST_FOURCC_ARGS (enc_codecs[c]));
|
||||
continue;
|
||||
}
|
||||
|
||||
gst_caps_unref (sink_caps);
|
||||
gst_caps_unref (src_caps);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -56,6 +56,15 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkav1enc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkav1enc_debug
|
||||
|
||||
#define GST_MSDKAV1ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkAV1Enc))
|
||||
#define GST_MSDKAV1ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkAV1EncClass))
|
||||
#define GST_IS_MSDKAV1ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKAV1ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_TILE_ROW = GST_MSDKENC_PROP_MAX,
|
||||
|
@ -69,29 +78,16 @@ enum
|
|||
#define PROP_B_PYRAMID_DEFAULT MFX_B_REF_UNKNOWN
|
||||
#define PROP_P_PYRAMID_DEFAULT MFX_P_REF_DEFAULT
|
||||
|
||||
#define RAW_FORMATS "NV12, P010_10LE"
|
||||
#define PROFILES "main"
|
||||
|
||||
#define COMMON_FORMAT "{ " RAW_FORMATS " }"
|
||||
#define SRC_PROFILES "{ " PROFILES " }"
|
||||
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT,
|
||||
COMMON_FORMAT)));
|
||||
|
||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS ("video/x-av1, "
|
||||
"framerate = (fraction) [0/1, MAX], "
|
||||
"width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], "
|
||||
"profile = (string) " SRC_PROFILES)
|
||||
"profile = (string) main")
|
||||
);
|
||||
|
||||
#define gst_msdkav1enc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkAV1Enc, gst_msdkav1enc, GST_TYPE_MSDKENC);
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static gboolean
|
||||
gst_msdkav1enc_set_format (GstMsdkEnc * encoder)
|
||||
|
@ -314,26 +310,9 @@ gst_msdkav1enc_finalize (GObject * object)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkav1enc_class_init (GstMsdkAV1EncClass * klass)
|
||||
_msdkav1enc_install_properties (GObjectClass * gobject_class,
|
||||
GstMsdkEncClass * encoder_class)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = gst_msdkav1enc_finalize;
|
||||
gobject_class->set_property = gst_msdkav1enc_set_property;
|
||||
gobject_class->get_property = gst_msdkav1enc_get_property;
|
||||
|
||||
encoder_class->set_format = gst_msdkav1enc_set_format;
|
||||
encoder_class->configure = gst_msdkav1enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkav1enc_set_src_caps;
|
||||
encoder_class->qp_max = 255;
|
||||
encoder_class->qp_min = 0;
|
||||
|
||||
gst_msdkenc_install_common_properties (encoder_class);
|
||||
|
||||
g_object_class_install_property (gobject_class, PROP_TILE_ROW,
|
||||
|
@ -357,6 +336,33 @@ gst_msdkav1enc_class_init (GstMsdkAV1EncClass * klass)
|
|||
g_param_spec_boolean ("p-pyramid", "P-pyramid",
|
||||
"Enable P-Pyramid Reference structure", PROP_P_PYRAMID_DEFAULT,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkav1enc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = gst_msdkav1enc_finalize;
|
||||
gobject_class->set_property = gst_msdkav1enc_set_property;
|
||||
gobject_class->get_property = gst_msdkav1enc_get_property;
|
||||
|
||||
encoder_class->set_format = gst_msdkav1enc_set_format;
|
||||
encoder_class->configure = gst_msdkav1enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkav1enc_set_src_caps;
|
||||
encoder_class->qp_max = 255;
|
||||
encoder_class->qp_min = 0;
|
||||
|
||||
_msdkav1enc_install_properties (gobject_class, encoder_class);
|
||||
|
||||
gst_element_class_set_static_metadata (element_class,
|
||||
"Intel MSDK AV1 encoder",
|
||||
|
@ -365,15 +371,65 @@ gst_msdkav1enc_class_init (GstMsdkAV1EncClass * klass)
|
|||
"Haihao Xiang <haihao.xiang@intel.com>, "
|
||||
"Mengkejiergeli Ba <mengkejiergeli.ba@intel.com>");
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &sink_factory);
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkav1enc_init (GstMsdkAV1Enc * thiz)
|
||||
gst_msdkav1enc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
GstMsdkAV1Enc *thiz = GST_MSDKAV1ENC (instance);
|
||||
thiz->num_tile_rows = PROP_TILE_ROW_DEFAULT;
|
||||
thiz->num_tile_cols = PROP_TILE_COL_DEFAULT;
|
||||
thiz->b_pyramid = PROP_B_PYRAMID_DEFAULT;
|
||||
thiz->p_pyramid = PROP_P_PYRAMID_DEFAULT;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkav1enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkAV1EncClass),
|
||||
.class_init = gst_msdkav1enc_class_init,
|
||||
.instance_size = sizeof (GstMsdkAV1Enc),
|
||||
.instance_init = gst_msdkav1enc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 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 ("GstMsdkAV1Enc");
|
||||
feature_name = g_strdup ("msdkav1enc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -37,17 +37,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKAV1ENC \
|
||||
(gst_msdkav1enc_get_type())
|
||||
#define GST_MSDKAV1ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKAV1ENC,GstMsdkAV1Enc))
|
||||
#define GST_MSDKAV1ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKAV1ENC,GstMsdkAV1EncClass))
|
||||
#define GST_IS_MSDKAV1ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKAV1ENC))
|
||||
#define GST_IS_MSDKAV1ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKAV1ENC))
|
||||
|
||||
typedef struct _GstMsdkAV1Enc GstMsdkAV1Enc;
|
||||
typedef struct _GstMsdkAV1EncClass GstMsdkAV1EncClass;
|
||||
|
||||
|
@ -71,7 +60,10 @@ struct _GstMsdkAV1EncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkav1enc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkav1enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -78,24 +78,6 @@ static void gst_msdkenc_close_encoder (GstMsdkEnc * thiz);
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkenc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkenc_debug
|
||||
|
||||
#ifdef _WIN32
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR
|
||||
("{ NV12, I420, YV12, YUY2, UYVY, BGRA }", "NV12") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("NV12"))
|
||||
);
|
||||
#else
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR
|
||||
("{ NV12, I420, YV12, YUY2, UYVY, BGRA }", "{ NV12, BGRx }") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12"))
|
||||
);
|
||||
#endif
|
||||
|
||||
#define PROP_HARDWARE_DEFAULT TRUE
|
||||
#define PROP_ASYNC_DEPTH_DEFAULT 4
|
||||
#define PROP_TARGET_USAGE_DEFAULT (MFX_TARGETUSAGE_BALANCED)
|
||||
|
@ -2276,8 +2258,6 @@ gst_msdkenc_class_init (GstMsdkEncClass * klass)
|
|||
GST_DEBUG_FUNCPTR (gst_msdkenc_propose_allocation);
|
||||
gstencoder_class->src_query = GST_DEBUG_FUNCPTR (gst_msdkenc_src_query);
|
||||
gstencoder_class->sink_query = GST_DEBUG_FUNCPTR (gst_msdkenc_sink_query);
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &sink_factory);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -59,6 +59,7 @@ G_BEGIN_DECLS
|
|||
typedef struct _GstMsdkEnc GstMsdkEnc;
|
||||
typedef struct _GstMsdkEncClass GstMsdkEncClass;
|
||||
typedef struct _MsdkEncTask MsdkEncTask;
|
||||
typedef struct _MsdkEncCData MsdkEncCData;
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -209,6 +210,12 @@ struct _MsdkEncTask
|
|||
mfxBitstream output_bitstream;
|
||||
};
|
||||
|
||||
struct _MsdkEncCData
|
||||
{
|
||||
GstCaps *sink_caps;
|
||||
GstCaps *src_caps;
|
||||
};
|
||||
|
||||
GType gst_msdkenc_get_type (void);
|
||||
|
||||
void gst_msdkenc_add_extra_param (GstMsdkEnc * thiz, mfxExtBuffer * param);
|
||||
|
|
|
@ -58,6 +58,15 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkh264enc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkh264enc_debug
|
||||
|
||||
#define GST_MSDKH264ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkH264Enc))
|
||||
#define GST_MSDKH264ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkH264EncClass))
|
||||
#define GST_IS_MSDKH264ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKH264ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_CABAC = GST_MSDKENC_PROP_MAX,
|
||||
|
@ -113,6 +122,8 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|||
"profile = (string) { high, main, baseline, constrained-baseline }")
|
||||
);
|
||||
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static GType
|
||||
gst_msdkh264enc_frame_packing_get_type (void)
|
||||
{
|
||||
|
@ -133,9 +144,6 @@ gst_msdkh264enc_frame_packing_get_type (void)
|
|||
return format_type;
|
||||
}
|
||||
|
||||
#define gst_msdkh264enc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkH264Enc, gst_msdkh264enc, GST_TYPE_MSDKENC);
|
||||
|
||||
static void
|
||||
gst_msdkh264enc_insert_sei (GstMsdkH264Enc * thiz, GstVideoCodecFrame * frame,
|
||||
GstMemory * sei_mem)
|
||||
|
@ -733,31 +741,9 @@ gst_msdkh264enc_set_extra_params (GstMsdkEnc * encoder,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkh264enc_class_init (GstMsdkH264EncClass * klass)
|
||||
_msdkh264enc_install_properties (GObjectClass * gobject_class,
|
||||
GstMsdkEncClass * encoder_class)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstVideoEncoderClass *videoencoder_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
videoencoder_class = GST_VIDEO_ENCODER_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->dispose = gst_msdkh264enc_dispose;
|
||||
gobject_class->finalize = gst_msdkh264enc_finalize;
|
||||
gobject_class->set_property = gst_msdkh264enc_set_property;
|
||||
gobject_class->get_property = gst_msdkh264enc_get_property;
|
||||
|
||||
videoencoder_class->pre_push = gst_msdkh264enc_pre_push;
|
||||
|
||||
encoder_class->set_format = gst_msdkh264enc_set_format;
|
||||
encoder_class->configure = gst_msdkh264enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkh264enc_set_src_caps;
|
||||
encoder_class->need_reconfig = gst_msdkh264enc_need_reconfig;
|
||||
encoder_class->set_extra_params = gst_msdkh264enc_set_extra_params;
|
||||
|
||||
gst_msdkenc_install_common_properties (encoder_class);
|
||||
|
||||
g_object_class_install_property (gobject_class, PROP_CABAC,
|
||||
|
@ -855,17 +841,60 @@ gst_msdkh264enc_class_init (GstMsdkH264EncClass * klass)
|
|||
"Option of disable deblocking idc",
|
||||
0, 2, PROP_DBLK_IDC_DEFAULT,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkh264enc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstVideoEncoderClass *videoencoder_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
videoencoder_class = GST_VIDEO_ENCODER_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->dispose = gst_msdkh264enc_dispose;
|
||||
gobject_class->finalize = gst_msdkh264enc_finalize;
|
||||
gobject_class->set_property = gst_msdkh264enc_set_property;
|
||||
gobject_class->get_property = gst_msdkh264enc_get_property;
|
||||
|
||||
videoencoder_class->pre_push = gst_msdkh264enc_pre_push;
|
||||
|
||||
encoder_class->set_format = gst_msdkh264enc_set_format;
|
||||
encoder_class->configure = gst_msdkh264enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkh264enc_set_src_caps;
|
||||
encoder_class->need_reconfig = gst_msdkh264enc_need_reconfig;
|
||||
encoder_class->set_extra_params = gst_msdkh264enc_set_extra_params;
|
||||
|
||||
_msdkh264enc_install_properties (gobject_class, encoder_class);
|
||||
|
||||
gst_element_class_set_static_metadata (element_class,
|
||||
"Intel MSDK H264 encoder", "Codec/Encoder/Video/Hardware",
|
||||
"H264 video encoder based on " MFX_API_SDK,
|
||||
"Josep Torra <jtorra@oblong.com>");
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkh264enc_init (GstMsdkH264Enc * thiz)
|
||||
gst_msdkh264enc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
GstMsdkH264Enc *thiz = GST_MSDKH264ENC (instance);
|
||||
thiz->cabac = PROP_CABAC_DEFAULT;
|
||||
thiz->lowpower = PROP_LOWPOWER_DEFAULT;
|
||||
thiz->frame_packing = PROP_FRAME_PACKING_DEFAULT;
|
||||
|
@ -883,3 +912,48 @@ gst_msdkh264enc_init (GstMsdkH264Enc * thiz)
|
|||
thiz->intra_refresh_cycle_dist = PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT;
|
||||
thiz->dblk_idc = PROP_DBLK_IDC_DEFAULT;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkh264enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkH264EncClass),
|
||||
.class_init = gst_msdkh264enc_class_init,
|
||||
.instance_size = sizeof (GstMsdkH264Enc),
|
||||
.instance_init = gst_msdkh264enc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 1);
|
||||
cdata->sink_caps = gst_caps_ref (sink_caps);
|
||||
cdata->src_caps = gst_caps_copy (src_caps);
|
||||
|
||||
gst_caps_set_simple (cdata->src_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 ("GstMsdkH264Enc");
|
||||
feature_name = g_strdup ("msdkh264enc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -37,17 +37,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKH264ENC \
|
||||
(gst_msdkh264enc_get_type())
|
||||
#define GST_MSDKH264ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKH264ENC,GstMsdkH264Enc))
|
||||
#define GST_MSDKH264ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKH264ENC,GstMsdkH264EncClass))
|
||||
#define GST_IS_MSDKH264ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKH264ENC))
|
||||
#define GST_IS_MSDKH264ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKH264ENC))
|
||||
|
||||
typedef struct _GstMsdkH264Enc GstMsdkH264Enc;
|
||||
typedef struct _GstMsdkH264EncClass GstMsdkH264EncClass;
|
||||
|
||||
|
@ -90,7 +79,10 @@ struct _GstMsdkH264EncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkh264enc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkh264enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -56,6 +56,15 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkh265enc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkh265enc_debug
|
||||
|
||||
#define GST_MSDKH265ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkH265Enc))
|
||||
#define GST_MSDKH265ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkH265EncClass))
|
||||
#define GST_IS_MSDKH265ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKH265ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
enum
|
||||
{
|
||||
#ifndef GST_REMOVE_DEPRECATED
|
||||
|
@ -101,57 +110,32 @@ enum
|
|||
#define PROP_INTRA_REFRESH_CYCLE_DIST_DEFAULT 0
|
||||
#define PROP_DBLK_IDC_DEFAULT 0
|
||||
|
||||
#define RAW_FORMATS "NV12, I420, YV12, YUY2, UYVY, BGRA, BGR10A2_LE, P010_10LE, VUYA"
|
||||
#define PROFILES "main, main-10, main-444, main-still-picture, main-10-still-picture"
|
||||
#define COMMON_FORMAT "{ " RAW_FORMATS " }"
|
||||
#define PRFOLIE_STR "{ " PROFILES " }"
|
||||
|
||||
|
||||
#if (MFX_VERSION >= 1027)
|
||||
#undef COMMON_FORMAT
|
||||
#undef PRFOLIE_STR
|
||||
#define FORMATS_1027 RAW_FORMATS ", Y410, Y210"
|
||||
#define PROFILES_1027 PROFILES ", main-444-10, main-422-10"
|
||||
#define COMMON_FORMAT "{ " FORMATS_1027 " }"
|
||||
#define PRFOLIE_STR "{ " PROFILES_1027 " }"
|
||||
#endif
|
||||
|
||||
#if (MFX_VERSION >= 1031)
|
||||
#undef COMMON_FORMAT
|
||||
#undef PRFOLIE_STR
|
||||
#define FORMATS_1031 FORMATS_1027 ", P012_LE"
|
||||
#define PROFILES_1031 PROFILES_1027 ", main-12"
|
||||
#define COMMON_FORMAT "{ " FORMATS_1031 " }"
|
||||
#define PRFOLIE_STR "{ " PROFILES_1031 " }"
|
||||
#endif
|
||||
|
||||
#if (MFX_VERSION >= 1032)
|
||||
#undef COMMON_FORMAT
|
||||
#undef PRFOLIE_STR
|
||||
#define FORMATS_1032 FORMATS_1031
|
||||
#define PROFILES_1032 PROFILES_1031 ", screen-extended-main, " \
|
||||
"screen-extended-main-10, screen-extended-main-444, " \
|
||||
"screen-extended-main-444-10"
|
||||
#define COMMON_FORMAT "{ " FORMATS_1032 " }"
|
||||
#define PRFOLIE_STR "{ " PROFILES_1032 " }"
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT,
|
||||
"{ NV12, P010_10LE }") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12, P010_10LE }")));
|
||||
#else
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT,
|
||||
"{ NV12, P010_10LE }") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12")));
|
||||
#endif
|
||||
|
||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -162,8 +146,7 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|||
"profile = (string) " PRFOLIE_STR)
|
||||
);
|
||||
|
||||
#define gst_msdkh265enc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkH265Enc, gst_msdkh265enc, GST_TYPE_MSDKENC);
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static void
|
||||
gst_msdkh265enc_insert_sei (GstMsdkH265Enc * thiz, GstVideoCodecFrame * frame,
|
||||
|
@ -911,31 +894,9 @@ gst_msdkh265enc_need_conversion (GstMsdkEnc * encoder, GstVideoInfo * info,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkh265enc_class_init (GstMsdkH265EncClass * klass)
|
||||
_msdkh265enc_install_properties (GObjectClass * gobject_class,
|
||||
GstMsdkEncClass * encoder_class)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstVideoEncoderClass *videoencoder_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
videoencoder_class = GST_VIDEO_ENCODER_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = gst_msdkh265enc_finalize;
|
||||
gobject_class->set_property = gst_msdkh265enc_set_property;
|
||||
gobject_class->get_property = gst_msdkh265enc_get_property;
|
||||
|
||||
videoencoder_class->pre_push = gst_msdkh265enc_pre_push;
|
||||
|
||||
encoder_class->set_format = gst_msdkh265enc_set_format;
|
||||
encoder_class->configure = gst_msdkh265enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkh265enc_set_src_caps;
|
||||
encoder_class->need_reconfig = gst_msdkh265enc_need_reconfig;
|
||||
encoder_class->set_extra_params = gst_msdkh265enc_set_extra_params;
|
||||
encoder_class->need_conversion = gst_msdkh265enc_need_conversion;
|
||||
|
||||
gst_msdkenc_install_common_properties (encoder_class);
|
||||
|
||||
#ifndef GST_REMOVE_DEPRECATED
|
||||
|
@ -1028,6 +989,38 @@ gst_msdkh265enc_class_init (GstMsdkH265EncClass * klass)
|
|||
"Option of disable deblocking idc",
|
||||
0, 2, PROP_DBLK_IDC_DEFAULT,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkh265enc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstVideoEncoderClass *videoencoder_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
videoencoder_class = GST_VIDEO_ENCODER_CLASS (klass);
|
||||
encoder_class = GST_MSDKENC_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = gst_msdkh265enc_finalize;
|
||||
gobject_class->set_property = gst_msdkh265enc_set_property;
|
||||
gobject_class->get_property = gst_msdkh265enc_get_property;
|
||||
|
||||
videoencoder_class->pre_push = gst_msdkh265enc_pre_push;
|
||||
|
||||
encoder_class->set_format = gst_msdkh265enc_set_format;
|
||||
encoder_class->configure = gst_msdkh265enc_configure;
|
||||
encoder_class->set_src_caps = gst_msdkh265enc_set_src_caps;
|
||||
encoder_class->need_reconfig = gst_msdkh265enc_need_reconfig;
|
||||
encoder_class->set_extra_params = gst_msdkh265enc_set_extra_params;
|
||||
encoder_class->need_conversion = gst_msdkh265enc_need_conversion;
|
||||
|
||||
_msdkh265enc_install_properties (gobject_class, encoder_class);
|
||||
|
||||
gst_element_class_set_static_metadata (element_class,
|
||||
"Intel MSDK H265 encoder",
|
||||
|
@ -1035,14 +1028,23 @@ gst_msdkh265enc_class_init (GstMsdkH265EncClass * klass)
|
|||
"H265 video encoder based on " MFX_API_SDK,
|
||||
"Josep Torra <jtorra@oblong.com>");
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &sink_factory);
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkh265enc_init (GstMsdkH265Enc * thiz)
|
||||
gst_msdkh265enc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
GstMsdkEnc *msdk_enc = (GstMsdkEnc *) thiz;
|
||||
GstMsdkH265Enc *thiz = GST_MSDKH265ENC (instance);
|
||||
GstMsdkEnc *msdk_enc = (GstMsdkEnc *) instance;
|
||||
thiz->lowpower = PROP_LOWPOWER_DEFAULT;
|
||||
thiz->num_tile_rows = PROP_TILE_ROW_DEFAULT;
|
||||
thiz->num_tile_cols = PROP_TILE_COL_DEFAULT;
|
||||
|
@ -1060,3 +1062,53 @@ gst_msdkh265enc_init (GstMsdkH265Enc * thiz)
|
|||
thiz->dblk_idc = PROP_DBLK_IDC_DEFAULT;
|
||||
msdk_enc->num_extra_frames = 1;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkh265enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkH265EncClass),
|
||||
.class_init = gst_msdkh265enc_class_init,
|
||||
.instance_size = sizeof (GstMsdkH265Enc),
|
||||
.instance_init = gst_msdkh265enc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 1);
|
||||
cdata->sink_caps = gst_caps_copy (sink_caps);
|
||||
cdata->src_caps = gst_caps_copy (src_caps);
|
||||
|
||||
#ifdef _WIN32
|
||||
gst_msdkcaps_set_strings (cdata->sink_caps,
|
||||
"memory:D3D11Memory", "format", "NV12, P010_10LE");
|
||||
#endif
|
||||
|
||||
gst_caps_set_simple (cdata->src_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 ("GstMsdkH265Enc");
|
||||
feature_name = g_strdup ("msdkh265enc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -37,17 +37,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKH265ENC \
|
||||
(gst_msdkh265enc_get_type())
|
||||
#define GST_MSDKH265ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKH265ENC,GstMsdkH265Enc))
|
||||
#define GST_MSDKH265ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKH265ENC,GstMsdkH265EncClass))
|
||||
#define GST_IS_MSDKH265ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKH265ENC))
|
||||
#define GST_IS_MSDKH265ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKH265ENC))
|
||||
|
||||
typedef struct _GstMsdkH265Enc GstMsdkH265Enc;
|
||||
typedef struct _GstMsdkH265EncClass GstMsdkH265EncClass;
|
||||
|
||||
|
@ -89,7 +78,10 @@ struct _GstMsdkH265EncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkh265enc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkh265enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -62,6 +62,15 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkmjpegenc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkmjpegenc_debug
|
||||
|
||||
#define GST_MSDKMJPEGENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkMJPEGEnc))
|
||||
#define GST_MSDKMJPEGENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkMJPEGEncClass))
|
||||
#define GST_IS_MSDKMJPEGENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKMJPEGENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
|
@ -70,16 +79,7 @@ enum
|
|||
|
||||
#define DEFAULT_QUALITY 85
|
||||
|
||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS ("image/jpeg, "
|
||||
"framerate = (fraction) [0/1, MAX], "
|
||||
"width = (int) [ 1, MAX ], height = (int) [ 1, MAX ]")
|
||||
);
|
||||
|
||||
#define gst_msdkmjpegenc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkMJPEGEnc, gst_msdkmjpegenc, GST_TYPE_MSDKENC);
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static gboolean
|
||||
gst_msdkmjpegenc_set_format (GstMsdkEnc * encoder)
|
||||
|
@ -168,11 +168,14 @@ gst_msdkmjpegenc_need_conversion (GstMsdkEnc * encoder, GstVideoInfo * info,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkmjpegenc_class_init (GstMsdkMJPEGEncClass * klass)
|
||||
gst_msdkmjpegenc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
|
@ -196,11 +199,62 @@ gst_msdkmjpegenc_class_init (GstMsdkMJPEGEncClass * klass)
|
|||
"MJPEG video encoder based on " MFX_API_SDK,
|
||||
"Scott D Phillips <scott.d.phillips@intel.com>");
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkmjpegenc_init (GstMsdkMJPEGEnc * thiz)
|
||||
gst_msdkmjpegenc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
GstMsdkMJPEGEnc *thiz = GST_MSDKMJPEGENC (instance);
|
||||
thiz->quality = DEFAULT_QUALITY;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkmjpegenc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkMJPEGEncClass),
|
||||
.class_init = gst_msdkmjpegenc_class_init,
|
||||
.instance_size = sizeof (GstMsdkMJPEGEnc),
|
||||
.instance_init = gst_msdkmjpegenc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 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 ("GstMsdkMJPEGEnc");
|
||||
feature_name = g_strdup ("msdkmjpegenc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -36,17 +36,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKMJPEGENC \
|
||||
(gst_msdkmjpegenc_get_type())
|
||||
#define GST_MSDKMJPEGENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKMJPEGENC,GstMsdkMJPEGEnc))
|
||||
#define GST_MSDKMJPEGENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKMJPEGENC,GstMsdkMJPEGEncClass))
|
||||
#define GST_IS_MSDKMJPEGENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKMJPEGENC))
|
||||
#define GST_IS_MSDKMJPEGENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKMJPEGENC))
|
||||
|
||||
typedef struct _GstMsdkMJPEGEnc GstMsdkMJPEGEnc;
|
||||
typedef struct _GstMsdkMJPEGEncClass GstMsdkMJPEGEncClass;
|
||||
|
||||
|
@ -61,7 +50,10 @@ struct _GstMsdkMJPEGEncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkmjpegenc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkmjpegenc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -54,6 +54,15 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkmpeg2enc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkmpeg2enc_debug
|
||||
|
||||
#define GST_MSDKMPEG2ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkMPEG2Enc))
|
||||
#define GST_MSDKMPEG2ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkMPEG2EncClass))
|
||||
#define GST_IS_MSDKMPEG2ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKMPEG2ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -64,8 +73,7 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|||
"profile = (string) { high, main, simple }")
|
||||
);
|
||||
|
||||
#define gst_msdkmpeg2enc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkMPEG2Enc, gst_msdkmpeg2enc, GST_TYPE_MSDKENC);
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static gboolean
|
||||
gst_msdkmpeg2enc_set_format (GstMsdkEnc * encoder)
|
||||
|
@ -188,11 +196,14 @@ gst_msdkmpeg2enc_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkmpeg2enc_class_init (GstMsdkMPEG2EncClass * klass)
|
||||
gst_msdkmpeg2enc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
|
@ -213,10 +224,64 @@ gst_msdkmpeg2enc_class_init (GstMsdkMPEG2EncClass * klass)
|
|||
"MPEG2 video encoder based on " MFX_API_SDK,
|
||||
"Josep Torra <jtorra@oblong.com>");
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkmpeg2enc_init (GstMsdkMPEG2Enc * thiz)
|
||||
gst_msdkmpeg2enc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkmpeg2enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkMPEG2EncClass),
|
||||
.class_init = gst_msdkmpeg2enc_class_init,
|
||||
.instance_size = sizeof (GstMsdkMPEG2Enc),
|
||||
.instance_init = gst_msdkmpeg2enc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 1);
|
||||
cdata->sink_caps = gst_caps_ref (sink_caps);
|
||||
cdata->src_caps = gst_caps_copy (src_caps);
|
||||
|
||||
gst_caps_set_simple (cdata->src_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 ("GstMsdkMPEG2Enc");
|
||||
feature_name = g_strdup ("msdkmpeg2enc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -36,17 +36,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKMPEG2ENC \
|
||||
(gst_msdkmpeg2enc_get_type())
|
||||
#define GST_MSDKMPEG2ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKMPEG2ENC,GstMsdkMPEG2Enc))
|
||||
#define GST_MSDKMPEG2ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKMPEG2ENC,GstMsdkMPEG2EncClass))
|
||||
#define GST_IS_MSDKMPEG2ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKMPEG2ENC))
|
||||
#define GST_IS_MSDKMPEG2ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKMPEG2ENC))
|
||||
|
||||
typedef struct _GstMsdkMPEG2Enc GstMsdkMPEG2Enc;
|
||||
typedef struct _GstMsdkMPEG2EncClass GstMsdkMPEG2EncClass;
|
||||
|
||||
|
@ -62,7 +51,10 @@ struct _GstMsdkMPEG2EncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkmpeg2enc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkmpeg2enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -56,33 +56,23 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (gst_msdkvp9enc_debug);
|
||||
#define GST_CAT_DEFAULT gst_msdkvp9enc_debug
|
||||
|
||||
#define RAW_FORMATS "NV12, I420, YV12, YUY2, UYVY, BGRA, P010_10LE, VUYA"
|
||||
#define GST_MSDKVP9ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_FROM_INSTANCE (obj), GstMsdkVP9Enc))
|
||||
#define GST_MSDKVP9ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_FROM_CLASS (klass), GstMsdkVP9EncClass))
|
||||
#define GST_IS_MSDKVP9ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_FROM_INSTANCE (obj)))
|
||||
#define GST_IS_MSDKVP9ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_FROM_CLASS (klass)))
|
||||
|
||||
#define PROFILES "0, 1, 2"
|
||||
|
||||
#if (MFX_VERSION >= 1027)
|
||||
#define COMMON_FORMAT "{ " RAW_FORMATS ", Y410 }"
|
||||
#define SRC_PROFILES "{ " PROFILES ", 3 }"
|
||||
#else
|
||||
#define COMMON_FORMAT "{ " RAW_FORMATS " }"
|
||||
#define SRC_PROFILES "{ " PROFILES " }"
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT,
|
||||
"{ NV12, P010_10LE }") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_D3D11_FEATURE ("{ NV12, P010_10LE }")));
|
||||
#else
|
||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_MSDK_CAPS_STR (COMMON_FORMAT,
|
||||
"{ NV12, P010_10LE }") "; "
|
||||
GST_MSDK_CAPS_MAKE_WITH_VA_FEATURE ("NV12")));
|
||||
#endif
|
||||
|
||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
|
@ -92,8 +82,7 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|||
"profile = (string) " SRC_PROFILES)
|
||||
);
|
||||
|
||||
#define gst_msdkvp9enc_parent_class parent_class
|
||||
G_DEFINE_TYPE (GstMsdkVP9Enc, gst_msdkvp9enc, GST_TYPE_MSDKENC);
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
static gboolean
|
||||
gst_msdkvp9enc_set_format (GstMsdkEnc * encoder)
|
||||
|
@ -266,11 +255,14 @@ gst_msdkvp9enc_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_msdkvp9enc_class_init (GstMsdkVP9EncClass * klass)
|
||||
gst_msdkvp9enc_class_init (gpointer klass, gpointer data)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *element_class;
|
||||
GstMsdkEncClass *encoder_class;
|
||||
MsdkEncCData *cdata = data;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (klass);
|
||||
element_class = GST_ELEMENT_CLASS (klass);
|
||||
|
@ -293,11 +285,65 @@ gst_msdkvp9enc_class_init (GstMsdkVP9EncClass * klass)
|
|||
"VP9 video encoder based on " MFX_API_SDK,
|
||||
"Haihao Xiang <haihao.xiang@intel.com>");
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &sink_factory);
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
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_caps_unref (cdata->sink_caps);
|
||||
gst_caps_unref (cdata->src_caps);
|
||||
g_free (cdata);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_msdkvp9enc_init (GstMsdkVP9Enc * thiz)
|
||||
gst_msdkvp9enc_init (GTypeInstance * instance, gpointer g_class)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
gst_msdkvp9enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank)
|
||||
{
|
||||
GType type;
|
||||
MsdkEncCData *cdata;
|
||||
gchar *type_name, *feature_name;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
GTypeInfo type_info = {
|
||||
.class_size = sizeof (GstMsdkVP9EncClass),
|
||||
.class_init = gst_msdkvp9enc_class_init,
|
||||
.instance_size = sizeof (GstMsdkVP9Enc),
|
||||
.instance_init = gst_msdkvp9enc_init
|
||||
};
|
||||
|
||||
cdata = g_new (MsdkEncCData, 1);
|
||||
cdata->sink_caps = gst_caps_copy (sink_caps);
|
||||
cdata->src_caps = gst_caps_ref (src_caps);
|
||||
|
||||
#ifdef _WIN32
|
||||
gst_msdkcaps_set_strings (cdata->sink_caps,
|
||||
"memory:D3D11Memory", "format", "NV12, P010_10LE");
|
||||
#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 ("GstMsdkVP9Enc");
|
||||
feature_name = g_strdup ("msdkvp9enc");
|
||||
|
||||
type = g_type_register_static (GST_TYPE_MSDKENC, 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;
|
||||
}
|
||||
|
|
|
@ -36,17 +36,6 @@
|
|||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_MSDKVP9ENC \
|
||||
(gst_msdkvp9enc_get_type())
|
||||
#define GST_MSDKVP9ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MSDKVP9ENC,GstMsdkVP9Enc))
|
||||
#define GST_MSDKVP9ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MSDKVP9ENC,GstMsdkVP9EncClass))
|
||||
#define GST_IS_MSDKVP9ENC(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MSDKVP9ENC))
|
||||
#define GST_IS_MSDKVP9ENC_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKVP9ENC))
|
||||
|
||||
typedef struct _GstMsdkVP9Enc GstMsdkVP9Enc;
|
||||
typedef struct _GstMsdkVP9EncClass GstMsdkVP9EncClass;
|
||||
|
||||
|
@ -64,7 +53,10 @@ struct _GstMsdkVP9EncClass
|
|||
GstMsdkEncClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_msdkvp9enc_get_type (void);
|
||||
gboolean
|
||||
gst_msdkvp9enc_register (GstPlugin * plugin,
|
||||
GstMsdkContext * context, GstCaps * sink_caps,
|
||||
GstCaps * src_caps, guint rank);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
Loading…
Reference in a new issue