From c7397523e77578cf8f09ba3258791f68c34e2e5f Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 27 Nov 2015 11:56:50 +0100 Subject: Windows: Improve EVR presenter. Removed hard dependency to Angle; it's now required only when rendering to a texture. If Angle is not used, the buffers are now mappable to system memory. This enables HW-accelerated video decoding in QML for non-ANGLE builds. Note that the frame data have to do a round-trip through system memory, which is not ideal but still faster than SW decoding. Task-number: QTBUG-45593 Change-Id: Icc3503142df4e8dbb53b4e11f409b161fd2f9bde Reviewed-by: Christian Stromme --- .../player/directshowvideorenderercontrol.cpp | 58 +++++++++------------- 1 file changed, 23 insertions(+), 35 deletions(-) (limited to 'src/plugins/directshow/player/directshowvideorenderercontrol.cpp') diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index 6754c1852..027d2ce55 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -35,21 +35,17 @@ #include "videosurfacefilter.h" -#ifdef CUSTOM_EVR_PRESENTER +#ifdef HAVE_EVR #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 { } @@ -57,10 +53,6 @@ DirectShowVideoRendererControl::~DirectShowVideoRendererControl() { if (m_filter) m_filter->Release(); -#ifdef CUSTOM_EVR_PRESENTER - if (m_evrPresenter) - m_evrPresenter->Release(); -#endif } QAbstractVideoSurface *DirectShowVideoRendererControl::surface() const @@ -70,38 +62,34 @@ QAbstractVideoSurface *DirectShowVideoRendererControl::surface() const void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) { - if (surface != m_surface) { - m_surface = surface; + if (m_surface == surface) + return; - IBaseFilter *currentFilter = m_filter; + if (m_filter) { + m_filter->Release(); m_filter = 0; + } - if (surface) { -#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); - } - } + m_surface = surface; - emit filterChanged(); + if (m_surface) { +#ifdef HAVE_EVR + m_filter = com_new(clsid_EnhancedVideoRenderer); + EVRCustomPresenter *evrPresenter = new EVRCustomPresenter(m_surface); + if (!evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, evrPresenter)) { + m_filter->Release(); + m_filter = 0; + } + evrPresenter->Release(); - if (currentFilter) - currentFilter->Release(); + if (!m_filter) +#endif + { + m_filter = new VideoSurfaceFilter(m_surface, m_loop); + } } + + emit filterChanged(); } IBaseFilter *DirectShowVideoRendererControl::filter() -- cgit v1.2.3