10#include <mftransform.h>
15QUuid qIID_IMFTransform(0xbf94c121, 0x5b05, 0x4e6f, 0x80,0x00, 0xba,0x59,0x89,0x61,0x41,0x4d);
25 m_resampler->AddInputStreams(1, &m_inputStreamID);
48 ComPtr<IMFSample> sample;
53 ComPtr<IMFMediaBuffer>
buffer;
61 hr =
buffer->Lock(&
data, &maxLen, ¤tLen);
71 hr =
buffer->SetCurrentLength(
in.size());
75 hr = sample->AddBuffer(
buffer.Get());
79 return m_resampler->ProcessInput(m_inputStreamID, sample.Get(), 0);
84 ComPtr<IMFSample> sample;
85 ComPtr<IMFMediaBuffer>
buffer;
87 if (m_resamplerNeedsSampleBuffer) {
92 auto expectedOutputSize =
outputBufferSize(m_totalInputBytes) - m_totalOutputBytes;
97 hr = sample->AddBuffer(
buffer.Get());
104 MFT_OUTPUT_DATA_BUFFER outputDataBuffer;
105 outputDataBuffer.dwStreamID = 0;
107 outputDataBuffer.pEvents =
nullptr;
108 outputDataBuffer.dwStatus = 0;
109 outputDataBuffer.pSample = m_resamplerNeedsSampleBuffer ? sample.Get() :
nullptr;
111 hr = m_resampler->ProcessOutput(0, 1, &outputDataBuffer, &status);
113 ComPtr<IMFMediaBuffer> outputBuffer;
114 outputDataBuffer.pSample->ConvertToContiguousBuffer(outputBuffer.GetAddressOf());
116 BYTE *
data =
nullptr;
117 hr = outputBuffer->Lock(&
data,
nullptr, &
len);
120 outputBuffer->Unlock();
122 }
while (SUCCEEDED(hr));
124 if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
132 m_totalInputBytes +=
in.size();
134 if (m_inputFormat == m_outputFormat) {
135 m_totalOutputBytes +=
in.size();
136 return {
in.data(),
in.size()};
144 hr = processOutput(
out);
147 qCWarning(qLcAudioResampler) <<
"Resampling failed" << hr;
149 m_totalOutputBytes +=
out.size();
158 DWORD totalLength = 0;
159 HRESULT hr = sample->GetTotalLength(&totalLength);
163 m_totalInputBytes += totalLength;
167 if (m_inputFormat == m_outputFormat) {
168 ComPtr<IMFMediaBuffer> outputBuffer;
169 sample->ConvertToContiguousBuffer(outputBuffer.GetAddressOf());
171 BYTE *
data =
nullptr;
172 hr = outputBuffer->Lock(&
data,
nullptr, &
len);
175 outputBuffer->Unlock();
180 hr = m_resampler->ProcessInput(m_inputStreamID, sample, 0);
182 hr = processOutput(
out);
185 qCWarning(qLcAudioResampler) <<
"Resampling failed" << hr;
188 m_totalOutputBytes +=
out.size();
195 qCDebug(qLcAudioResampler) <<
"Setup audio resampler" << fin <<
"->" << fout;
197 m_totalInputBytes = 0;
198 m_totalOutputBytes = 0;
201 qCDebug(qLcAudioResampler) <<
"Pass through mode";
203 m_outputFormat = fout;
207 if (!m_resampler || !m_wmf)
213 HRESULT hr = m_resampler->SetInputType(m_inputStreamID, min.Get(), 0);
215 qCWarning(qLcAudioResampler) <<
"Failed to set input type" << hr;
219 hr = m_resampler->SetOutputType(0, mout.Get(), 0);
221 qCWarning(qLcAudioResampler) <<
"Failed to set output type" << hr;
225 MFT_OUTPUT_STREAM_INFO streamInfo;
226 hr = m_resampler->GetOutputStreamInfo(0, &streamInfo);
228 qCWarning(qLcAudioResampler) <<
"Could not obtain stream info" << hr;
232 m_resamplerNeedsSampleBuffer = (streamInfo.dwFlags
233 & (MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES)) == 0;
236 m_outputFormat = fout;
quint64 outputBufferSize(quint64 inputBufferSize) const
bool setup(const QAudioFormat &in, const QAudioFormat &out)
QByteArray resample(const QByteArrayView &in)
quint64 inputBufferSize(quint64 outputBufferSize) const
Combined button and popup list for selecting options.
ComPtr< IMFMediaType > formatToMediaType(QWindowsMediaFoundation &, const QAudioFormat &format)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define qCWarning(category,...)
#define qCDebug(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
unsigned long long quint64
QUuid qCLSID_CResamplerMediaObject("f447b69e-1884-4a7e-8055-346f74d6edb3")
QT_BEGIN_NAMESPACE QUuid qIID_IMFTransform(0xbf94c121, 0x5b05, 0x4e6f, 0x80, 0x00, 0xba, 0x59, 0x89, 0x61, 0x41, 0x4d)
QTextStream out(stdout)
[7]