diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-05-03 10:45:27 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-05-03 10:22:37 +0000 |
commit | 25d8db4dca34e276cd020fad2487e4af4eda997d (patch) | |
tree | c0d932ae3dc8fdc201b6e9fed3a8c7d92231f64c /src/plugins/directshow | |
parent | af250eadcb12b8d8e132e6a011e88a7b4e52a948 (diff) | |
download | qtmultimedia-25d8db4dca34e276cd020fad2487e4af4eda997d.tar.gz |
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 <yoann.lopes@qt.io>
Diffstat (limited to 'src/plugins/directshow')
-rw-r--r-- | src/plugins/directshow/player/directshowplayerservice.cpp | 39 |
1 files changed, 26 insertions, 13 deletions
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 <QtCore/qthread.h> #include <QtCore/qvarlengtharray.h> +#ifndef Q_CC_MINGW +# include <comdef.h> +#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))); } |