summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp')
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
index 57753f53d..f9bf9f6c2 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
@@ -83,6 +83,12 @@ void QGstreamerVideoOutput::setVideoSink(QVideoSink *sink)
sinkChanged();
}
+void QGstreamerVideoOutput::setPipeline(const QGstPipeline &pipeline)
+{
+ gstPipeline = pipeline;
+ stoppedStateHandler = gstPipeline.inStoppedState()->onValueChanged(std::function([this]() {updatePrerollFrame();}));
+}
+
void QGstreamerVideoOutput::setIsPreview()
{
// configures the queue to be fast and lightweight for camera preview
@@ -116,13 +122,24 @@ void QGstreamerVideoOutput::updateVideoSink(const QGstElement &sink)
pad.addProbe<&QGstreamerVideoOutput::prepareVideoOutputChange>(this, GstPadProbeType(GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BLOCKING));
}
+void QGstreamerVideoOutput::updatePrerollFrame()
+{
+ bool stopped = true;
+ if (!gstPipeline.isNull() && !*gstPipeline.inStoppedState())
+ stopped = false;
+ if (!isFakeSink)
+ videoSink.set("show-preroll-frame", !stopped);
+}
+
void QGstreamerVideoOutput::sinkChanged()
{
QGstElement gstSink;
if (m_videoWindow) {
gstSink = m_videoWindow->gstSink();
+ isFakeSink = false;
} else {
gstSink = QGstElement("fakesink", "fakevideosink");
+ isFakeSink = true;
}
qDebug() << "sinkChanged" << gstSink.name();
updateVideoSink(gstSink);
@@ -140,6 +157,7 @@ void QGstreamerVideoOutput::changeVideoOutput()
videoSink.setState(GST_STATE_NULL);
gstVideoOutput.remove(videoSink);
videoSink = newVideoSink;
+ updatePrerollFrame();
videoConvert.link(videoSink);
GstEvent *event = gst_event_new_reconfigure();
gst_element_send_event(videoSink.element(), event);