diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-11-05 13:48:40 +0100 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2016-01-12 15:51:24 +0000 |
commit | 36549dbe148055d6ecf98952b05b4ff2310fe491 (patch) | |
tree | d7aa21a5efc2b9c80125e9ed4598188a0a11dec5 /src/plugins/directshow/player/directshowvideorenderercontrol.cpp | |
parent | 963a534e339c4515f0e1abf85c6e91ec3de145de (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/player/directshowvideorenderercontrol.cpp')
-rw-r--r-- | src/plugins/directshow/player/directshowvideorenderercontrol.cpp | 42 |
1 files changed, 36 insertions, 6 deletions
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(); } } |