diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-11-27 11:56:50 +0100 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2016-01-12 15:51:32 +0000 |
commit | c7397523e77578cf8f09ba3258791f68c34e2e5f (patch) | |
tree | 9c293c768038f74564d411cd27cff5ce22ed46ac /src/plugins/directshow/player/directshowvideorenderercontrol.cpp | |
parent | 36549dbe148055d6ecf98952b05b4ff2310fe491 (diff) |
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 <christian.stromme@theqtcompany.com>
Diffstat (limited to 'src/plugins/directshow/player/directshowvideorenderercontrol.cpp')
-rw-r--r-- | src/plugins/directshow/player/directshowvideorenderercontrol.cpp | 58 |
1 files changed, 23 insertions, 35 deletions
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 <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 { } @@ -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<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); - } - } + m_surface = surface; - emit filterChanged(); + if (m_surface) { +#ifdef HAVE_EVR + m_filter = com_new<IBaseFilter>(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() |