summaryrefslogtreecommitdiff
path: root/sys/d3d11/gstd3d11decoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sys/d3d11/gstd3d11decoder.cpp')
-rw-r--r--sys/d3d11/gstd3d11decoder.cpp104
1 files changed, 100 insertions, 4 deletions
diff --git a/sys/d3d11/gstd3d11decoder.cpp b/sys/d3d11/gstd3d11decoder.cpp
index 3ae416bda..a9f59e4ad 100644
--- a/sys/d3d11/gstd3d11decoder.cpp
+++ b/sys/d3d11/gstd3d11decoder.cpp
@@ -55,6 +55,7 @@
#include "gstd3d11converter.h"
#include "gstd3d11pluginutils.h"
#include <string.h>
+#include <string>
#ifdef HAVE_WINMM
#include <timeapi.h>
@@ -1941,6 +1942,22 @@ gst_d3d11_decoder_supports_resolution (GstD3D11Decoder * decoder,
return TRUE;
}
+enum
+{
+ PROP_DECODER_ADAPTER = 1,
+ PROP_DECODER_DEVICE_ID,
+ PROP_DECODER_VENDOR_ID,
+};
+
+struct _GstD3D11DecoderClassData
+{
+ GstD3D11DecoderSubClassData subclass_data;
+ GstCaps *sink_caps;
+ GstCaps *src_caps;
+ gchar *description;
+ GstD3D11Codec codec;
+};
+
/**
* gst_d3d11_decoder_class_data_new:
* @device: (transfer none): a #GstD3D11Device
@@ -1952,7 +1969,7 @@ gst_d3d11_decoder_supports_resolution (GstD3D11Decoder * decoder,
* Returns: (transfer full): the new #GstD3D11DecoderClassData
*/
GstD3D11DecoderClassData *
-gst_d3d11_decoder_class_data_new (GstD3D11Device * device,
+gst_d3d11_decoder_class_data_new (GstD3D11Device * device, GstD3D11Codec codec,
GstCaps * sink_caps, GstCaps * src_caps)
{
GstD3D11DecoderClassData *ret;
@@ -1963,13 +1980,16 @@ gst_d3d11_decoder_class_data_new (GstD3D11Device * device,
ret = g_new0 (GstD3D11DecoderClassData, 1);
+ ret->codec = codec;
+
/* class data will be leaked if the element never gets instantiated */
GST_MINI_OBJECT_FLAG_SET (sink_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
GST_MINI_OBJECT_FLAG_SET (src_caps, GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED);
- g_object_get (device, "adapter", &ret->adapter,
- "device-id", &ret->device_id, "vendor-id", &ret->vendor_id,
- "description", &ret->description, NULL);
+ g_object_get (device, "adapter", &ret->subclass_data.adapter,
+ "device-id", &ret->subclass_data.device_id,
+ "vendor-id", &ret->subclass_data.vendor_id,
+ "description", &ret->description, nullptr);
ret->sink_caps = sink_caps;
ret->src_caps = src_caps;
@@ -1977,6 +1997,16 @@ gst_d3d11_decoder_class_data_new (GstD3D11Device * device,
}
void
+gst_d3d11_decoder_class_data_fill_subclass_data (GstD3D11DecoderClassData *
+ data, GstD3D11DecoderSubClassData * subclass_data)
+{
+ g_return_if_fail (data != nullptr);
+ g_return_if_fail (subclass_data != nullptr);
+
+ *subclass_data = data->subclass_data;
+}
+
+static void
gst_d3d11_decoder_class_data_free (GstD3D11DecoderClassData * data)
{
if (!data)
@@ -1987,3 +2017,69 @@ gst_d3d11_decoder_class_data_free (GstD3D11DecoderClassData * data)
g_free (data->description);
g_free (data);
}
+
+void
+gst_d3d11_decoder_proxy_class_init (GstElementClass * klass,
+ GstD3D11DecoderClassData * data, const gchar * author)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstD3D11DecoderSubClassData *cdata = &data->subclass_data;
+ std::string long_name;
+ std::string description;
+ const gchar *codec_name;
+
+ g_object_class_install_property (gobject_class, PROP_DECODER_ADAPTER,
+ g_param_spec_uint ("adapter", "Adapter",
+ "DXGI Adapter index for creating device",
+ 0, G_MAXUINT32, cdata->adapter,
+ (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
+
+ g_object_class_install_property (gobject_class, PROP_DECODER_DEVICE_ID,
+ g_param_spec_uint ("device-id", "Device Id",
+ "DXGI Device ID", 0, G_MAXUINT32, 0,
+ (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
+
+ g_object_class_install_property (gobject_class, PROP_DECODER_VENDOR_ID,
+ g_param_spec_uint ("vendor-id", "Vendor Id",
+ "DXGI Vendor ID", 0, G_MAXUINT32, 0,
+ (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)));
+
+ codec_name = gst_d3d11_codec_to_string (data->codec);
+ long_name = "Direct3D11/DXVA " + std::string (codec_name) + " " +
+ std::string (data->description) + " Decoder";
+ description = "Direct3D11/DXVA based " + std::string (codec_name) +
+ " video decoder";
+
+ gst_element_class_set_metadata (klass, long_name.c_str (),
+ "Codec/Decoder/Video/Hardware", description.c_str (), author);
+
+ gst_element_class_add_pad_template (klass,
+ gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ data->sink_caps));
+ gst_element_class_add_pad_template (klass,
+ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ data->src_caps));
+
+ gst_d3d11_decoder_class_data_free (data);
+}
+
+void
+gst_d3d11_decoder_proxy_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec,
+ GstD3D11DecoderSubClassData * subclass_data)
+{
+ switch (prop_id) {
+ case PROP_DECODER_ADAPTER:
+ g_value_set_uint (value, subclass_data->adapter);
+ break;
+ case PROP_DECODER_DEVICE_ID:
+ g_value_set_uint (value, subclass_data->device_id);
+ break;
+ case PROP_DECODER_VENDOR_ID:
+ g_value_set_uint (value, subclass_data->vendor_id);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}