summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <[email protected]>2025-07-09 11:08:33 +0800
committerTim Blechmann <[email protected]>2025-07-10 08:16:06 +0800
commitb86f3d53f7bb7faecedc0ddbee95638fcee05076 (patch)
tree3a09dcecc42c196840ca6e073b0d7cd10da9ce31
parent9c615cdd4fc91c8328dc7fc4bd1d8347c496643b (diff)
QWindowsResampler: overallocate output bufferHEADdev
The estimation based on duration does incur rounding errors, which can lead us to call IMFTransform::ProcessOutput more than necessary. so we slightly overallocate the output buffer, as that will avoid unnecessary calls. Pick-to: 6.8 6.9 6.10 Change-Id: Ic259022e4adaf018d0fa4780c3f2b4174d99c322 Reviewed-by: Artem Dyomin <[email protected]>
-rw-r--r--src/multimedia/windows/qwindowsresampler.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/multimedia/windows/qwindowsresampler.cpp b/src/multimedia/windows/qwindowsresampler.cpp
index 5a1fec8d0..f172579da 100644
--- a/src/multimedia/windows/qwindowsresampler.cpp
+++ b/src/multimedia/windows/qwindowsresampler.cpp
@@ -5,6 +5,7 @@
#include <QtCore/qloggingcategory.h>
#include <QtCore/private/qsystemerror_p.h>
+#include <QtMultimedia/private/qaudio_alignment_support_p.h>
#include <QtMultimedia/private/qwindowsaudioutils_p.h>
#include <wmcodecdsp.h>
@@ -92,6 +93,10 @@ HRESULT QWindowsResampler::processOutput(QByteArray &out)
if (m_resamplerNeedsSampleBuffer) {
auto expectedOutputSize = outputBufferSize(m_totalInputBytes) - m_totalOutputBytes;
+ // we may have some rounding errors, so we over-allocate by 10ms
+ expectedOutputSize += m_outputFormat.bytesForDuration(10000);
+ expectedOutputSize = QtMultimediaPrivate::alignUp(expectedOutputSize, 1024);
+
HRESULT hr = m_wmf->mfCreateMemoryBuffer(expectedOutputSize, buffer.GetAddressOf());
if (FAILED(hr))
return hr;