diff options
author | Yoann Lopes <yoann.lopes@digia.com> | 2013-10-14 19:27:22 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-16 12:09:50 +0200 |
commit | 068169528c5e8a281b448c21d6eb5dbd88911dc0 (patch) | |
tree | d6478799454ed93e281b616a2955a952065f3d7f /src/plugins/wmf | |
parent | 98a6eefda90926e2fb862600cf319cd701b057b5 (diff) | |
download | qtmultimedia-068169528c5e8a281b448c21d6eb5dbd88911dc0.tar.gz |
WMF: fix output samples from our video probe MFTransform.
The EVR sink allocates its buffers and expect the node connected to it
to use them. Our video probe MFTransform should therefore copy the input
buffers into the EVR buffers rather than just passing on the input
buffers.
Task-number: QTBUG-30435
Change-Id: I978479ced341b96ce627c682f99662dec1dfdb3f
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src/plugins/wmf')
-rw-r--r-- | src/plugins/wmf/mftvideo.cpp | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/src/plugins/wmf/mftvideo.cpp b/src/plugins/wmf/mftvideo.cpp index 8e7ce0693..7d6b3b905 100644 --- a/src/plugins/wmf/mftvideo.cpp +++ b/src/plugins/wmf/mftvideo.cpp @@ -521,18 +521,67 @@ STDMETHODIMP MFTransform::ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, if (!m_sample) return MF_E_TRANSFORM_NEED_MORE_INPUT; - if (pOutputSamples[0].pSample) - pOutputSamples[0].pSample->Release(); + IMFMediaBuffer *input = NULL; + IMFMediaBuffer *output = NULL; + + DWORD sampleLength = 0; + m_sample->GetTotalLength(&sampleLength); + + // If the sample length is null, it means we're getting DXVA buffers. + // In that case just pass on the sample we got as input. + // Otherwise we need to copy the input buffer into the buffer the sink + // is giving us. + if (pOutputSamples[0].pSample && sampleLength > 0) { + + if (FAILED(m_sample->ConvertToContiguousBuffer(&input))) + goto done; + + if (FAILED(pOutputSamples[0].pSample->ConvertToContiguousBuffer(&output))) + goto done; + + DWORD inputLength = 0; + DWORD outputLength = 0; + input->GetMaxLength(&inputLength); + output->GetMaxLength(&outputLength); + + if (outputLength < inputLength) { + pOutputSamples[0].pSample->RemoveAllBuffers(); + output->Release(); + output = NULL; + if (SUCCEEDED(MFCreateMemoryBuffer(inputLength, &output))) + pOutputSamples[0].pSample->AddBuffer(output); + } + + if (output) + m_sample->CopyToBuffer(output); - pOutputSamples[0].pSample = m_sample; - pOutputSamples[0].pSample->AddRef(); + LONGLONG hnsDuration = 0; + LONGLONG hnsTime = 0; + if (SUCCEEDED(m_sample->GetSampleDuration(&hnsDuration))) + pOutputSamples[0].pSample->SetSampleDuration(hnsDuration); + if (SUCCEEDED(m_sample->GetSampleTime(&hnsTime))) + pOutputSamples[0].pSample->SetSampleTime(hnsTime); + + } else { + if (pOutputSamples[0].pSample) + pOutputSamples[0].pSample->Release(); + pOutputSamples[0].pSample = m_sample; + pOutputSamples[0].pSample->AddRef(); + } + +done: pOutputSamples[0].dwStatus = 0; *pdwStatus = 0; m_sample->Release(); m_sample = 0; + if (input) + input->Release(); + if (output) + output->Release(); + return S_OK; } |