diff options
author | Matthew Waters <matthew@centricular.com> | 2016-06-16 15:13:02 +1000 |
---|---|---|
committer | Jan Schmidt <jan@centricular.com> | 2016-08-16 02:33:23 +1000 |
commit | 3a0b62755b75ab7f498482f647a7d46558416ea1 (patch) | |
tree | 57ed47d50385883b982a3b3334f6831a49d7f94c | |
parent | 85dcabcee0e577547fd0a102a7322edba6d5e41a (diff) | |
download | gstreamer-plugins-bad-3a0b62755b75ab7f498482f647a7d46558416ea1.tar.gz |
qmlglsink: add win32 support
The current state of c++ ABI's on Window's and Gst's/Qt's conflicting
mingw builds means that we cannot use mingw for building the qt plugin.
Instead, a qmake .pro file is provided that is expected to be used with the
msvc binaries provided by Qt like so:
(with the PATH environment variable containing the path to the qt biniaries
and PKG_CONFIG_PATH containing the path to GStreamer modules)
cd /path/to/sources/gst-plugins-bad/ext/qt
qmake -tp vc
Then open the resulting VS project and build the library. Then
cp debug/libgstqtsink.dll /path/to/prefix/lib/gstreamer-1.0/libgstqtsink.cll
https://bugzilla.gnome.org/show_bug.cgi?id=761260
-rw-r--r-- | ext/qt/qtitem.cc | 93 | ||||
-rw-r--r-- | ext/qt/qtplugin.pro | 39 |
2 files changed, 91 insertions, 41 deletions
diff --git a/ext/qt/qtitem.cc b/ext/qt/qtitem.cc index 505ed03f2..67820b993 100644 --- a/ext/qt/qtitem.cc +++ b/ext/qt/qtitem.cc @@ -178,6 +178,10 @@ QtGLVideoItem::QtGLVideoItem() if (QString::fromUtf8 ("ios") == app->platformName()) this->priv->display = gst_gl_display_new (); #endif +#if GST_GL_HAVE_WINDOW_WIN32 && GST_GL_HAVE_PLATFORM_WGL && defined (HAVE_QT_WIN32) + if (QString::fromUtf8 ("windows") == app->platformName()) + this->priv->display = gst_gl_display_new (); +#endif if (!this->priv->display) this->priv->display = gst_gl_display_new (); @@ -216,9 +220,9 @@ QtGLVideoItem::getDAR(gint * num, gint * den) } void -QtGLVideoItem::setForceAspectRatio(bool far) +QtGLVideoItem::setForceAspectRatio(bool force_aspect_ratio) { - this->priv->force_aspect_ratio = far; + this->priv->force_aspect_ratio = !!force_aspect_ratio; } bool @@ -314,7 +318,7 @@ qt_item_set_buffer (QtGLVideoItem * widget, GstBuffer * buffer) void QtGLVideoItem::onSceneGraphInitialized () { - GstGLPlatform platform; + GstGLPlatform platform = (GstGLPlatform) 0; GstGLAPI gl_api; guintptr gl_handle; @@ -333,60 +337,37 @@ QtGLVideoItem::onSceneGraphInitialized () #if GST_GL_HAVE_WINDOW_X11 && defined (HAVE_QT_X11) if (GST_IS_GL_DISPLAY_X11 (this->priv->display)) { platform = GST_GL_PLATFORM_GLX; - gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); - gl_handle = gst_gl_context_get_current_gl_context (platform); - if (gl_handle) - this->priv->other_context = - gst_gl_context_new_wrapped (this->priv->display, gl_handle, - platform, gl_api); } #endif #if GST_GL_HAVE_WINDOW_WAYLAND && defined (HAVE_QT_WAYLAND) if (GST_IS_GL_DISPLAY_WAYLAND (this->priv->display)) { platform = GST_GL_PLATFORM_EGL; - gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); - gl_handle = gst_gl_context_get_current_gl_context (platform); - if (gl_handle) - this->priv->other_context = - gst_gl_context_new_wrapped (this->priv->display, gl_handle, - platform, gl_api); } #endif - #if GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_EGLFS) if (GST_IS_GL_DISPLAY_EGL (this->priv->display)) { platform = GST_GL_PLATFORM_EGL; - gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); - gl_handle = gst_gl_context_get_current_gl_context (platform); - if (gl_handle) - this->priv->other_context = - gst_gl_context_new_wrapped (this->priv->display, gl_handle, - platform, gl_api); } #endif - + if (platform == 0 && this->priv->display) { #if GST_GL_HAVE_WINDOW_COCOA && GST_GL_HAVE_PLATFORM_COCOA && defined (HAVE_QT_MAC) - if (this->priv->display) { platform = GST_GL_PLATFORM_CGL; - gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); - gl_handle = gst_gl_context_get_current_gl_context (platform); - if (gl_handle) - this->priv->other_context = - gst_gl_context_new_wrapped (this->priv->display, gl_handle, - platform, gl_api); - } -#endif -#if GST_GL_HAVE_WINDOW_EAGL && GST_GL_HAVE_PLATFORM_EAGL && defined (HAVE_QT_IOS) - if (this->priv->display) { +#elif GST_GL_HAVE_WINDOW_EAGL && GST_GL_HAVE_PLATFORM_EAGL && defined (HAVE_QT_IOS) platform = GST_GL_PLATFORM_EAGL; - gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); - gl_handle = gst_gl_context_get_current_gl_context (platform); - if (gl_handle) - this->priv->other_context = - gst_gl_context_new_wrapped (this->priv->display, gl_handle, - platform, gl_api); - } +#elif GST_GL_HAVE_WINDOW_WIN32 && GST_GL_HAVE_PLATFORM_WGL && defined (HAVE_QT_WIN32) + platform = GST_GL_PLATFORM_WGL; +#else + GST_ERROR ("Unknown platform"); + return; #endif + } + + gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL); + gl_handle = gst_gl_context_get_current_gl_context (platform); + if (gl_handle) + this->priv->other_context = + gst_gl_context_new_wrapped (this->priv->display, gl_handle, + platform, gl_api); (void) platform; (void) gl_api; @@ -402,6 +383,36 @@ QtGLVideoItem::onSceneGraphInitialized () this->priv->other_context = NULL; } else { gst_gl_display_filter_gl_api (this->priv->display, gst_gl_context_get_gl_api (this->priv->other_context)); +#if GST_GL_HAVE_WINDOW_WIN32 && GST_GL_HAVE_PLATFORM_WGL && defined (HAVE_QT_WIN32) + if (!wglGetProcAddress ("wglCreateContextAttribsARB")) { + GstGLWindow *window; + HDC device; + + /* If there's no wglCreateContextAttribsARB() support, then we would fallback to + * wglShareLists() which will fail with ERROR_BUSY (0xaa) if either of the GL + * contexts are current in any other thread. + * + * The workaround here is to temporarily disable Qt's GL context while we + * set up our own. + */ + this->priv->context = gst_gl_context_new (this->priv->display); + window = gst_gl_context_get_window (this->priv->context); + device = (HDC) gst_gl_window_get_display (window); + + wglMakeCurrent (device, 0); + gst_object_unref (window); + if (!gst_gl_context_create (this->priv->context, this->priv->other_context, &error)) { + GST_ERROR ("%p failed to create shared GL context: %s", this, error->message); + g_object_unref (this->priv->context); + this->priv->context = NULL; + g_object_unref (this->priv->other_context); + this->priv->other_context = NULL; + wglMakeCurrent (device, (HGLRC) gl_handle); + return; + } + wglMakeCurrent (device, (HGLRC) gl_handle); + } +#endif gst_gl_context_activate (this->priv->other_context, FALSE); m_openGlContextInitialized = true; } diff --git a/ext/qt/qtplugin.pro b/ext/qt/qtplugin.pro new file mode 100644 index 000000000..af1d8ddc1 --- /dev/null +++ b/ext/qt/qtplugin.pro @@ -0,0 +1,39 @@ +TEMPLATE = lib + +TARGET = libgstqtsink + +QT += qml quick widgets + +QT_CONFIG -= no-pkg-config +CONFIG += link_pkgconfig debug plugin +PKGCONFIG = \ + gstreamer-1.0 \ + gstreamer-video-1.0 \ + gstreamer-gl-1.0 + +DEFINES += \ + GST_USE_UNSTABLE_API \ + HAVE_QT_WIN32 \ + 'GST_PACKAGE_NAME=\"GStreamer Bad Plug-ins (qmake)\"' \ + 'GST_PACKAGE_ORIGIN=\"Unknown package origin\"' \ + 'GST_LICENSE=\"LGPL\"' \ + 'PACKAGE=\"gst-plugins-bad (qmake)\"' \ + 'PACKAGE_VERSION=\"1.9.0.1\"' + +SOURCES += \ + gstplugin.cc \ + gstqsgtexture.cc \ + gstqtsink.cc \ + qtitem.cc + +HEADERS += \ + gstqsgtexture.h \ + gstqtgl.h \ + gstqtsink.h \ + qtitem.h + +INCLUDEPATH += \ + $$(GSTREAMER_ROOT)/include \ + $$[QT_INSTALL_PREFIX]/include/QtGui/$$[QT_VERSION]/QtGui/ + +
\ No newline at end of file |