diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-09-14 11:59:15 +0200 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2023-09-14 20:49:01 +0000 |
commit | 784692613b832b087997f6785eb8c890d3e1c824 (patch) | |
tree | 55a5c268a1dee2220c5a1a95f9b228d5c3ef33b8 | |
parent | 82a3624ac4d0602f0d4f45aea0c537a88c34036e (diff) |
Update videosink size before starting playing
QVideoWidget uses QVideoSink::videoSize as a size hint.
So we need to keep the videoSize up-to-date even before playback.
Task-number: QTBUG-116979
Change-Id: Iab8f5456e44d5309285aad98004be5d1ae07da11
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
(cherry picked from commit 0b590d7f26d5590b01c208eacd7270beb416115b)
3 files changed, 48 insertions, 1 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine.cpp b/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine.cpp index e72fa5015..74d70aa5a 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine.cpp @@ -5,6 +5,7 @@ #include "qvideosink.h" #include "qaudiooutput.h" #include "private/qplatformaudiooutput_p.h" +#include "private/qplatformvideosink_p.h" #include "qiodevice.h" #include "playbackengine/qffmpegdemuxer_p.h" #include "playbackengine/qffmpegstreamdecoder_p.h" @@ -455,6 +456,8 @@ bool PlaybackEngine::setMedia(const QUrl &media, QIODevice *stream) return false; } + updateVideoSinkSize(); + return true; } @@ -464,6 +467,7 @@ void PlaybackEngine::setVideoSink(QVideoSink *sink) if (prev == sink) return; + updateVideoSinkSize(prev); updateActiveVideoOutput(sink); if (!sink || !prev) { @@ -525,6 +529,7 @@ void PlaybackEngine::setActiveTrack(QPlatformMediaPlayer::TrackType trackType, i m_streams = defaultObjectsArray<decltype(m_streams)>(); m_demuxer.reset(); + updateVideoSinkSize(); createObjectsIfNeeded(); updateObjectsPausedState(); } @@ -566,6 +571,18 @@ void PlaybackEngine::updateActiveVideoOutput(QVideoSink *sink, bool cleanOutput) qobject_cast<VideoRenderer *>(m_renderers[QPlatformMediaPlayer::VideoStream].get())) renderer->setOutput(sink, cleanOutput); } + +void PlaybackEngine::updateVideoSinkSize(QVideoSink *prevSink) +{ + auto platformVideoSink = m_videoSink ? m_videoSink->platformVideoSink() : nullptr; + if (!platformVideoSink) + return; + + if (prevSink && prevSink->platformVideoSink()) + platformVideoSink->setNativeSize(prevSink->platformVideoSink()->nativeSize()); + else if (auto size = metaData().value(QMediaMetaData::Resolution); size.isValid()) + platformVideoSink->setNativeSize(size.value<QSize>()); +} } QT_END_NAMESPACE diff --git a/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine_p.h b/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine_p.h index 064734723..cbd3c47fc 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegplaybackengine_p.h @@ -177,6 +177,8 @@ private: bool hasRenderer(quint64 id) const; + void updateVideoSinkSize(QVideoSink *prevSink = nullptr); + private: TimeController m_timeController; diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index 952f9c6f1..c12b00e5a 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -10,6 +10,8 @@ #include <qvideoframe.h> #include <qaudiooutput.h> +#include <private/qplatformvideosink_p.h> + #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcomponent.h> #include <QtQml/qqmlproperty.h> @@ -85,6 +87,7 @@ private slots: void lazyLoadVideo(); void videoSinkSignals(); void nonAsciiFileName(); + void setMedia_setsVideoSinkSize_beforePlaying(); private: QUrl selectVideoFile(const QStringList& mediaCandidates); @@ -2118,6 +2121,10 @@ void tst_QMediaPlayerBackend::videoSinkSignals() std::atomic<int> videoFrameCounter = 0; std::atomic<int> videoSizeCounter = 0; + player.setSource(localVideoFile2); + + sink.platformVideoSink()->setNativeSize({}); // reset size to be able to check the size update + connect(&sink, &QVideoSink::videoFrameChanged, this, [&](const QVideoFrame &frame) { QCOMPARE(sink.videoFrame(), frame); QCOMPARE(sink.videoSize(), frame.size()); @@ -2130,7 +2137,6 @@ void tst_QMediaPlayerBackend::videoSinkSignals() ++videoSizeCounter; }, Qt::DirectConnection); - player.setSource(localVideoFile2); player.play(); QTRY_COMPARE_GE(videoFrameCounter, 2); @@ -2163,6 +2169,28 @@ void tst_QMediaPlayerBackend::nonAsciiFileName() QCOMPARE(errorOccurredSpy.size(), 0); } +void tst_QMediaPlayerBackend::setMedia_setsVideoSinkSize_beforePlaying() +{ + QVideoSink sink1; + QVideoSink sink2; + QMediaPlayer player; + + QSignalSpy spy1(&sink1, &QVideoSink::videoSizeChanged); + QSignalSpy spy2(&sink2, &QVideoSink::videoSizeChanged); + + player.setVideoOutput(&sink1); + QCOMPARE(sink1.videoSize(), QSize()); + + player.setSource(localVideoFile3ColorsWithSound); + QCOMPARE(sink1.videoSize(), QSize(684, 384)); + + player.setVideoOutput(&sink2); + QCOMPARE(sink2.videoSize(), QSize(684, 384)); + + QCOMPARE(spy1.size(), 1); + QCOMPARE(spy2.size(), 1); +} + QTEST_MAIN(tst_QMediaPlayerBackend) #include "tst_qmediaplayerbackend.moc" |