From 89e6018f6f45350924e3c5f7007f779b9ed4cdeb Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Fri, 27 Jul 2018 12:42:46 +0200 Subject: 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 Reviewed-by: Maurice Kalinowski --- src/plugins/directshow/camera/dscamerasession.cpp | 13 ++++++++++--- src/plugins/directshow/camera/dscamerasession.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src') 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 m_pendingImageProcessingParametrs; + friend class SampleGrabberCallbackPrivate; }; -- cgit v1.2.3