summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2018-07-27 12:42:46 +0200
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2018-08-02 08:28:46 +0000
commit89e6018f6f45350924e3c5f7007f779b9ed4cdeb (patch)
treed9fceda148eb108d2a8e818ec88c726e17055625
parent7936c055b6becd8e291a93c1d9955a0f460e2d6c (diff)
DirectShow: Postpone setting camera image processing param if not ready
Setting camera image processing parameters fails if the graph builder is not ready. We avoid this race condition by having a list of pending parameter changes which is applied when graph builder has been created. Task-number: QTBUG-69143 Change-Id: I5702ea5a2dceacff333fcf8dce05372a0208b8d9 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp13
-rw-r--r--src/plugins/directshow/camera/dscamerasession.h2
2 files changed, 12 insertions, 3 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index ca3c47cb8..324ab44e2 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -208,8 +208,8 @@ QVariant DSCameraSession::imageProcessingParameter(
QCameraImageProcessingControl::ProcessingParameter parameter) const
{
if (!m_graphBuilder) {
- qWarning() << "failed to access to the graph builder";
- return QVariant();
+ auto it = m_pendingImageProcessingParametrs.find(parameter);
+ return it != m_pendingImageProcessingParametrs.end() ? it.value() : QVariant();
}
const QCameraImageProcessingControl::ProcessingParameter resultingParameter =
@@ -249,7 +249,7 @@ void DSCameraSession::setImageProcessingParameter(
const QVariant &value)
{
if (!m_graphBuilder) {
- qWarning() << "failed to access to the graph builder";
+ m_pendingImageProcessingParametrs.insert(parameter, value);
return;
}
@@ -960,6 +960,13 @@ void DSCameraSession::updateImageProcessingParametersInfos()
}
pVideoProcAmp->Release();
+
+ for (auto it = m_pendingImageProcessingParametrs.cbegin();
+ it != m_pendingImageProcessingParametrs.cend();
+ ++it) {
+ setImageProcessingParameter(it.key(), it.value());
+ }
+ m_pendingImageProcessingParametrs.clear();
}
bool DSCameraSession::connectGraph()
diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h
index 07c3d9ef9..c3be6144e 100644
--- a/src/plugins/directshow/camera/dscamerasession.h
+++ b/src/plugins/directshow/camera/dscamerasession.h
@@ -230,6 +230,8 @@ private:
// Internal state
QCamera::Status m_status;
+ QMap<QCameraImageProcessingControl::ProcessingParameter, QVariant> m_pendingImageProcessingParametrs;
+
friend class SampleGrabberCallbackPrivate;
};