From 8b3364b5b486234904f0aeddb2d0d71be56e2bfc Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Thu, 26 Jan 2023 08:51:01 +0100 Subject: 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 Reviewed-by: Artem Dyomin Reviewed-by: Lars Knoll Reviewed-by: Assam Boudjelthia (cherry picked from commit f29bf9e033add62da509708e72bfb6359f1e3602) Reviewed-by: Qt Cherry-pick Bot --- .../multimedia/android/common/qandroidvideooutput.cpp | 18 ++++++++++++++++-- .../multimedia/android/common/qandroidvideooutput_p.h | 2 ++ .../android/mediaplayer/qandroidmediaplayer.cpp | 3 ++- 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 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(); -- cgit v1.2.3