diff options
Diffstat (limited to 'src/multimedia/video/qvideoframe.cpp')
-rw-r--r-- | src/multimedia/video/qvideoframe.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/multimedia/video/qvideoframe.cpp b/src/multimedia/video/qvideoframe.cpp index 348baf023..7f93882bb 100644 --- a/src/multimedia/video/qvideoframe.cpp +++ b/src/multimedia/video/qvideoframe.cpp @@ -427,6 +427,15 @@ bool QVideoFrame::map(QVideoFrame::MapMode mode) } d->mappedCount++; + + // unlock mapMutex to avoid potential deadlock imageMutex <--> mapMutex + lock.unlock(); + + if ((mode & QVideoFrame::WriteOnly) != 0) { + QMutexLocker lock(&d->imageMutex); + d->image = {}; + } + return true; } @@ -648,10 +657,12 @@ QImage QVideoFrame::toImage() const if (!isValid()) return {}; - std::call_once(d->imageOnceFlag, [this]() { + QMutexLocker lock(&d->imageMutex); + + if (d->image.isNull()) { const bool mirrorY = surfaceFormat().scanLineDirection() != QVideoFrameFormat::TopToBottom; d->image = qImageFromVideoFrame(*this, QtVideo::Rotation(rotationAngle()), mirrored(), mirrorY); - }); + } return d->image; } |