summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-09-14 11:59:15 +0200
committerArtem Dyomin <artem.dyomin@qt.io>2023-09-14 20:49:01 +0000
commit784692613b832b087997f6785eb8c890d3e1c824 (patch)
tree55a5c268a1dee2220c5a1a95f9b228d5c3ef33b8
parent82a3624ac4d0602f0d4f45aea0c537a88c34036e (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)
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegplaybackengine.cpp17
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegplaybackengine_p.h2
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp30
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"