summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2016-05-03 10:45:27 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2016-05-03 10:22:37 +0000
commit25d8db4dca34e276cd020fad2487e4af4eda997d (patch)
treec0d932ae3dc8fdc201b6e9fed3a8c7d92231f64c
parentaf250eadcb12b8d8e132e6a011e88a7b4e52a948 (diff)
downloadqtmultimedia-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>
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp39
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)));
}