static gboolean
plugin_init (GstPlugin * plugin)
{
+ GstD3D11Device *device = NULL;
+ GstRank video_sink_rank = GST_RANK_NONE;
+
GST_DEBUG_CATEGORY_INIT (gst_d3d11_debug, "d3d11", 0, "direct3d 11 plugin");
GST_DEBUG_CATEGORY_INIT (gst_d3d11_shader_debug,
"d3d11shader", 0, "d3d11shader");
"d3d11convert", GST_RANK_NONE, GST_TYPE_D3D11_COLOR_CONVERT);
gst_element_register (plugin,
"d3d11videosinkelement", GST_RANK_NONE, GST_TYPE_D3D11_VIDEO_SINK);
+
+ device = gst_d3d11_device_new (0);
+
+ /* FIXME: Our shader code is not compatible with D3D_FEATURE_LEVEL_9_3
+ * or lower. So HLSL compiler cannot understand our shader code and
+ * therefore d3d11colorconverter cannot be configured.
+ *
+ * Known D3D_FEATURE_LEVEL_9_3 driver is
+ * "VirtualBox Graphics Adapter (WDDM)"
+ * ... and there might be some more old physical devices which don't support
+ * D3D_FEATURE_LEVEL_10_0.
+ */
+ if (device) {
+ D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_10_0;
+
+ feature_level = gst_d3d11_device_get_chosen_feature_level (device);
+ if (feature_level >= D3D_FEATURE_LEVEL_10_0)
+ video_sink_rank = GST_RANK_PRIMARY;
+ }
+
gst_element_register (plugin,
- "d3d11videosink", GST_RANK_PRIMARY, GST_TYPE_D3D11_VIDEO_SINK_BIN);
+ "d3d11videosink", video_sink_rank, GST_TYPE_D3D11_VIDEO_SINK_BIN);
#ifdef HAVE_DXVA_H
/* DXVA2 API is availble since Windows 8 */
if (gst_d3d11_is_windows_8_or_greater ()) {
- GstD3D11Device *device = NULL;
gint i = 0;
GST_DEBUG_CATEGORY_INIT (gst_d3d11_h264_dec_debug,
GST_DEBUG_CATEGORY_INIT (gst_d3d11_vp8_dec_debug,
"d3d11vp8dec", 0, "Direct3D11 VP8 Decoder");
- while ((device = gst_d3d11_device_new (i)) != NULL) {
+ do {
GstD3D11Decoder *decoder = NULL;
gboolean legacy;
gboolean hardware;
+ if (!device)
+ device = gst_d3d11_device_new (i);
+
+ if (!device)
+ break;
+
g_object_get (device, "hardware", &hardware, NULL);
if (!hardware)
goto clear;
gst_clear_object (&device);
gst_clear_object (&decoder);
i++;
- }
+ } while (1);
}
#endif
+ gst_clear_object (&device);
+
return TRUE;
}