diff options
author | Lauri Laanmets <lauri.laanmets@eesti.ee> | 2022-12-14 11:44:21 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-01-06 19:49:22 +0000 |
commit | 2079605239b871f8a927ebdeb6fbea5655dcb1b8 (patch) | |
tree | 576486b3083cb6a572c49db516196fa3de645068 /src | |
parent | 31411c025a823536c5b4e5da6230eab728bbe344 (diff) |
Correctly finish, clear and delete AndroidTextureThread
'QAndroidTextureVideoOutput' destructor waited for 'm_surfaceThread' to
be finished but seems that this thread was nowhere requested to finish.
In addition, 'AndroidTextureThread' created 'std::unique_ptr<QRhi> m_rhi;'
in it's own thread but didn't reset it. Thus, deleting the whole
'AndroidTextureThread' from another thread, started deleting it and
failed.
Task-number: QTBUG-109168
Change-Id: I9e12228c579457710c4fe5d8185bffabf9f3755a
Reviewed-by: Samuel Mira <samuel.mira@qt.io>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit d4e02d9efd6e8e41aa1a83c0f3d6534d138e7ae3)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/multimedia/android/common/qandroidvideooutput.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/plugins/multimedia/android/common/qandroidvideooutput.cpp b/src/plugins/multimedia/android/common/qandroidvideooutput.cpp index 38029c479..7cd0c9242 100644 --- a/src/plugins/multimedia/android/common/qandroidvideooutput.cpp +++ b/src/plugins/multimedia/android/common/qandroidvideooutput.cpp @@ -267,12 +267,15 @@ public: public slots: void onFrameAvailable() { - m_surfaceTexture->updateTexImage(); - auto matrix = extTransformMatrix(m_surfaceTexture.get()); - auto tex = m_textureCopy->copyExternalTexture(m_size, matrix); - auto *buffer = new AndroidTextureVideoBuffer(m_rhi.get(), std::move(tex), m_size); - QVideoFrame frame(buffer, QVideoFrameFormat(m_size, QVideoFrameFormat::Format_RGBA8888)); - emit newFrame(frame); + // Check if 'm_surfaceTexture' is not reset because there can be pending frames in queue. + if (m_surfaceTexture) { + m_surfaceTexture->updateTexImage(); + auto matrix = extTransformMatrix(m_surfaceTexture.get()); + auto tex = m_textureCopy->copyExternalTexture(m_size, matrix); + auto *buffer = new AndroidTextureVideoBuffer(m_rhi.get(), std::move(tex), m_size); + QVideoFrame frame(buffer, QVideoFrameFormat(m_size, QVideoFrameFormat::Format_RGBA8888)); + emit newFrame(frame); + } } void clearFrame() { emit newFrame({}); } @@ -284,6 +287,7 @@ public slots: m_surfaceTexture.reset(); m_texture.reset(); m_textureCopy.reset(); + m_rhi.reset(); } AndroidSurfaceTexture *createSurfaceTexture(QRhi *rhi) @@ -328,8 +332,8 @@ QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QVideoSink *sink, QObject : QAndroidVideoOutput(parent) , m_sink(sink) { - if (!m_sink || !m_sink->rhi()) { - qDebug() << "Cannot create QAndroidTextureVideoOutput without a sink and a rhi"; + if (!m_sink) { + qDebug() << "Cannot create QAndroidTextureVideoOutput without a sink."; m_surfaceThread = nullptr; return; } @@ -344,8 +348,9 @@ QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QVideoSink *sink, QObject QAndroidTextureVideoOutput::~QAndroidTextureVideoOutput() { - if (m_surfaceThread) - m_surfaceThread->wait(); + QMetaObject::invokeMethod(m_surfaceThread.get(), &AndroidTextureThread::clearSurfaceTexture); + m_surfaceThread->quit(); + m_surfaceThread->wait(); } void QAndroidTextureVideoOutput::setSubtitle(const QString &subtitle) |