diff options
author | Tim Blechmann <[email protected]> | 2025-07-09 11:08:33 +0800 |
---|---|---|
committer | Tim Blechmann <[email protected]> | 2025-07-10 08:16:06 +0800 |
commit | b86f3d53f7bb7faecedc0ddbee95638fcee05076 (patch) | |
tree | 3a09dcecc42c196840ca6e073b0d7cd10da9ce31 | |
parent | 9c615cdd4fc91c8328dc7fc4bd1d8347c496643b (diff) |
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.cpp | 5 |
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; |