summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-04-30 17:20:52 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-07 11:10:15 +0000
commit6f0de93bd6e41a0a0393d07b20a6f4af90193ab0 (patch)
tree62fda1bddcf08b5e7065e5ba3eed0a5b322da62a /src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp
parent7b965a3d68423ab612e6ef9219a528b73fcaa2d9 (diff)
Pass the remaining mediaplayerbackend autotests
* Add a notification mechanism to the pipeline so the video output knows when QMediaPlayer is in a stopped state (using QProperty), as we want the pipeline to be in a paused state internally, but not get preroll frames if we're in paused externally. * Properly emit metadataChanged() signals, and ensure we're in GST_STATE_PAUSED before trying a seek. Change-Id: I1cad557e648f82909a63cba8d6144df8476524f5 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
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);