summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-08-09 10:52:00 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-08-09 12:10:06 +0000
commita2e3f84887cb4c9f9f392e6748d2442377af1f83 (patch)
treee154d68aa96f6ddaee569731f731bccc2655afb7
parenta68b9bc0c5e48792a0f0a588d756322a41e8f052 (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.cpp16
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;
};