diff options
author | Samuel Mira <samuel.mira@qt.io> | 2022-03-01 13:42:13 +0200 |
---|---|---|
committer | Samuel Mira <samuel.mira@qt.io> | 2022-03-02 11:25:20 +0200 |
commit | 84122f1b093136851a2eeeb3f14968039513193d (patch) | |
tree | 841ebc70fe53307f7d25191e72012057ffa87872 | |
parent | 91af68bdc0fca7b7b17559a02f02d9d09af7581c (diff) |
Fix android media plugin issues
Android Multimedia plugin was not able to create OpenGL context after
changing to plugin because the plugin changes the thread where the
plugin runs. This is due to being loaded at runtime. This patch fixes
this
by changing the thread to the OpenGL context thread if needed.
Also fixes a missing video output start that prevented the camera
preview to work.
Fixes: QTBUG-100773
Change-Id: I8bc2a3e87dedf2c54d20904afb8a68fdff2420ca
Reviewed-by: Pekka Gehör <pekka.gehor@qt.io>
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
(cherry picked from commit 34bdc50c8a74d92348970e943b80b278b08471d7)
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
-rw-r--r-- | src/multimedia/platform/android/common/qandroidvideooutput.cpp | 24 | ||||
-rw-r--r-- | src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp | 1 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src/multimedia/platform/android/common/qandroidvideooutput.cpp b/src/multimedia/platform/android/common/qandroidvideooutput.cpp index 6c15e8324..4e9a95269 100644 --- a/src/multimedia/platform/android/common/qandroidvideooutput.cpp +++ b/src/multimedia/platform/android/common/qandroidvideooutput.cpp @@ -259,22 +259,38 @@ void QAndroidTextureVideoOutput::reset() clearSurfaceTexture(); } +QOpenGLContext *getRhiOpenGLContext(QRhi *rhi) +{ + if (!rhi || rhi->backend() != QRhi::OpenGLES2) + return nullptr; + + auto nativeHandles = static_cast<const QRhiGles2NativeHandles *>(rhi->nativeHandles()); + if (!nativeHandles) + return nullptr; + + return nativeHandles->context; +} + void QAndroidTextureVideoOutput::onFrameAvailable() { if (!m_nativeSize.isValid() || !m_sink || !m_started) return; QRhi *rhi = m_sink ? m_sink->rhi() : nullptr; + + const auto context = getRhiOpenGLContext(rhi); + if (context && (thread() != context->thread())) { + parent()->moveToThread(context->thread()); + moveToThread(context->thread()); + } + auto *buffer = new AndroidTextureVideoBuffer(rhi, this, m_nativeSize); const QVideoFrameFormat::PixelFormat format = rhi ? QVideoFrameFormat::Format_SamplerExternalOES : QVideoFrameFormat::Format_RGBA8888; QVideoFrame frame(buffer, QVideoFrameFormat(m_nativeSize, format)); m_sink->platformVideoSink()->setVideoFrame(frame); - QMetaObject::invokeMethod(m_surfaceTexture - , "frameAvailable" - , Qt::QueuedConnection - ); + QMetaObject::invokeMethod(m_surfaceTexture, "frameAvailable", Qt::QueuedConnection); } static const float g_quad[] = { diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp index 5df959341..1c60789c2 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp @@ -409,6 +409,7 @@ bool QAndroidCameraSession::startPreview() m_camera->startPreview(); m_previewStarted = true; + m_videoOutput->start(); return true; } |