diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-08-09 10:52:00 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-08-09 12:10:06 +0000 |
commit | a2e3f84887cb4c9f9f392e6748d2442377af1f83 (patch) | |
tree | e154d68aa96f6ddaee569731f731bccc2655afb7 | |
parent | a68b9bc0c5e48792a0f0a588d756322a41e8f052 (diff) |
Fix corner cases in ffmpegaudioinput
* handle setting invalid frame size, that is possible with some
ffmpeg codecs (wav) on recording.
* fix the rare race condition of storing bufferSize between
twice loading of bufferSize on data writing.
Task-number: QTBUG-113247
Change-Id: I1cddbc47b2b7b5a45ca39f202543229f136547f2
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit 29657e7db96fd7db1ff58fdbbed2dbc3644fc96b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegaudioinput.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegaudioinput.cpp b/src/plugins/multimedia/ffmpeg/qffmpegaudioinput.cpp index 44e0c3981..0bc43e762 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegaudioinput.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegaudioinput.cpp @@ -4,6 +4,7 @@ #include <qiodevice.h> #include <qaudiosource.h> #include <qaudiobuffer.h> +#include <qatomic.h> #include <qdebug.h> QT_BEGIN_NAMESPACE @@ -34,8 +35,8 @@ public: } void setFrameSize(int frameSize) { - QMutexLocker locker(&m_mutex); - m_bufferSize = m_format.bytesForFrames(frameSize); + m_bufferSize.storeRelease(frameSize > 0 ? m_format.bytesForFrames(frameSize) + : DefaultAudioInputBufferSize); } void setRunning(bool r) { QMutexLocker locker(&m_mutex); @@ -56,7 +57,7 @@ public: QMetaObject::invokeMethod(this, "updateVolume"); } - int bufferSize() const { return m_bufferSize; } + int bufferSize() const { return m_bufferSize.loadAcquire(); } protected: qint64 readData(char *, qint64) override @@ -67,11 +68,12 @@ protected: { int l = len; while (len > 0) { - int toAppend = qMin(len, m_bufferSize - m_pcm.size()); + const auto bufferSize = m_bufferSize.loadAcquire(); + int toAppend = qMin(len, bufferSize - m_pcm.size()); m_pcm.append(data, toAppend); data += toAppend; len -= toAppend; - if (m_pcm.size() == m_bufferSize) + if (m_pcm.size() == bufferSize) sendBuffer(); } @@ -115,7 +117,7 @@ private: qint64 time = fmt.durationForBytes(m_processed); QAudioBuffer buffer(m_pcm, fmt, time); emit m_input->newAudioBuffer(buffer); - m_processed += m_bufferSize; + m_processed += m_pcm.size(); m_pcm.clear(); } @@ -128,7 +130,7 @@ private: QFFmpegAudioInput *m_input = nullptr; std::unique_ptr<QAudioSource> m_src; QAudioFormat m_format; - std::atomic<int> m_bufferSize = DefaultAudioInputBufferSize; + QAtomicInt m_bufferSize = DefaultAudioInputBufferSize; qint64 m_processed = 0; QByteArray m_pcm; }; |