From 36549dbe148055d6ecf98952b05b4ff2310fe491 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 5 Nov 2015 13:48:40 +0100 Subject: 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 --- .../player/directshowevrvideowindowcontrol.cpp | 4 +-- .../player/directshowvideorenderercontrol.cpp | 42 ++++++++++++++++++---- .../player/directshowvideorenderercontrol.h | 10 +++++- src/plugins/directshow/player/player.pri | 7 ++-- 4 files changed, 51 insertions(+), 12 deletions(-) (limited to 'src/plugins/directshow/player') 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(clsid_EnhancendVideoRenderer); + m_evrFilter = com_new(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 +#include + 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(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 { -- cgit v1.2.3