diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp index ec835120..30b1012b 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp @@ -773,6 +773,11 @@ QGstreamerCaptureSession::State QGstreamerCaptureSession::state() const return m_state; } +QGstreamerCaptureSession::State QGstreamerCaptureSession::pendingState() const +{ + return m_pendingState; +} + void QGstreamerCaptureSession::setState(QGstreamerCaptureSession::State newState) { if (newState == m_pendingState && !m_waitingForEos) diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.h b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.h index c72d2f29..7c88ce23 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.h +++ b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.h @@ -127,6 +127,8 @@ public: void captureImage(int requestId, const QString &fileName); State state() const; + State pendingState() const; + qint64 duration() const; bool isMuted() const { return m_muted; } diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp index a433ac2f..e9fc3a33 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamerimagecapturecontrol.cpp @@ -63,6 +63,21 @@ bool QGstreamerImageCaptureControl::isReadyForCapture() const int QGstreamerImageCaptureControl::capture(const QString &fileName) { + m_lastId++; + + //it's allowed to request image capture while camera is starting + if (m_session->pendingState() == QGstreamerCaptureSession::StoppedState || + !(m_session->captureMode() & QGstreamerCaptureSession::Image)) { + //emit error in the next event loop, + //so application can associate it with returned request id. + QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, + Q_ARG(int, m_lastId), + Q_ARG(int, QCameraImageCapture::NotReadyError), + Q_ARG(QString,tr("Not ready to capture"))); + + return m_lastId; + } + QString path = fileName; if (path.isEmpty()) { int lastImage = 0; @@ -77,7 +92,6 @@ int QGstreamerImageCaptureControl::capture(const QString &fileName) 10, QLatin1Char('0')); } - m_lastId++; m_session->captureImage(m_lastId, path); @@ -91,7 +105,9 @@ void QGstreamerImageCaptureControl::cancelCapture() void QGstreamerImageCaptureControl::updateState() { - bool ready = m_session->state() == QGstreamerCaptureSession::PreviewState; + bool ready = (m_session->state() == QGstreamerCaptureSession::PreviewState) && + (m_session->captureMode() & QGstreamerCaptureSession::Image); + if (m_ready != ready) { emit readyForCaptureChanged(m_ready = ready); }