summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/directshow')
-rw-r--r--src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp4
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.cpp42
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.h10
-rw-r--r--src/plugins/directshow/player/player.pri7
4 files changed, 51 insertions, 12 deletions
diff --git a/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp b/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp
index 7bffe47d2..22771bd4c 100644
--- a/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp
+++ b/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp
@@ -49,10 +49,8 @@ DirectShowEvrVideoWindowControl::~DirectShowEvrVideoWindowControl()
IBaseFilter *DirectShowEvrVideoWindowControl::filter()
{
- static const GUID clsid_EnhancendVideoRenderer = { 0xfa10746c, 0x9b63, 0x4b6c, {0xbc, 0x49, 0xfc, 0x30, 0xe, 0xa5, 0xf2, 0x56} };
-
if (!m_evrFilter) {
- m_evrFilter = com_new<IBaseFilter>(clsid_EnhancendVideoRenderer);
+ m_evrFilter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer);
if (!setEvr(m_evrFilter)) {
m_evrFilter->Release();
m_evrFilter = NULL;
diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
index 6a1580ea5..6754c1852 100644
--- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
+++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
@@ -35,11 +35,21 @@
#include "videosurfacefilter.h"
+#ifdef CUSTOM_EVR_PRESENTER
+#include "evrcustompresenter.h"
+#endif
+
+#include <qabstractvideosurface.h>
+#include <QtMultimedia/private/qmediaopenglhelper_p.h>
+
DirectShowVideoRendererControl::DirectShowVideoRendererControl(DirectShowEventLoop *loop, QObject *parent)
: QVideoRendererControl(parent)
, m_loop(loop)
, m_surface(0)
, m_filter(0)
+#ifdef CUSTOM_EVR_PRESENTER
+ , m_evrPresenter(0)
+#endif
{
}
@@ -47,6 +57,10 @@ DirectShowVideoRendererControl::~DirectShowVideoRendererControl()
{
if (m_filter)
m_filter->Release();
+#ifdef CUSTOM_EVR_PRESENTER
+ if (m_evrPresenter)
+ m_evrPresenter->Release();
+#endif
}
QAbstractVideoSurface *DirectShowVideoRendererControl::surface() const
@@ -59,18 +73,34 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
if (surface != m_surface) {
m_surface = surface;
- VideoSurfaceFilter *existingFilter = m_filter;
+ IBaseFilter *currentFilter = m_filter;
+ m_filter = 0;
if (surface) {
- m_filter = new VideoSurfaceFilter(surface, m_loop);
- } else {
- m_filter = 0;
+#ifdef CUSTOM_EVR_PRESENTER
+ if (!surface->supportedPixelFormats(QAbstractVideoBuffer::GLTextureHandle).isEmpty()
+ && QMediaOpenGLHelper::isANGLE()) {
+ m_evrPresenter = new EVRCustomPresenter;
+ m_evrPresenter->setSurface(surface);
+ m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer);
+ if (!qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) {
+ m_evrPresenter->Release();
+ m_evrPresenter = 0;
+ m_filter->Release();
+ m_filter = 0;
+ }
+ }
+ if (!m_filter)
+#endif
+ {
+ m_filter = new VideoSurfaceFilter(surface, m_loop);
+ }
}
emit filterChanged();
- if (existingFilter)
- existingFilter->Release();
+ if (currentFilter)
+ currentFilter->Release();
}
}
diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h
index b4828d1b0..e6f0bb3af 100644
--- a/src/plugins/directshow/player/directshowvideorenderercontrol.h
+++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h
@@ -41,6 +41,10 @@
class DirectShowEventLoop;
class VideoSurfaceFilter;
+#ifdef CUSTOM_EVR_PRESENTER
+class EVRCustomPresenter;
+#endif
+
QT_USE_NAMESPACE
class DirectShowVideoRendererControl : public QVideoRendererControl
@@ -61,7 +65,11 @@ Q_SIGNALS:
private:
DirectShowEventLoop *m_loop;
QAbstractVideoSurface *m_surface;
- VideoSurfaceFilter *m_filter;
+ IBaseFilter *m_filter;
+
+#ifdef CUSTOM_EVR_PRESENTER
+ EVRCustomPresenter *m_evrPresenter;
+#endif
};
#endif
diff --git a/src/plugins/directshow/player/player.pri b/src/plugins/directshow/player/player.pri
index 8586ea5da..5ecb912b2 100644
--- a/src/plugins/directshow/player/player.pri
+++ b/src/plugins/directshow/player/player.pri
@@ -46,8 +46,11 @@ config_evr {
include($$PWD/../../common/evr.pri)
- HEADERS += $$PWD/directshowevrvideowindowcontrol.h
- SOURCES += $$PWD/directshowevrvideowindowcontrol.cpp
+ HEADERS += \
+ $$PWD/directshowevrvideowindowcontrol.h
+
+ SOURCES += \
+ $$PWD/directshowevrvideowindowcontrol.cpp
}
config_wshellitem {