summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartlomiej Moskal <bartlomiej.moskal@qt.io>2023-01-26 08:51:01 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-01-30 08:48:51 +0000
commit8b3364b5b486234904f0aeddb2d0d71be56e2bfc (patch)
treeb3cd0668eb0eed712fdedc592e6de92aa1b25c76
parentdfac09545438dac30278b91b6918c4fe0546cb30 (diff)
downloadqtmultimedia-8b3364b5b486234904f0aeddb2d0d71be56e2bfc.tar.gz
Android-Backend: update surfaceTexture with Rhi if needed
Regression appeared after bd2e80867e4e04fff277cf7340747630d2ea55a4 commit. Before this change, qandroidvideooutput did not create AndroidSurfaceTexture without QRhi. That's why creation was postopned and allows qandroidmediaplayer to try create surfaceTexture again during the Media setting. From one hand we need to allow to create surfaceTexture without QRhi. From the other hand we need to allow to recreate surfaceTexture if QVideoSink has an associated QRhi. To handle mentioned case shouldTextureBeUpdated() method was added to QAndroidTextureVideoOutput. Task-number: QTBUG-109731 Change-Id: Ic845647ab2a9823d02cfc7edb9c735499c3e563b Reviewed-by: Samuel Mira <samuel.mira@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> Reviewed-by: Lars Knoll <lars@knoll.priv.no> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> (cherry picked from commit f29bf9e033add62da509708e72bfb6359f1e3602) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/android/common/qandroidvideooutput.cpp18
-rw-r--r--src/plugins/multimedia/android/common/qandroidvideooutput_p.h2
-rw-r--r--src/plugins/multimedia/android/mediaplayer/qandroidmediaplayer.cpp3
3 files changed, 20 insertions, 3 deletions
diff --git a/src/plugins/multimedia/android/common/qandroidvideooutput.cpp b/src/plugins/multimedia/android/common/qandroidvideooutput.cpp
index 62959dba9..43f2cd760 100644
--- a/src/plugins/multimedia/android/common/qandroidvideooutput.cpp
+++ b/src/plugins/multimedia/android/common/qandroidvideooutput.cpp
@@ -362,14 +362,28 @@ void QAndroidTextureVideoOutput::setSubtitle(const QString &subtitle)
}
}
+bool QAndroidTextureVideoOutput::shouldTextureBeUpdated() const
+{
+ return m_sink->rhi() && m_surfaceCreatedWithoutRhi;
+}
+
AndroidSurfaceTexture *QAndroidTextureVideoOutput::surfaceTexture()
{
if (!m_sink)
return nullptr;
AndroidSurfaceTexture *surface = nullptr;
- QMetaObject::invokeMethod(m_surfaceThread.get(),
- [&](){ surface = m_surfaceThread->createSurfaceTexture(m_sink->rhi()); },
+ QMetaObject::invokeMethod(m_surfaceThread.get(), [&]() {
+ auto rhi = m_sink->rhi();
+ if (!rhi) {
+ m_surfaceCreatedWithoutRhi = true;
+ }
+ else if (m_surfaceCreatedWithoutRhi) {
+ m_surfaceThread->clearSurfaceTexture();
+ m_surfaceCreatedWithoutRhi = false;
+ }
+ surface = m_surfaceThread->createSurfaceTexture(rhi);
+ },
Qt::BlockingQueuedConnection);
return surface;
}
diff --git a/src/plugins/multimedia/android/common/qandroidvideooutput_p.h b/src/plugins/multimedia/android/common/qandroidvideooutput_p.h
index 81b2fb809..cc7e2413e 100644
--- a/src/plugins/multimedia/android/common/qandroidvideooutput_p.h
+++ b/src/plugins/multimedia/android/common/qandroidvideooutput_p.h
@@ -60,6 +60,7 @@ public:
~QAndroidTextureVideoOutput() override;
QVideoSink *surface() const { return m_sink; }
+ bool shouldTextureBeUpdated() const;
AndroidSurfaceTexture *surfaceTexture() override;
@@ -74,6 +75,7 @@ private Q_SLOTS:
private:
QVideoSink *m_sink = nullptr;
QSize m_nativeSize;
+ bool m_surfaceCreatedWithoutRhi = false;
std::unique_ptr<class AndroidTextureThread> m_surfaceThread;
};
diff --git a/src/plugins/multimedia/android/mediaplayer/qandroidmediaplayer.cpp b/src/plugins/multimedia/android/mediaplayer/qandroidmediaplayer.cpp
index 512523a20..d88bcbc27 100644
--- a/src/plugins/multimedia/android/mediaplayer/qandroidmediaplayer.cpp
+++ b/src/plugins/multimedia/android/mediaplayer/qandroidmediaplayer.cpp
@@ -272,7 +272,8 @@ void QAndroidMediaPlayer::setMedia(const QUrl &mediaContent,
if (mVideoSize.isValid() && mVideoOutput)
mVideoOutput->setVideoSize(mVideoSize);
- if ((mMediaPlayer->display() == 0) && mVideoOutput)
+ if (mVideoOutput &&
+ (mMediaPlayer->display() == 0 || mVideoOutput->shouldTextureBeUpdated()))
mMediaPlayer->setDisplay(mVideoOutput->surfaceTexture());
mMediaPlayer->setDataSource(QNetworkRequest(mediaContent));
mMediaPlayer->prepareAsync();