diff options
author | Bartlomiej Moskal <bartlomiej.moskal@qt.io> | 2023-01-26 08:51:01 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-30 08:48:51 +0000 |
commit | 8b3364b5b486234904f0aeddb2d0d71be56e2bfc (patch) | |
tree | b3cd0668eb0eed712fdedc592e6de92aa1b25c76 | |
parent | dfac09545438dac30278b91b6918c4fe0546cb30 (diff) | |
download | qtmultimedia-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>
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(); |