Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 353 +++++++++++++++++++++++++++++++++++++++++++++ dlls/mf/tests/mf.c | 12 ++ 2 files changed, 365 insertions(+)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 1d55344fe16..7665725405e 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -59,9 +59,11 @@ struct video_renderer IMFGetService IMFGetService_iface; IMFTopologyServiceLookup IMFTopologyServiceLookup_iface; IMediaEventSink IMediaEventSink_iface; + IMFAttributes IMFAttributes_iface; LONG refcount;
IMFMediaEventQueue *event_queue; + IMFAttributes *attributes; IMFPresentationClock *clock;
IMFTransform *mixer; @@ -115,6 +117,11 @@ static struct video_renderer *impl_from_IMediaEventSink(IMediaEventSink *iface) return CONTAINING_RECORD(iface, struct video_renderer, IMediaEventSink_iface); }
+static struct video_renderer *impl_from_IMFAttributes(IMFAttributes *iface) +{ + return CONTAINING_RECORD(iface, struct video_renderer, IMFAttributes_iface); +} + static struct video_stream *impl_from_IMFStreamSink(IMFStreamSink *iface) { return CONTAINING_RECORD(iface, struct video_stream, IMFStreamSink_iface); @@ -579,6 +586,10 @@ static HRESULT WINAPI video_renderer_sink_QueryInterface(IMFMediaSink *iface, RE { *obj = &renderer->IMFGetService_iface; } + else if (IsEqualIID(riid, &IID_IMFAttributes)) + { + *obj = &renderer->IMFAttributes_iface; + } else { WARN("Unsupported interface %s.\n", debugstr_guid(riid)); @@ -616,6 +627,8 @@ static ULONG WINAPI video_renderer_sink_Release(IMFMediaSink *iface) IMFVideoPresenter_Release(renderer->presenter); if (renderer->clock) IMFPresentationClock_Release(renderer->clock); + if (renderer->attributes) + IMFAttributes_Release(renderer->attributes); DeleteCriticalSection(&renderer->cs); heap_free(renderer); } @@ -1504,6 +1517,342 @@ static const IMediaEventSinkVtbl media_event_sink_vtbl = video_renderer_event_sink_Notify, };
+static HRESULT WINAPI video_renderer_attributes_QueryInterface(IMFAttributes *iface, REFIID riid, void **obj) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + return IMFMediaSink_QueryInterface(&renderer->IMFMediaSink_iface, riid, obj); +} + +static ULONG WINAPI video_renderer_attributes_AddRef(IMFAttributes *iface) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + return IMFMediaSink_AddRef(&renderer->IMFMediaSink_iface); +} + +static ULONG WINAPI video_renderer_attributes_Release(IMFAttributes *iface) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + return IMFMediaSink_Release(&renderer->IMFMediaSink_iface); +} + +static HRESULT WINAPI video_renderer_attributes_GetItem(IMFAttributes *iface, REFGUID key, PROPVARIANT *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_GetItem(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_GetItemType(IMFAttributes *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), type); + + return IMFAttributes_GetItemType(renderer->attributes, key, type); +} + +static HRESULT WINAPI video_renderer_attributes_CompareItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT value, + BOOL *result) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %p.\n", iface, debugstr_guid(key), value, result); + + return IMFAttributes_CompareItem(renderer->attributes, key, value, result); +} + +static HRESULT WINAPI video_renderer_attributes_Compare(IMFAttributes *iface, IMFAttributes *theirs, + MF_ATTRIBUTES_MATCH_TYPE type, BOOL *result) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %p, %d, %p.\n", iface, theirs, type, result); + + return IMFAttributes_Compare(renderer->attributes, theirs, type, result); +} + +static HRESULT WINAPI video_renderer_attributes_GetUINT32(IMFAttributes *iface, REFGUID key, UINT32 *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_GetUINT32(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_GetUINT64(IMFAttributes *iface, REFGUID key, UINT64 *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_GetUINT64(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_GetDouble(IMFAttributes *iface, REFGUID key, double *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_GetDouble(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_GetGUID(IMFAttributes *iface, REFGUID key, GUID *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_GetGUID(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_GetStringLength(IMFAttributes *iface, REFGUID key, + UINT32 *length) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), length); + + return IMFAttributes_GetStringLength(renderer->attributes, key, length); +} + +static HRESULT WINAPI video_renderer_attributes_GetString(IMFAttributes *iface, REFGUID key, WCHAR *value, + UINT32 size, UINT32 *length) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %u, %p.\n", iface, debugstr_guid(key), value, size, length); + + return IMFAttributes_GetString(renderer->attributes, key, value, size, length); +} + +static HRESULT WINAPI video_renderer_attributes_GetAllocatedString(IMFAttributes *iface, REFGUID key, + WCHAR **value, UINT32 *length) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %p.\n", iface, debugstr_guid(key), value, length); + + return IMFAttributes_GetAllocatedString(renderer->attributes, key, value, length); +} + +static HRESULT WINAPI video_renderer_attributes_GetBlobSize(IMFAttributes *iface, REFGUID key, UINT32 *size) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), size); + + return IMFAttributes_GetBlobSize(renderer->attributes, key, size); +} + +static HRESULT WINAPI video_renderer_attributes_GetBlob(IMFAttributes *iface, REFGUID key, UINT8 *buf, + UINT32 bufsize, UINT32 *blobsize) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %u, %p.\n", iface, debugstr_guid(key), buf, bufsize, blobsize); + + return IMFAttributes_GetBlob(renderer->attributes, key, buf, bufsize, blobsize); +} + +static HRESULT WINAPI video_renderer_attributes_GetAllocatedBlob(IMFAttributes *iface, REFGUID key, + UINT8 **buf, UINT32 *size) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %p.\n", iface, debugstr_guid(key), buf, size); + + return IMFAttributes_GetAllocatedBlob(renderer->attributes, key, buf, size); +} + +static HRESULT WINAPI video_renderer_attributes_GetUnknown(IMFAttributes *iface, REFGUID key, REFIID riid, void **out) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(key), debugstr_guid(riid), out); + + return IMFAttributes_GetUnknown(renderer->attributes, key, riid, out); +} + +static HRESULT WINAPI video_renderer_attributes_SetItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_SetItem(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_DeleteItem(IMFAttributes *iface, REFGUID key) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s.\n", iface, debugstr_guid(key)); + + return IMFAttributes_DeleteItem(renderer->attributes, key); +} + +static HRESULT WINAPI video_renderer_attributes_DeleteAllItems(IMFAttributes *iface) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p.\n", iface); + + return IMFAttributes_DeleteAllItems(renderer->attributes); +} + +static HRESULT WINAPI video_renderer_attributes_SetUINT32(IMFAttributes *iface, REFGUID key, UINT32 value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %u.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_SetUINT32(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_SetUINT64(IMFAttributes *iface, REFGUID key, UINT64 value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %s.\n", iface, debugstr_guid(key), wine_dbgstr_longlong(value)); + + return IMFAttributes_SetUINT64(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_SetDouble(IMFAttributes *iface, REFGUID key, double value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %f.\n", iface, debugstr_guid(key), value); + + return IMFAttributes_SetDouble(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_SetGUID(IMFAttributes *iface, REFGUID key, REFGUID value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %s.\n", iface, debugstr_guid(key), debugstr_guid(value)); + + return IMFAttributes_SetGUID(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_SetString(IMFAttributes *iface, REFGUID key, + const WCHAR *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %s.\n", iface, debugstr_guid(key), debugstr_w(value)); + + return IMFAttributes_SetString(renderer->attributes, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_SetBlob(IMFAttributes *iface, REFGUID key, + const UINT8 *buf, UINT32 size) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p, %u.\n", iface, debugstr_guid(key), buf, size); + + return IMFAttributes_SetBlob(renderer->attributes, key, buf, size); +} + +static HRESULT WINAPI video_renderer_attributes_SetUnknown(IMFAttributes *iface, REFGUID key, + IUnknown *unknown) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(key), unknown); + + return IMFAttributes_SetUnknown(renderer->attributes, key, unknown); +} + +static HRESULT WINAPI video_renderer_attributes_LockStore(IMFAttributes *iface) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p.\n", iface); + + return IMFAttributes_LockStore(renderer->attributes); +} + +static HRESULT WINAPI video_renderer_attributes_UnlockStore(IMFAttributes *iface) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p.\n", iface); + + return IMFAttributes_UnlockStore(renderer->attributes); +} + +static HRESULT WINAPI video_renderer_attributes_GetCount(IMFAttributes *iface, UINT32 *count) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %p.\n", iface, count); + + return IMFAttributes_GetCount(renderer->attributes, count); +} + +static HRESULT WINAPI video_renderer_attributes_GetItemByIndex(IMFAttributes *iface, UINT32 index, + GUID *key, PROPVARIANT *value) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %u, %p, %p.\n", iface, index, key, value); + + return IMFAttributes_GetItemByIndex(renderer->attributes, index, key, value); +} + +static HRESULT WINAPI video_renderer_attributes_CopyAllItems(IMFAttributes *iface, IMFAttributes *dest) +{ + struct video_renderer *renderer = impl_from_IMFAttributes(iface); + + TRACE("%p, %p.\n", iface, dest); + + return IMFAttributes_CopyAllItems(renderer->attributes, dest); +} + +static const IMFAttributesVtbl video_renderer_attributes_vtbl = +{ + video_renderer_attributes_QueryInterface, + video_renderer_attributes_AddRef, + video_renderer_attributes_Release, + video_renderer_attributes_GetItem, + video_renderer_attributes_GetItemType, + video_renderer_attributes_CompareItem, + video_renderer_attributes_Compare, + video_renderer_attributes_GetUINT32, + video_renderer_attributes_GetUINT64, + video_renderer_attributes_GetDouble, + video_renderer_attributes_GetGUID, + video_renderer_attributes_GetStringLength, + video_renderer_attributes_GetString, + video_renderer_attributes_GetAllocatedString, + video_renderer_attributes_GetBlobSize, + video_renderer_attributes_GetBlob, + video_renderer_attributes_GetAllocatedBlob, + video_renderer_attributes_GetUnknown, + video_renderer_attributes_SetItem, + video_renderer_attributes_DeleteItem, + video_renderer_attributes_DeleteAllItems, + video_renderer_attributes_SetUINT32, + video_renderer_attributes_SetUINT64, + video_renderer_attributes_SetDouble, + video_renderer_attributes_SetGUID, + video_renderer_attributes_SetString, + video_renderer_attributes_SetBlob, + video_renderer_attributes_SetUnknown, + video_renderer_attributes_LockStore, + video_renderer_attributes_UnlockStore, + video_renderer_attributes_GetCount, + video_renderer_attributes_GetItemByIndex, + video_renderer_attributes_CopyAllItems, +}; + static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context, IUnknown **obj) { struct video_renderer *object; @@ -1524,12 +1873,16 @@ static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context, object->IMFGetService_iface.lpVtbl = &video_renderer_get_service_vtbl; object->IMFTopologyServiceLookup_iface.lpVtbl = &video_renderer_service_lookup_vtbl; object->IMediaEventSink_iface.lpVtbl = &media_event_sink_vtbl; + object->IMFAttributes_iface.lpVtbl = &video_renderer_attributes_vtbl; object->refcount = 1; InitializeCriticalSection(&object->cs);
if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) goto failed;
+ if (FAILED(hr = MFCreateAttributes(&object->attributes, 0))) + goto failed; + /* Create mixer and presenter. */ if (FAILED(hr = video_renderer_create_mixer(attributes, &mixer))) goto failed; diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 351a6e1edab..fa3d8111338 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3245,6 +3245,7 @@ static void test_evr(void) IMFClockStateSink *clock_sink; IMFMediaSinkPreroll *preroll; IMFMediaSink *sink, *sink2; + IMFAttributes *attributes; IMFActivate *activate; DWORD flags, count; LONG sample_count; @@ -3283,6 +3284,17 @@ static void test_evr(void) hr = IMFActivate_ActivateObject(activate, &IID_IMFMediaSink, (void **)&sink); ok(hr == S_OK, "Failed to activate, hr %#x.\n", hr);
+ hr = IMFMediaSink_QueryInterface(sink, &IID_IMFAttributes, (void **)&attributes); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFAttributes_QueryInterface(attributes, &IID_IMFMediaSink, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unk); + hr = IMFAttributes_GetCount(attributes, &count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine + ok(!!count, "Unexpected count %u.\n", count); + IMFAttributes_Release(attributes); + /* Primary stream type handler. */ hr = IMFMediaSink_GetStreamSinkById(sink, 0, &stream_sink); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 12 ++++++++++++ dlls/mf/tests/mf.c | 1 - 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 7665725405e..af9bd9e0e42 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -1896,6 +1896,18 @@ static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context, IMFTransform_Release(mixer); IMFVideoPresenter_Release(presenter);
+ /* Default attributes */ + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_ForceBob, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_AllowDropToBob, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_ForceThrottle, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_AllowDropToThrottle, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_ForceHalfInterlace, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_AllowDropToHalfInterlace, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_ForceScaling, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_AllowScaling, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_ForceBatching, 0); + IMFAttributes_SetUINT32(object->attributes, &EVRConfig_AllowBatching, 0); + *obj = (IUnknown *)&object->IMFMediaSink_iface;
return S_OK; diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index fa3d8111338..465bd7e3c43 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3291,7 +3291,6 @@ static void test_evr(void) IUnknown_Release(unk); hr = IMFAttributes_GetCount(attributes, &count); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); -todo_wine ok(!!count, "Unexpected count %u.\n", count); IMFAttributes_Release(attributes);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/evr/tests/evr.c | 103 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 3 deletions(-)
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index d0e39cb47c9..9124109c07f 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -1994,16 +1994,82 @@ static void test_mixer_zorder(void) IMFTransform_Release(mixer); }
+static IDirect3DSurface9 * create_surface(IDirect3DDeviceManager9 *manager, unsigned int width, + unsigned int height) +{ + IDirectXVideoAccelerationService *service; + IDirect3DSurface9 *surface = NULL; + IDirect3DDevice9 *device; + HANDLE handle; + HRESULT hr; + + hr = IDirect3DDeviceManager9_OpenDeviceHandle(manager, &handle); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IDirect3DDeviceManager9_LockDevice(manager, handle, &device, TRUE); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IDirect3DDeviceManager9_GetVideoService(manager, handle, &IID_IDirectXVideoProcessorService, + (void **)&service); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IDirectXVideoAccelerationService_CreateSurface(service, width, height, 0, D3DFMT_A8R8G8B8, + D3DPOOL_DEFAULT, 0, DXVA2_VideoProcessorRenderTarget, &surface, NULL); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + IDirectXVideoAccelerationService_Release(service); + + hr = IDirect3DDevice9_ColorFill(device, surface, NULL, D3DCOLOR_ARGB(0x10, 0xff, 0x00, 0x00)); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + IDirect3DDevice9_Release(device); + + hr = IDirect3DDeviceManager9_UnlockDevice(manager, handle, FALSE); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IDirect3DDeviceManager9_CloseDeviceHandle(manager, handle); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + return surface; +} + +/* Format is assumed as 32bpp */ +static DWORD get_surface_color(IDirect3DSurface9 *surface, unsigned int x, unsigned int y) +{ + D3DLOCKED_RECT locked_rect = { 0 }; + D3DSURFACE_DESC desc; + DWORD *row, color; + HRESULT hr; + + hr = IDirect3DSurface9_GetDesc(surface, &desc); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(x < desc.Width && y < desc.Height, "Invalid coordinate.\n"); + if (x >= desc.Width || y >= desc.Height) return 0; + + hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + row = (DWORD *)((char *)locked_rect.pBits + y * locked_rect.Pitch); + color = row[x]; + + hr = IDirect3DSurface9_UnlockRect(surface); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + return color; +} + static void test_mixer_samples(void) { IDirect3DDeviceManager9 *manager; MFT_OUTPUT_DATA_BUFFER buffer; + IDirect3DSurface9 *surface; + IMFDesiredSample *desired; IDirect3DDevice9 *device; IMFMediaType *video_type; + DWORD color, status; IMFTransform *mixer; IMFSample *sample; IDirect3D9 *d3d; - DWORD status; HWND window; UINT token; HRESULT hr; @@ -2030,8 +2096,6 @@ static void test_mixer_samples(void) hr = IMFTransform_ProcessMessage(mixer, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)manager); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- IDirect3DDeviceManager9_Release(manager); - video_type = create_video_type(&MFVideoFormat_RGB32);
hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64)640 << 32 | 480); @@ -2052,6 +2116,7 @@ static void test_mixer_samples(void) todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ /* It needs a sample with a backing surface. */ hr = MFCreateSample(&sample); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -2062,9 +2127,41 @@ todo_wine
IMFSample_Release(sample);
+ surface = create_surface(manager, 64, 64); + + hr = MFCreateVideoSampleFromSurface((IUnknown *)surface, &sample); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFSample_QueryInterface(sample, &IID_IMFDesiredSample, (void **)&desired); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + buffer.pSample = sample; + hr = IMFTransform_ProcessOutput(mixer, 0, 1, &buffer, &status); +todo_wine + ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#x.\n", hr); + + color = get_surface_color(surface, 0, 0); + ok(color == D3DCOLOR_ARGB(0x10, 0xff, 0x00, 0x00), "Unexpected color %#x.\n", color); + + /* Streaming is not started yet. Output is colored black, but only if desired timestamps were set. */ + IMFDesiredSample_SetDesiredSampleTimeAndDuration(desired, 100, 0); + + hr = IMFTransform_ProcessOutput(mixer, 0, 1, &buffer, &status); +todo_wine + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + color = get_surface_color(surface, 0, 0); +todo_wine + ok(!color, "Unexpected color %#x.\n", color); + + IMFSample_Release(sample); + + IDirect3DSurface9_Release(surface); + IMFTransform_Release(mixer);
IDirect3DDevice9_Release(device); + IDirect3DDeviceManager9_Release(manager);
done: IDirect3D9_Release(d3d);