From 25d8db4dca34e276cd020fad2487e4af4eda997d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 3 May 2016 10:45:27 +0200 Subject: DirectShow: Improve error handling. Retrieve COM error via struct _com_error and output a qWarning() whenever a QMediaPlayer::ResourceError occurs. Task-number: QTBUG-53114 Change-Id: I3eceafeade60dd35e6c570499cef6093b49d737d Reviewed-by: Yoann Lopes --- .../directshow/player/directshowplayerservice.cpp | 39 ++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'src/plugins/directshow/player') diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 7c2cd8a9a..05ea3e68f 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -72,8 +72,22 @@ #include #include +#ifndef Q_CC_MINGW +# include +#endif + Q_GLOBAL_STATIC(DirectShowEventLoop, qt_directShowEventLoop) +static QString comError(HRESULT hr) +{ +#ifndef Q_CC_MINGW // MinGW 5.3 no longer has swprintf_s(). + _com_error error(hr); + return QString::fromWCharArray(error.ErrorMessage()); +#else + Q_UNUSED(hr) + return QString(); +#endif +} // QMediaPlayer uses millisecond time units, direct show uses 100 nanosecond units. static const int qt_directShowTimeScale = 10000; @@ -368,17 +382,11 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) m_error = QMediaPlayer::FormatError; m_errorString = QString(); break; - case E_FAIL: - case E_OUTOFMEMORY: - case VFW_E_CANNOT_LOAD_SOURCE_FILTER: - case VFW_E_NOT_FOUND: - m_error = QMediaPlayer::ResourceError; - m_errorString = QString(); - break; default: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); - qWarning("DirectShowPlayerService::doSetUrlSource: Unresolved error code %x", uint(hr)); + qWarning("DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x%x (%s)", + uint(hr), qPrintable(comError(hr))); break; } @@ -392,7 +400,8 @@ void DirectShowPlayerService::doSetStreamSource(QMutexLocker *locker) DirectShowIOSource *source = new DirectShowIOSource(m_loop); source->setDevice(m_stream); - if (SUCCEEDED(m_graph->AddFilter(source, L"Source"))) { + const HRESULT hr = m_graph->AddFilter(source, L"Source"); + if (SUCCEEDED(hr)) { m_executedTasks = SetSource; m_pendingTasks |= Render; @@ -413,6 +422,8 @@ void DirectShowPlayerService::doSetStreamSource(QMutexLocker *locker) m_error = QMediaPlayer::ResourceError; m_errorString = QString(); + qWarning("DirectShowPlayerService::doPlay: Unresolved error code 0x%x (%s)", + uint(hr), qPrintable(comError(hr))); QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); } @@ -528,8 +539,8 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) default: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); - qWarning("DirectShowPlayerService::doRender: Unresolved error code %x", - uint(renderHr)); + qWarning("DirectShowPlayerService::doRender: Unresolved error code 0x%x (%s)", + uint(renderHr), qPrintable(comError(renderHr))); } } @@ -740,7 +751,8 @@ void DirectShowPlayerService::doPlay(QMutexLocker *locker) } else { m_error = QMediaPlayer::ResourceError; m_errorString = QString(); - qWarning("DirectShowPlayerService::doPlay: Unresolved error code %x", uint(hr)); + qWarning("DirectShowPlayerService::doPlay: Unresolved error code 0x%x (%s)", + uint(hr), qPrintable(comError(hr))); QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); } @@ -799,7 +811,8 @@ void DirectShowPlayerService::doPause(QMutexLocker *locker) } else { m_error = QMediaPlayer::ResourceError; m_errorString = QString(); - qWarning("DirectShowPlayerService::doPause: Unresolved error code %x", uint(hr)); + qWarning("DirectShowPlayerService::doPause: Unresolved error code 0x%x (%s)", + uint(hr), qPrintable(comError(hr))); QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); } -- cgit v1.2.3