From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/qasf/dmowrapper.c | 20 ++++++++++++++------ dlls/qasf/tests/dmowrapper.c | 7 +++---- 2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/dlls/qasf/dmowrapper.c b/dlls/qasf/dmowrapper.c index 578e51b8ba0..4d52df48512 100644 --- a/dlls/qasf/dmowrapper.c +++ b/dlls/qasf/dmowrapper.c @@ -26,6 +26,7 @@ struct buffer { IMediaBuffer IMediaBuffer_iface; IMediaSample *sample; + DWORD len; };
struct dmo_wrapper_source @@ -88,7 +89,8 @@ static HRESULT WINAPI buffer_SetLength(IMediaBuffer *iface, DWORD len)
TRACE("iface %p, len %lu.\n", iface, len);
- return IMediaSample_SetActualDataLength(buffer->sample, len); + buffer->len = len; + return S_OK; }
static HRESULT WINAPI buffer_GetMaxLength(IMediaBuffer *iface, DWORD *len) @@ -107,7 +109,7 @@ static HRESULT WINAPI buffer_GetBufferAndLength(IMediaBuffer *iface, BYTE **data
TRACE("iface %p, data %p, len %p.\n", iface, data, len);
- *len = IMediaSample_GetActualDataLength(buffer->sample); + *len = buffer->len; if (data) return IMediaSample_GetPointer(buffer->sample, data); return S_OK; @@ -235,7 +237,7 @@ static HRESULT get_output_samples(struct dmo_wrapper *filter) return hr; } filter->buffers[i].pBuffer = &filter->sources[i].buffer.IMediaBuffer_iface; - IMediaSample_SetActualDataLength(filter->sources[i].buffer.sample, 0); + filter->sources[i].buffer.len = 0; } else filter->buffers[i].pBuffer = NULL; @@ -248,18 +250,21 @@ static HRESULT process_output(struct dmo_wrapper *filter, IMediaObject *dmo) { DMO_OUTPUT_DATA_BUFFER *buffers = filter->buffers; HRESULT hr = S_OK; - DWORD status, i; + DWORD status = 0, i; BOOL more_data;
do { + HRESULT process_hr; more_data = FALSE;
if (FAILED(hr = get_output_samples(filter))) return hr;
- if (FAILED(IMediaObject_ProcessOutput(dmo, DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER, - filter->source_count, buffers, &status))) + process_hr = IMediaObject_ProcessOutput(dmo, DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER, + filter->source_count, buffers, &status); + TRACE("ProcessOutput() returned %#lx.\n", process_hr); + if (FAILED(process_hr)) { release_output_samples(filter); break; @@ -272,6 +277,8 @@ static HRESULT process_output(struct dmo_wrapper *filter, IMediaObject *dmo) if (!buffers[i].pBuffer) continue;
+ IMediaSample_SetActualDataLength(sample, filter->sources[i].buffer.len); + if (buffers[i].dwStatus & DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE) more_data = TRUE;
@@ -348,6 +355,7 @@ static HRESULT WINAPI dmo_wrapper_sink_Receive(struct strmbase_sink *iface, IMed }
filter->input_buffer.sample = sample; + filter->input_buffer.len = IMediaSample_GetActualDataLength(sample); if (FAILED(hr = IMediaObject_ProcessInput(dmo, index, &filter->input_buffer.IMediaBuffer_iface, flags, start, stop - start))) { diff --git a/dlls/qasf/tests/dmowrapper.c b/dlls/qasf/tests/dmowrapper.c index 94f8c3818e6..53d470c941a 100644 --- a/dlls/qasf/tests/dmowrapper.c +++ b/dlls/qasf/tests/dmowrapper.c @@ -425,9 +425,9 @@ static HRESULT WINAPI dmo_ProcessOutput(IMediaObject *iface, DWORD flags, for (i = 0; i < 300; ++i) data[i] = 111 - i; hr = IMediaBuffer_SetLength(buffers[0].pBuffer, 2); - todo_wine_if (testmode == 100) ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IMediaBuffer_SetLength(buffers[0].pBuffer, 300); - todo_wine_if (testmode == 100) ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr); if (testdmo_buffer) IMediaBuffer_Release(testdmo_buffer); testdmo_buffer = NULL; @@ -1434,8 +1434,7 @@ static HRESULT WINAPI sample_SetActualDataLength(IMediaSample *iface, LONG size)
if (winetest_debug > 1) trace("SetActualDataLength(%ld)\n", size);
- todo_wine_if (size != 300) - ok(size == 300, "Got size %ld.\n", size); + ok(size == 300, "Got size %ld.\n", size);
IMediaSample_SetActualDataLength(filter->wrapped_sample, size); return E_FAIL;