Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2019
- 73 participants
- 1462 messages
[PATCH 5/6] winebus.sys: Initialize and teardown the HID backends while the bus FDO is still extant.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
As of the next patch this will be necessary.
dlls/winebus.sys/main.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 34f0490fc0c..3139833db7a 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -469,16 +469,31 @@ static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp)
static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
+ static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
+ static const UNICODE_STRING SDL_enabled = {sizeof(SDL_enabledW) - sizeof(WCHAR), sizeof(SDL_enabledW), (WCHAR*)SDL_enabledW};
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
NTSTATUS ret;
switch (irpsp->MinorFunction)
{
case IRP_MN_START_DEVICE:
+ if (check_bus_option(&SDL_enabled, 1))
+ {
+ if (sdl_driver_init() == STATUS_SUCCESS)
+ return STATUS_SUCCESS;
+ }
+ udev_driver_init();
+ iohid_driver_init();
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ break;
case IRP_MN_SURPRISE_REMOVAL:
irp->IoStatus.u.Status = STATUS_SUCCESS;
break;
case IRP_MN_REMOVE_DEVICE:
+ udev_driver_unload();
+ iohid_driver_unload();
+ sdl_driver_unload();
+
irp->IoStatus.u.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocation(irp);
ret = IoCallDriver(bus_pdo, irp);
@@ -823,16 +838,11 @@ static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *p
static void WINAPI driver_unload(DRIVER_OBJECT *driver)
{
- udev_driver_unload();
- iohid_driver_unload();
- sdl_driver_unload();
NtClose(driver_key);
}
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
{
- static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
- static const UNICODE_STRING SDL_enabled = {sizeof(SDL_enabledW) - sizeof(WCHAR), sizeof(SDL_enabledW), (WCHAR*)SDL_enabledW};
OBJECT_ATTRIBUTES attr = {0};
NTSTATUS ret;
@@ -851,13 +861,5 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
driver->DriverExtension->AddDevice = driver_add_device;
driver->DriverUnload = driver_unload;
- if (check_bus_option(&SDL_enabled, 1))
- {
- if (sdl_driver_init() == STATUS_SUCCESS)
- return STATUS_SUCCESS;
- }
- udev_driver_init();
- iohid_driver_init();
-
return STATUS_SUCCESS;
}
--
2.22.0
June 28, 2019
[PATCH 4/6] wine.inf: Remove registration for the winebus service.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
loader/wine.inf.in | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 0da7eeef7d8..a435282d33e 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -134,7 +134,6 @@ AddService=FontCache3.0.0.0,0,WPFFontCacheService
AddService=LanmanServer,0,LanmanServerService
AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
-AddService=WineBus,0,WineBusService
AddService=Winmgmt,0,WinmgmtService
[DefaultInstall.NT.Services]
@@ -150,7 +149,6 @@ AddService=FontCache3.0.0.0,0,WPFFontCacheService
AddService=LanmanServer,0,LanmanServerService
AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
-AddService=WineBus,0,WineBusService
AddService=Winmgmt,0,WinmgmtService
[DefaultInstall.ntamd64.Services]
@@ -166,7 +164,6 @@ AddService=FontCache3.0.0.0,0,WPFFontCacheService
AddService=LanmanServer,0,LanmanServerService
AddService=FontCache,0,FontCacheService
AddService=Schedule,0,TaskSchedulerService
-AddService=WineBus,0,WineBusService
AddService=Winmgmt,0,WinmgmtService
[Strings]
@@ -3454,15 +3451,6 @@ ServiceType=32
StartType=3
ErrorControl=1
-[WineBusService]
-Description="Wine Platform Bus Kernel"
-DisplayName="Platform Bus Kernel"
-ServiceBinary="%12%\winebus.sys"
-LoadOrderGroup="WinePlugPlay"
-ServiceType=1
-StartType=2
-ErrorControl=1
-
[SpoolerService]
AddReg=SpoolerServiceKeys
Description="Loads files to memory for later printing"
--
2.22.0
June 28, 2019
[PATCH 3/6] wineboot: Create a root-enumerated device object for winebus.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
There does not seem to be a way to trigger root PnP device installation from
e.g. an INF file [in particular, InstallHinfSection() will not install root
PnP devices].
programs/wineboot/Makefile.in | 2 +-
programs/wineboot/wineboot.c | 55 +++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in
index f6da0f9df65..42ae420cebc 100644
--- a/programs/wineboot/Makefile.in
+++ b/programs/wineboot/Makefile.in
@@ -1,7 +1,7 @@
MODULE = wineboot.exe
APPMODE = -mconsole
IMPORTS = uuid advapi32
-DELAYIMPORTS = shell32 shlwapi version user32
+DELAYIMPORTS = shell32 shlwapi version user32 setupapi newdev
C_SRCS = \
shutdown.c \
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index defd12627d6..4b5ec738bc9 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -82,6 +82,8 @@
#include <shobjidl.h>
#include <shlwapi.h>
#include <shellapi.h>
+#include <setupapi.h>
+#include <newdev.h>
#include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1090,6 +1092,57 @@ static HANDLE start_rundll32( const char *inf_path, BOOL wow64 )
return pi.hProcess;
}
+static void install_root_pnp_devices(void)
+{
+ static const struct
+ {
+ const char *name;
+ const char *hardware_id;
+ const char *infpath;
+ }
+ root_devices[] =
+ {
+ {"root\\wine\\winebus", "root\\winebus\0", "C:\\windows\\inf\\winebus.inf"},
+ };
+ SP_DEVINFO_DATA device = {sizeof(device)};
+ unsigned int i;
+ HDEVINFO set;
+
+ if ((set = SetupDiCreateDeviceInfoList( NULL, NULL )) == INVALID_HANDLE_VALUE)
+ {
+ WINE_ERR("Failed to create device info list, error %#x.\n", GetLastError());
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(root_devices); ++i)
+ {
+ if (!SetupDiCreateDeviceInfoA( set, root_devices[i].name, &GUID_NULL, NULL, NULL, 0, &device))
+ {
+ if (GetLastError() != ERROR_DEVINST_ALREADY_EXISTS)
+ WINE_ERR("Failed to create device %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!SetupDiSetDeviceRegistryPropertyA(set, &device, SPDRP_HARDWAREID,
+ (const BYTE *)root_devices[i].hardware_id, (strlen(root_devices[i].hardware_id) + 2) * sizeof(WCHAR)))
+ {
+ WINE_ERR("Failed to set hardware id for %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device))
+ {
+ WINE_ERR("Failed to register device %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!UpdateDriverForPlugAndPlayDevicesA(NULL, root_devices[i].hardware_id, root_devices[i].infpath, 0, NULL))
+ WINE_ERR("Failed to install drivers for %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ }
+
+ SetupDiDestroyDeviceInfoList(set);
+}
+
/* execute rundll32 on the wine.inf file if necessary */
static void update_wineprefix( BOOL force )
{
@@ -1133,6 +1186,8 @@ static void update_wineprefix( BOOL force )
}
DestroyWindow( hwnd );
}
+ install_root_pnp_devices();
+
WINE_MESSAGE( "wine: configuration in '%s' has been updated.\n", config_dir );
}
--
2.22.0
June 28, 2019
[PATCH 2/6] winebus.sys: Implement AddDevice().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/winebus.sys/main.c | 65 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 64 insertions(+), 1 deletion(-)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 3616ebe8152..34f0490fc0c 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -66,6 +66,9 @@ static const WORD PID_XBOX_CONTROLLERS[] = {
static DRIVER_OBJECT *driver_obj;
+/* The root-enumerated device stack. */
+static DEVICE_OBJECT *bus_pdo, *bus_fdo;
+
HANDLE driver_key;
struct pnp_device
@@ -464,7 +467,33 @@ static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp)
return status;
}
-static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+{
+ IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
+ NTSTATUS ret;
+
+ switch (irpsp->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ case IRP_MN_SURPRISE_REMOVAL:
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ break;
+ case IRP_MN_REMOVE_DEVICE:
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ IoSkipCurrentIrpStackLocation(irp);
+ ret = IoCallDriver(bus_pdo, irp);
+ IoDetachDevice(bus_pdo);
+ IoDeleteDevice(device);
+ return ret;
+ default:
+ FIXME("Unhandled minor function %#x.\n", irpsp->MinorFunction);
+ }
+
+ IoSkipCurrentIrpStackLocation(irp);
+ return IoCallDriver(bus_pdo, irp);
+}
+
+static NTSTATUS pdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
NTSTATUS status = irp->IoStatus.u.Status;
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
@@ -493,6 +522,13 @@ static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
return status;
}
+static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+{
+ if (device == bus_fdo)
+ return fdo_pnp_dispatch(device, irp);
+ return pdo_pnp_dispatch(device, irp);
+}
+
static NTSTATUS deliver_last_report(struct device_extension *ext, DWORD buffer_length, BYTE* buffer, ULONG_PTR *out_length)
{
if (buffer_length < ext->last_report_size)
@@ -517,6 +553,12 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
TRACE("(%p, %p)\n", device, irp);
+ if (device == bus_fdo)
+ {
+ IoSkipCurrentIrpStackLocation(irp);
+ return IoCallDriver(bus_pdo, irp);
+ }
+
switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
@@ -759,6 +801,26 @@ BOOL is_xbox_gamepad(WORD vid, WORD pid)
return FALSE;
}
+static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *pdo)
+{
+ NTSTATUS ret;
+
+ TRACE("driver %p, pdo %p.\n", driver, pdo);
+
+ if ((ret = IoCreateDevice(driver, 0, NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &bus_fdo)))
+ {
+ ERR("Failed to create FDO, status %#x.\n", ret);
+ return ret;
+ }
+
+ IoAttachDeviceToDeviceStack(bus_fdo, pdo);
+ bus_pdo = pdo;
+
+ bus_fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ return STATUS_SUCCESS;
+}
+
static void WINAPI driver_unload(DRIVER_OBJECT *driver)
{
udev_driver_unload();
@@ -786,6 +848,7 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = hid_internal_dispatch;
+ driver->DriverExtension->AddDevice = driver_add_device;
driver->DriverUnload = driver_unload;
if (check_bus_option(&SDL_enabled, 1))
--
2.22.0
June 28, 2019
[PATCH 1/6] winebus.inf: Add new INF file and copy it to the INF directory.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
loader/Makefile.in | 1 +
loader/wine.inf.in | 1 +
loader/winebus.inf.in | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+)
create mode 100644 loader/winebus.inf.in
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 3ada656408b..11a476103c1 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -10,6 +10,7 @@ SOURCES = \
wine.man.in \
wine.pl.UTF-8.man.in \
wine_info.plist.in \
+ winebus.inf.in \
winehid.inf.in
PROGRAMS = $(WINELOADER_PROGRAMS)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 9f97b346f93..0da7eeef7d8 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -3682,4 +3682,5 @@ inf_section = 17
l_intl.nls
[inf_section]
+winebus.inf
winehid.inf
diff --git a/loader/winebus.inf.in b/loader/winebus.inf.in
new file mode 100644
index 00000000000..3950c3dfc4e
--- /dev/null
+++ b/loader/winebus.inf.in
@@ -0,0 +1,22 @@
+[Version]
+Signature="$CHICAGO$"
+ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
+Class=System
+
+[Manufacturer]
+Wine=mfg_section
+
+[mfg_section]
+Wine HID bus driver=device_section,root\winebus
+
+[device_section.Services]
+AddService = winebus,0x2,svc_section
+
+[svc_section]
+Description="Wine HID bus driver"
+DisplayName="Wine HID bus"
+ServiceBinary="%12%\winebus.sys"
+LoadOrderGroup="WinePlugPlay"
+ServiceType=1
+StartType=3
+ErrorControl=1
--
2.22.0
June 28, 2019
[PATCH 4/4] qcap/tests: Add some tests for IEnumMediaTypes().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/qcap/tests/avico.c | 72 ++++++++++++++++++++
dlls/qcap/tests/avimux.c | 109 +++++++++++++++++++++++++++++++
dlls/qcap/tests/smartteefilter.c | 45 +++++++++++++
3 files changed, 226 insertions(+)
diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c
index 837c86d4039..10402897575 100644
--- a/dlls/qcap/tests/avico.c
+++ b/dlls/qcap/tests/avico.c
@@ -584,6 +584,77 @@ static void test_media_types(IBaseFilter *filter)
IPin_Release(pin);
}
+static void test_enum_media_types(IBaseFilter *filter)
+{
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+}
+
START_TEST(avico)
{
static const WCHAR test_display_name[] = {'@','d','e','v','i','c','e',':',
@@ -625,6 +696,7 @@ START_TEST(avico)
test_find_pin(filter);
test_pin_info(filter);
test_media_types(filter);
+ test_enum_media_types(filter);
ref = IBaseFilter_Release(filter);
ok(!ref, "Got outstanding refcount %d.\n", ref);
diff --git a/dlls/qcap/tests/avimux.c b/dlls/qcap/tests/avimux.c
index 8218d0e5eb2..98a775433c6 100644
--- a/dlls/qcap/tests/avimux.c
+++ b/dlls/qcap/tests/avimux.c
@@ -556,6 +556,114 @@ static void test_media_types(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ IBaseFilter *filter = create_avi_mux();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 2);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, sink0_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
static void test_seeking(void)
{
IBaseFilter *filter = create_avi_mux();
@@ -700,6 +808,7 @@ START_TEST(avimux)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
test_seeking();
CoUninitialize();
diff --git a/dlls/qcap/tests/smartteefilter.c b/dlls/qcap/tests/smartteefilter.c
index b3b05840aa2..361b0603d85 100644
--- a/dlls/qcap/tests/smartteefilter.c
+++ b/dlls/qcap/tests/smartteefilter.c
@@ -418,6 +418,50 @@ static void test_pin_info(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ IBaseFilter *filter = create_smart_tee();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
typedef struct {
IBaseFilter IBaseFilter_iface;
LONG ref;
@@ -2336,6 +2380,7 @@ START_TEST(smartteefilter)
test_enum_pins();
test_find_pin();
test_pin_info();
+ test_enum_media_types();
test_smart_tee_filter_aggregation();
test_smart_tee_filter();
--
2.22.0
June 28, 2019
[PATCH 3/4] quartz/tests: Add some tests for IEnumMediaTypes().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/avidec.c | 76 ++++++++++++
dlls/quartz/tests/avisplit.c | 119 +++++++++++++++++++
dlls/quartz/tests/dsoundrender.c | 82 +++++++++++++
dlls/quartz/tests/filesource.c | 107 +++++++++++++++++
dlls/quartz/tests/mpegsplit.c | 188 ++++++++++++++++++++++++++++++
dlls/quartz/tests/videorenderer.c | 45 +++++++
dlls/quartz/tests/vmr7.c | 46 ++++++++
dlls/quartz/tests/vmr9.c | 46 ++++++++
dlls/quartz/tests/waveparser.c | 119 +++++++++++++++++++
9 files changed, 828 insertions(+)
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 3f92876c84c..6635e2ec753 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -543,6 +543,81 @@ static void test_media_types(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ IBaseFilter *filter = create_avi_dec();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[1];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(avidec)
{
BOOL ret;
@@ -558,6 +633,7 @@ START_TEST(avidec)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
CoUninitialize();
diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c
index fb4278329b6..7dc8b14c5e4 100644
--- a/dlls/quartz/tests/avisplit.c
+++ b/dlls/quartz/tests/avisplit.c
@@ -654,6 +654,124 @@ static void test_media_types(void)
ok(ret, "Failed to delete file, error %u.\n", GetLastError());
}
+static void test_enum_media_types(void)
+{
+ const WCHAR *filename = load_resource(avifile);
+ IBaseFilter *filter = create_avi_splitter();
+ IFilterGraph2 *graph = connect_input(filter, filename);
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+ BOOL ret;
+
+ IBaseFilter_FindPin(filter, sink_name, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source0_name, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 2);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IFilterGraph2_Release(graph);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+}
+
static void test_filter_graph(void)
{
IFileSourceFilter *pfile = NULL;
@@ -906,6 +1024,7 @@ START_TEST(avisplit)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
test_filter_graph();
CoUninitialize();
diff --git a/dlls/quartz/tests/dsoundrender.c b/dlls/quartz/tests/dsoundrender.c
index cf7b0e32b41..925a49c5da7 100644
--- a/dlls/quartz/tests/dsoundrender.c
+++ b/dlls/quartz/tests/dsoundrender.c
@@ -494,6 +494,87 @@ static void test_basic_audio(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ IBaseFilter *filter = create_dsound_render();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK) CoTaskMemFree(mts[0]->pbFormat);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 1, "Got count %u.\n", count);
+ if (hr == S_OK) CoTaskMemFree(mts[0]->pbFormat);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 1, "Got count %u.\n", count);
+ if (count > 0) CoTaskMemFree(mts[0]->pbFormat);
+ if (count > 0) CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 2);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK) CoTaskMemFree(mts[0]->pbFormat);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
static void test_pin(IPin *pin)
{
IMemInputPin *mpin = NULL;
@@ -575,6 +656,7 @@ START_TEST(dsoundrender)
test_find_pin();
test_pin_info();
test_basic_audio();
+ test_enum_media_types();
test_basefilter();
CoUninitialize();
diff --git a/dlls/quartz/tests/filesource.c b/dlls/quartz/tests/filesource.c
index c38811aeba0..8d1d977b95e 100644
--- a/dlls/quartz/tests/filesource.c
+++ b/dlls/quartz/tests/filesource.c
@@ -1081,6 +1081,112 @@ static void test_async_reader(void)
ok(ret, "Failed to delete file, error %u.\n", GetLastError());
}
+static void test_enum_media_types(void)
+{
+ const WCHAR *filename = load_resource(avifile);
+ IBaseFilter *filter = create_file_source();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[3];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+ BOOL ret;
+
+ load_file(filter, filename);
+
+ IBaseFilter_FindPin(filter, source_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 2, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+ CoTaskMemFree(mts[1]);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 3, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(count == 2, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]);
+ CoTaskMemFree(mts[1]);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 3);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+}
+
START_TEST(filesource)
{
CoInitialize(NULL);
@@ -1093,6 +1199,7 @@ START_TEST(filesource)
test_filter_state();
test_file_source_filter();
test_async_reader();
+ test_enum_media_types();
CoUninitialize();
}
diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c
index 9853a199083..25c49438d06 100644
--- a/dlls/quartz/tests/mpegsplit.c
+++ b/dlls/quartz/tests/mpegsplit.c
@@ -810,6 +810,193 @@ done:
ok(ret, "Failed to delete file, error %u.\n", GetLastError());
}
+static void test_enum_media_types(void)
+{
+ const WCHAR *filename = load_resource(mp3file);
+ IBaseFilter *filter = create_mpeg_splitter();
+ IFilterGraph2 *graph = connect_input(filter, filename);
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[5];
+ ULONG ref, count;
+ unsigned int i;
+ HRESULT hr;
+ IPin *pin;
+ BOOL ret;
+
+ IBaseFilter_FindPin(filter, inputW, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ for (i = 0; i < 4; ++i)
+ {
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+ }
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ for (i = 0; i < 4; ++i)
+ {
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 1, "Got count %u.\n", count);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+ }
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 2, "Got count %u.\n", count);
+ if (count > 0) CoTaskMemFree(mts[0]);
+ if (count > 1) CoTaskMemFree(mts[1]);
+
+ hr = IEnumMediaTypes_Next(enum1, 3, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 2, "Got count %u.\n", count);
+ if (count > 0) CoTaskMemFree(mts[0]);
+ if (count > 1) CoTaskMemFree(mts[1]);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 5);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 4);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, audioW, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ for (i = 0; i < 3; ++i)
+ {
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine_if(i) ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK) CoTaskMemFree(mts[0]->pbFormat);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+ }
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ for (i = 0; i < 3; ++i)
+ {
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ todo_wine_if(i) ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine_if(i) ok(count == 1, "Got count %u.\n", count);
+ if (hr == S_OK) CoTaskMemFree(mts[0]->pbFormat);
+ if (hr == S_OK) CoTaskMemFree(mts[0]);
+ }
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 2, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+ if (count > 1) CoTaskMemFree(mts[1]->pbFormat);
+ if (count > 1) CoTaskMemFree(mts[1]);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ todo_wine ok(count == 1, "Got count %u.\n", count);
+ if (count) CoTaskMemFree(mts[0]->pbFormat);
+ if (count) CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 4);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 3);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IFilterGraph2_Release(graph);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+}
+
START_TEST(mpegsplit)
{
CoInitialize(NULL);
@@ -820,6 +1007,7 @@ START_TEST(mpegsplit)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
CoUninitialize();
}
diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c
index 0b9ea3ff873..5b03a04e4e6 100644
--- a/dlls/quartz/tests/videorenderer.c
+++ b/dlls/quartz/tests/videorenderer.c
@@ -428,6 +428,50 @@ static void test_media_types(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ IBaseFilter *filter = create_video_renderer();
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
static void test_pin(IPin *pin)
{
IMemInputPin *mpin = NULL;
@@ -494,6 +538,7 @@ START_TEST(videorenderer)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
test_basefilter();
CoUninitialize();
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c
index 9574a2971d2..cb35590df2f 100644
--- a/dlls/quartz/tests/vmr7.c
+++ b/dlls/quartz/tests/vmr7.c
@@ -730,6 +730,51 @@ static void test_media_types(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ WCHAR sink_id[] = {'V','M','R',' ','I','n','p','u','t','0',0};
+ IBaseFilter *filter = create_vmr7(0);
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(vmr7)
{
CoInitialize(NULL);
@@ -741,6 +786,7 @@ START_TEST(vmr7)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
CoUninitialize();
}
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index aeea4142a8b..0a55201f6ad 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -734,6 +734,51 @@ static void test_media_types(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_enum_media_types(void)
+{
+ WCHAR sink_id[] = {'V','M','R',' ','I','n','p','u','t','0',0};
+ IBaseFilter *filter = create_vmr9(0);
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(vmr9)
{
IBaseFilter *filter;
@@ -756,6 +801,7 @@ START_TEST(vmr9)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
CoUninitialize();
}
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c
index 84288c41df5..a0df5ccc9b3 100644
--- a/dlls/quartz/tests/waveparser.c
+++ b/dlls/quartz/tests/waveparser.c
@@ -642,6 +642,124 @@ static void test_media_types(void)
ok(ret, "Failed to delete file, error %u.\n", GetLastError());
}
+static void test_enum_media_types(void)
+{
+ const WCHAR *filename = load_resource(wavefile);
+ IBaseFilter *filter = create_wave_parser();
+ IFilterGraph2 *graph = connect_input(filter, filename);
+ IEnumMediaTypes *enum1, *enum2;
+ AM_MEDIA_TYPE *mts[2];
+ ULONG ref, count;
+ HRESULT hr;
+ IPin *pin;
+ BOOL ret;
+
+ IBaseFilter_FindPin(filter, sink_name, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IBaseFilter_FindPin(filter, source_name, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!count, "Got count %u.\n", count);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 2, mts, &count);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(count == 1, "Got count %u.\n", count);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Clone(enum1, &enum2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 2);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Reset(enum1);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Skip(enum1, 1);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ CoTaskMemFree(mts[0]->pbFormat);
+ CoTaskMemFree(mts[0]);
+
+ IEnumMediaTypes_Release(enum1);
+ IEnumMediaTypes_Release(enum2);
+ IPin_Release(pin);
+
+ IFilterGraph2_Release(graph);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ret = DeleteFileW(filename);
+ ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+}
+
START_TEST(waveparser)
{
CoInitialize(NULL);
@@ -652,6 +770,7 @@ START_TEST(waveparser)
test_find_pin();
test_pin_info();
test_media_types();
+ test_enum_media_types();
CoUninitialize();
}
--
2.22.0
June 28, 2019
[PATCH 2/4] quartz/tests: Add some tests for VMR9 media types.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/vmr9.c | 72 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index d14a9705393..aeea4142a8b 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -663,6 +663,77 @@ static void test_pin_info(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_media_types(void)
+{
+ WCHAR sink_id[] = {'V','M','R',' ','I','n','p','u','t','0',0};
+ IBaseFilter *filter = create_vmr9(0);
+ AM_MEDIA_TYPE *mt, req_mt = {{0}};
+ VIDEOINFOHEADER vih =
+ {
+ {0}, {0}, 0, 0, 0,
+ {sizeof(BITMAPINFOHEADER), 32, 24, 1, 0, BI_RGB}
+ };
+ IEnumMediaTypes *enummt;
+ unsigned int i;
+ HRESULT hr;
+ ULONG ref;
+ IPin *pin;
+
+ static const GUID *subtype_tests[] =
+ {
+ &MEDIASUBTYPE_RGB565,
+ &MEDIASUBTYPE_RGB24,
+ &MEDIASUBTYPE_RGB32,
+ };
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enummt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enummt);
+
+ req_mt.majortype = MEDIATYPE_Video;
+ req_mt.formattype = FORMAT_VideoInfo;
+ req_mt.cbFormat = sizeof(VIDEOINFOHEADER);
+ req_mt.pbFormat = (BYTE *)&vih;
+
+ for (i = 0; i < ARRAY_SIZE(subtype_tests); ++i)
+ {
+ req_mt.subtype = *subtype_tests[i];
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_OK, "Got hr %#x for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i]));
+ }
+
+ req_mt.subtype = MEDIASUBTYPE_RGB8;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ req_mt.subtype = MEDIASUBTYPE_NULL;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ req_mt.subtype = MEDIASUBTYPE_RGB24;
+
+ req_mt.majortype = MEDIATYPE_NULL;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ req_mt.majortype = MEDIATYPE_Video;
+
+ req_mt.formattype = FORMAT_None;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ req_mt.formattype = GUID_NULL;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IPin_Release(pin);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(vmr9)
{
IBaseFilter *filter;
@@ -684,6 +755,7 @@ START_TEST(vmr9)
test_enum_pins();
test_find_pin();
test_pin_info();
+ test_media_types();
CoUninitialize();
}
--
2.22.0
June 28, 2019
[PATCH 1/4] quartz/tests: Add some tests for VMR7 media types.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/tests/vmr7.c | 70 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c
index e702be70609..9574a2971d2 100644
--- a/dlls/quartz/tests/vmr7.c
+++ b/dlls/quartz/tests/vmr7.c
@@ -661,6 +661,75 @@ static void test_pin_info(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+static void test_media_types(void)
+{
+ WCHAR sink_id[] = {'V','M','R',' ','I','n','p','u','t','0',0};
+ IBaseFilter *filter = create_vmr7(0);
+ AM_MEDIA_TYPE *mt, req_mt = {{0}};
+ VIDEOINFOHEADER vih =
+ {
+ {0}, {0}, 0, 0, 0,
+ {sizeof(BITMAPINFOHEADER), 32, 24, 1, 0, BI_RGB}
+ };
+ IEnumMediaTypes *enummt;
+ unsigned int i;
+ HRESULT hr;
+ ULONG ref;
+ IPin *pin;
+
+ static const GUID *subtype_tests[] =
+ {
+ &MEDIASUBTYPE_NULL,
+ &MEDIASUBTYPE_RGB565,
+ &MEDIASUBTYPE_RGB24,
+ &MEDIASUBTYPE_RGB32,
+ };
+
+ IBaseFilter_FindPin(filter, sink_id, &pin);
+
+ hr = IPin_EnumMediaTypes(pin, &enummt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IEnumMediaTypes_Release(enummt);
+
+ req_mt.majortype = MEDIATYPE_Video;
+ req_mt.formattype = FORMAT_VideoInfo;
+ req_mt.cbFormat = sizeof(VIDEOINFOHEADER);
+ req_mt.pbFormat = (BYTE *)&vih;
+
+ for (i = 0; i < ARRAY_SIZE(subtype_tests); ++i)
+ {
+ req_mt.subtype = *subtype_tests[i];
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_OK, "Got hr %#x for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i]));
+ }
+
+ req_mt.subtype = MEDIASUBTYPE_RGB8;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ req_mt.subtype = MEDIASUBTYPE_RGB24;
+
+ req_mt.majortype = MEDIATYPE_NULL;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ req_mt.majortype = MEDIATYPE_Video;
+
+ req_mt.formattype = FORMAT_None;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ req_mt.formattype = GUID_NULL;
+ hr = IPin_QueryAccept(pin, &req_mt);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+
+ IPin_Release(pin);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(vmr7)
{
CoInitialize(NULL);
@@ -671,6 +740,7 @@ START_TEST(vmr7)
test_enum_pins();
test_find_pin();
test_pin_info();
+ test_media_types();
CoUninitialize();
}
--
2.22.0
June 28, 2019
[PATCH 5/5] wined3d: Use Windows 7 as fallback driver version in wined3d_driver_info_init().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/directx.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 7202a907ab1..72c3de98a95 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -609,10 +609,10 @@ void wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
break;
default:
- FIXME("Unhandled OS version %u.%u, reporting 2000/XP.\n",
+ FIXME("Unhandled OS version %u.%u, reporting Windows 7.\n",
os_version.dwMajorVersion, os_version.dwMinorVersion);
- driver_os_version = 6;
- driver_model = DRIVER_MODEL_NT5X;
+ driver_os_version = 8;
+ driver_model = DRIVER_MODEL_NT6X;
break;
}
}
--
2.11.0
June 27, 2019