diff --git a/plugins/multimedia/directshow/player/directshowplayerservice.cpp b/plugins/multimedia/directshow/player/directshowplayerservice.cpp index 4fcf62a..25fa8ed 100644 --- a/plugins/multimedia/directshow/player/directshowplayerservice.cpp +++ b/plugins/multimedia/directshow/player/directshowplayerservice.cpp @@ -265,6 +265,10 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) { + // This can happen in certain error situations. Return now to avoid a crash. + if (!m_graph) + return; + IBaseFilter *source = 0; QMediaResource resource = m_resources.takeFirst(); @@ -441,7 +445,9 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) locker->unlock(); HRESULT hr; if (SUCCEEDED(hr = graph->RenderEx( - pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0))) { + pin, + /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, + 0))) { rendered = true; } else if (renderHr == S_OK || renderHr == VFW_E_NO_DECOMPRESSOR){ renderHr = hr; @@ -493,6 +499,11 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) m_error = QMediaPlayer::FormatError; m_errorString = QString(); break; + case VFW_E_CANNOT_RENDER: + m_error = QMediaPlayer::ResourceError; + m_errorString = QString("DirectShowPlayerService::doRender: No combination of filters could be found to render the media stream."); + qWarning() << m_errorString; + break; default: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); diff --git a/plugins/multimedia/directshow/player/directshowvideorenderercontrol.cpp b/plugins/multimedia/directshow/player/directshowvideorenderercontrol.cpp index 7a8e497..390ca70 100644 --- a/plugins/multimedia/directshow/player/directshowvideorenderercontrol.cpp +++ b/plugins/multimedia/directshow/player/directshowvideorenderercontrol.cpp @@ -53,7 +53,8 @@ DirectShowVideoRendererControl::DirectShowVideoRendererControl(DirectShowEventLo DirectShowVideoRendererControl::~DirectShowVideoRendererControl() { - delete m_filter; + if (m_filter) + m_filter->Release(); } QAbstractVideoSurface *DirectShowVideoRendererControl::surface() const diff --git a/plugins/multimedia/directshow/player/videosurfacefilter.cpp b/plugins/multimedia/directshow/player/videosurfacefilter.cpp index 7d0d105..81ebc40 100644 --- a/plugins/multimedia/directshow/player/videosurfacefilter.cpp +++ b/plugins/multimedia/directshow/player/videosurfacefilter.cpp @@ -77,7 +77,7 @@ VideoSurfaceFilter::VideoSurfaceFilter( VideoSurfaceFilter::~VideoSurfaceFilter() { - Q_ASSERT(m_ref == 1); + Q_ASSERT(m_ref == 0); } HRESULT VideoSurfaceFilter::QueryInterface(REFIID riid, void **ppvObject) @@ -119,7 +119,9 @@ ULONG VideoSurfaceFilter::Release() { ULONG ref = InterlockedDecrement(&m_ref); - Q_ASSERT(ref != 0); + if (ref == 0) { + delete this; + } return ref; } diff --git a/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp b/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp index 6fa2042..fffaf80 100644 --- a/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp +++ b/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp @@ -118,7 +118,7 @@ void QHoverSensorGestureRecognizer::orientationReadingChanged(QOrientationReadin void QHoverSensorGestureRecognizer::irProximityReadingChanged(QProximityReading *reading) { -#warning FIXME +//#warning FIXME MSVC 2008 does not recognize this directive // reflectance = reading->reflectance(); // if (reflectance == 0) // return;