summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2015-11-05 13:48:40 +0100
committerYoann Lopes <yoann.lopes@theqtcompany.com>2016-01-12 15:51:24 +0000
commit36549dbe148055d6ecf98952b05b4ff2310fe491 (patch)
treed7aa21a5efc2b9c80125e9ed4598188a0a11dec5 /src/plugins/directshow
parent963a534e339c4515f0e1abf85c6e91ec3de145de (diff)
DirectShow: use the EVR in the renderer control.
As for the window control, the existing code from the WMF plugin has been refactored out and is now shared for both plugins. This enables HW-accelerated video decoding in QML, QGraphicsVideoItem and custom QAbstractVideoSurfaces (Angle is required). Task-number: QTBUG-45593 Change-Id: I1d4dbf5695cdd4dbee93f9f4a957fa4d813aa85d Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
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 {