summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mira <samuel.mira@qt.io>2022-03-01 13:42:13 +0200
committerSamuel Mira <samuel.mira@qt.io>2022-03-02 11:25:20 +0200
commit84122f1b093136851a2eeeb3f14968039513193d (patch)
tree841ebc70fe53307f7d25191e72012057ffa87872
parent91af68bdc0fca7b7b17559a02f02d9d09af7581c (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.cpp24
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp1
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;
}