diff options
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp')
-rw-r--r-- | src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp | 58 |
1 files changed, 7 insertions, 51 deletions
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp index f4434e549..2d943def2 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamerimagecapture.cpp @@ -74,10 +74,13 @@ QGstreamerImageCapture::QGstreamerImageCapture(QImageCapture *parent) encoder = QGstElement("jpegenc", "jpegEncoder"); muxer = QGstElement("jifmux", "jpegMuxer"); sink = QGstElement("fakesink","imageCaptureSink"); + // imageCaptureSink do not wait for a preroll buffer when going READY -> PAUSED + // as no buffer will arrive until capture() is called + sink.set("async", false); + bin.add(queue, videoConvert, encoder, muxer, sink); queue.link(videoConvert, encoder, muxer, sink); bin.addGhostPad(queue, "sink"); - bin.lockState(true); addProbeToPad(queue.staticPad("src").pad(), false); @@ -87,8 +90,7 @@ QGstreamerImageCapture::QGstreamerImageCapture(QImageCapture *parent) QGstreamerImageCapture::~QGstreamerImageCapture() { - if (m_session) - m_session->releaseVideoPad(videoSrcPad); + bin.setStateSync(GST_STATE_NULL); } bool QGstreamerImageCapture::isReadyForCapture() const @@ -149,10 +151,6 @@ int QGstreamerImageCapture::doCapture(const QString &fileName) // let one image pass the pipeline passImage = true; - link(); - - gstPipeline.dumpGraph("captureImage"); - emit readyForCaptureChanged(false); return m_lastId; } @@ -217,22 +215,12 @@ void QGstreamerImageCapture::setCaptureSession(QPlatformMediaCaptureSession *ses pendingImages.clear(); passImage = false; cameraActive = false; - gstPipeline.beginConfig(); - bin.setStateSync(GST_STATE_NULL); - gstPipeline.remove(bin); - gstPipeline.endConfig(); - gstPipeline = {}; } m_session = captureSession; if (!m_session) return; - gstPipeline = captureSession->pipeline(); - gstPipeline.beginConfig(); - gstPipeline.add(bin); - bin.setStateSync(GST_STATE_READY); - gstPipeline.endConfig(); connect(m_session, &QPlatformMediaCaptureSession::cameraChanged, this, &QGstreamerImageCapture::onCameraChanged); onCameraChanged(); } @@ -265,14 +253,14 @@ gboolean QGstreamerImageCapture::saveImageFilter(GstElement *element, Q_UNUSED(pad); QGstreamerImageCapture *capture = static_cast<QGstreamerImageCapture *>(appdata); + capture->passImage = false; + if (capture->pendingImages.isEmpty()) { - capture->unlink(); return true; } auto imageData = capture->pendingImages.dequeue(); if (imageData.filename.isEmpty()) { - capture->unlink(); return true; } @@ -294,41 +282,9 @@ gboolean QGstreamerImageCapture::saveImageFilter(GstElement *element, Q_ARG(QString, imageData.filename)); } - capture->unlink(); - return TRUE; } -void QGstreamerImageCapture::unlink() -{ - return; - if (passImage) - return; - if (gstPipeline.isNull()) - return; - gstPipeline.beginConfig(); - videoSrcPad.unlinkPeer(); - m_session->releaseVideoPad(videoSrcPad); - videoSrcPad = {}; - bin.setStateSync(GST_STATE_READY); - bin.lockState(true); - gstPipeline.endConfig(); -} - -void QGstreamerImageCapture::link() -{ - if (!(m_session && m_session->camera())) - return; - if (!bin.staticPad("sink").peer().isNull() || gstPipeline.isNull()) - return; - gstPipeline.beginConfig(); - videoSrcPad = m_session->getVideoPad(); - videoSrcPad.link(bin.staticPad("sink")); - bin.lockState(false); - bin.setState(GST_STATE_PAUSED); - gstPipeline.endConfig(); -} - QImageEncoderSettings QGstreamerImageCapture::imageSettings() const { return m_settings; |