diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-04-30 17:20:52 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-07 11:10:15 +0000 |
commit | 6f0de93bd6e41a0a0393d07b20a6f4af90193ab0 (patch) | |
tree | 62fda1bddcf08b5e7065e5ba3eed0a5b322da62a /src/multimedia/platform/gstreamer/common/qgstreamervideooutput.cpp | |
parent | 7b965a3d68423ab612e6ef9219a528b73fcaa2d9 (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.cpp | 18 |
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); |